2016-10-23 10 views
0

実行時に同じファイルに対して合計が異なります。Cフォークとパイプはファイルから数値を追加します

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define MAX_FILE_NAME 100 
#define RUNS 1 

int main() {  
    int num,i; 
    FILE *fp; 
    char*s, buf[1024]; 
    int count =0; 
    char c; 
    char filename[MAX_FILE_NAME]; 
    printf("Enter filename: "); 
    scanf ("%s",filename); 
    if ((fp =fopen(filename, "r")) == NULL) { 
     printf("Error"); 
     exit(1); 
    } 
    fscanf(fp,"%d",&num); 
    for (c = getc(fp); c!= EOF; c = getc(fp)) 
    { 
     if (c == '\n'){ 
      count = count+1; 
     } 
    } 
    printf("%s has %d numbers \n", filename, count); 
    int f; 
    printf("Choose from the options how many processes you want to use [1,2,4]: "); 
    scanf("%i", &f); 
    printf("%i processes \n", f); 
    int fds[f+1][2]; 
    int numb[count]; 
    int x,k; 
    time_t start, finish; 
    start = time(NULL); 

    for(i = 0; i < RUNS; i++) 
    { 
     pipe(fds[f]); 
     for(x = 0; x<f; x++) 
     { 
      pipe(fds[x]); 
      int ind[2]; 
      ind[0] = ((x)*(count/f)); 
      ind[1] = ((x+1)*(count/f)); 
      write(fds[x][1], &ind, 2* sizeof(int)); 
      if (fork() ==0) 
      { 
       int t =0; 
       int ind2[2]; 
       read(fds[x][0], &ind2, 2*sizeof(int)); 
       for(k = ind2[0]; k<ind2[1]; k++) 
       { 
        t += numb[k]; 
       } 
       write(fds[f][1], &t, sizeof(int)); 
       exit(0); 
      } 
     } 
     int m, tmp, total; 
     total = 0; 
     for(m = 0; m < f; m++) 
     { 

     for(m = 0; m < f; m++) 
     { 
      read(fds[f][0], &tmp, sizeof(int)); 
      sleep(5); 
      total += tmp; 
     } 
     printf("DOne calc \n"); 
     printf("Total: %i \n", total); 
    } 
    finish = time(NULL); 
    float runtime = (float)((finish-start)/RUNS); 
    printf("runtime: %f \n", runtime); 
    fclose(fp); 
    return 0; 
} 
+1

あなたは '(M = 0メートル++; M mch

+2

これはC#ではありません。 –

+0

スタックオーバーフローへようこそ。まもなく、[About]と[Ask]ページをお読みください。 MCVE([MCVE])をより緊急に作成する方法についてもお読みください。あなたはMCVE基準の一部、つまりいくつかのコードを満たしています。入力として使用されるデータファイルや出力として期待されるもの、出力として得られるものについての説明はありません。正式な質問(疑問符を入力した場所はありません)はありません。だから、あなたはまだ質問をしていない。私たちは疑問のないことには答えないでしょう。 –

答えて

1

計算が初期化されていないint numb[count];値に基づくので、あなたは、同じ入力に対してランダムな結果を得ることができます。

C99規格、セクション6.7.8.10によれば、自動記憶域期間を持つオブジェクトを明示的に初期化されていない場合

、その値は不定です。

のため、int numb[count];にはメモリからのランダムなジャンクが含まれています。取得するには、予測結果は、明示的な初期化を使用します。

#include <string.h> // memset 

int numb[count]; 
memset (numb, 0, sizeof(numb)); // Zero-fills 

numbfilenameファイルから数字を入れて怒鳴るのコードを使用します。

int i = 0; 
char line[1024]; 
fseek(fp, 0, SEEK_SET); 
while(fgets(line, sizeof(line), fp)) 
{ 
    if(sscanf(line, "%d", &numb[i]) == 1) // One number per line 
    { 
    ++i; 
    } 
} 
+0

私が推奨するように初期化しようとしたとき、それは私にこれを与えました int numb [count] = {0}; fork.c:42:5:warning:配列初期化子の余分な要素[デフォルトで有効] fork.c:42:5:警告:(デフォルトで有効になっています) –

+0

@AjayaShrestha私の誤りは、可変サイズの配列は '= {0}'で初期化できません。回答が更新されました。 – Nikita

+0

sizeofのsizeofがあなたの望みどおりに動作することは確かですか?私は 'sizeof * numb * count'で置き換えます。 – Stargateur

関連する問題