2011-02-10 10 views
0
#define MAX_SEQUENCE 10 // Max values to store in shared memory 
#define MIN_SEQUENCE 2 // Min value the user can enter 

//shared memory: 
// 1) holds an array of numbers 
// 2) holds how many numbers are in the array 
typedef struct { 
    int fib_seq[MAX_SEQUENCE]; 
    int sequence_size; 
} shared_data; 

//MAIN function 
int main(int argc, char *argv[]) { 

    pid_t pid; //process ID 
    int segment_id; //Shared Memory ID 
    shared_data *mem; //Shared Memory Pointer 

    //check to validate atleast two arguments 
    if(argc != 2) { 
     printf("USAGE ERROR: [0-9]\n"); 
     exit(0); 
    } 

    //validate the input is not larger then the MAX 
    if(atoi(argv[1]) > MAX_SEQUENCE) { 
     printf("Max Input Size: %d\n", MAX_SEQUENCE); 
     exit(0); 
    } 

    //validate the input is not smaller then the MIN 
    if(atoi(argv[1]) < MIN_SEQUENCE) { 
     printf("Min Input Size: %d\n", MIN_SEQUENCE); 
     exit(0); 
    } 

    // 1) create a new shared memory location 'IPC_PRIVATE' 
    // 2) the size of our shared memory structure 'sizeof(shared_data)' 
    // 3) Set Modes S_IRUSR and S_IWUSR so the owner can read and write to the shared memory 'S_IRUSR|S_IWUSR' 
    segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR|S_IWUSR); 

    //attach the shared memory and get the pointer to the beginning location in memory 
    mem = (shared_data *) shmat(segment_id,NULL,0); 

    //set the size of the sequence to the argument that was passed in via command line 
    mem->sequence_size = atoi(argv[1]); 

    // fork a child process 
    pid = fork(); 

    if(pid < 0) { /* error occured */ 
     fprintf(stderr, "Fork Failed\n"); 
     return 1; 
    } 
    else if(pid == 0) { /* child process */ 
     int counter = 0; 
     printf("Child Fibonacci Sequence: "); 

     while(counter < mem->sequence_size) { 
      if(counter == 0){ 
       //FIB of zero is always zero 
       mem->fib_seq[counter] = 0; 
      } 
      else if(counter == 1){ 
       //FIB of one is always one 
       mem->fib_seq[counter] = 1; 
      } 
      else { 
       //The Fibonacci Sequence formula 'R = fib(n-1) + fib(n-2)' 
       //The first two numbers in the sequence are always 0 and 1. 
       //To get a value in the sequence you will want to take the previous 
       //two numbers and add them together. For example: 
       // b + a = c 
       // [fib(d-1) = c] + [fib(d-2) = b] = R 
       // fib(0) = 0 
       // fib(1) = 1 
       // fib(2): 1 + 0 = 1 
       // fib(3): 1 + 1 = 2 
       // fib(4): 2 + 1 = 3 
       // fib(5): 3 + 2 = 5 
       // The next Fibonacci number in the sequence will be '8' 
       mem->fib_seq[counter] = mem->fib_seq[counter - 1] + mem->fib_seq[counter - 2]; 
      } 
      printf("%d ", mem->fib_seq[(counter)]); 
      counter++; 
     } 
    } 
    else { /* parent process */ 

     /* parent will wait for the child process to complete */ 
     wait(NULL); 

     //Print out shared memory 
     int count = 0; 
     printf("\nParent Fibonacci Sequence: "); 
     while(count < mem->sequence_size){ 
      printf("%d ", mem->fib_seq[count]); 
      count++; 
     } 

     //detach shared memory 
     shmdt(mem); 
     //remove shared memory segment 
     shmctl(segment_id,IPC_RMID,NULL); 
     printf("\nComplete\n"); 
    } 

    return 0; 
} 

私はこのプログラムをしばらくはやっていますが、問題は数字の順番が1だけずれていて、どこにあるのか分からないようです。 fib(0)の0は表示されません。だから、私はFib(2)をすると、0 1 1の代わりに0 1が返されます。フィボナッチシーケンス

+6

はい!デバッガを使用して一度に1行ずつコードをステップ実行して、その動作が期待どおりにどこからずれているかを把握します。 –

答えて

1

古典的なObi Wanのエラー(off-by-one)。あなたは実行する必要があります。

mem->sequence_size = atoi(argv[1]) + 1; 

(前回の投稿が範囲外の配列アクセスを引き起こした、編集)

+0

'<'を '<='に変更しても、プログラムが 'MAX_SEQUENCE'をパラメータとして実行するとエラーになりますか? – yasouser

+0

それでも、それでも正しいわけではありませんが、とにかく配列を動的に作成しているわけではありません;-) – DarkDust

+0

@ anand.arumug:はい、私は何とか正しいサイズを割り当てる代わりに固定サイズの配列を使用しています。 – DarkDust

1

あなたのコードが動作しているようです...

あなたがのFibをしたい場合(2)3つの数字をプリントアウトするために、あなたはおそらく、この行を見てみたいと思うでしょう:

while(counter < mem->sequence_size) { 

あなたは、しかし、あなたが11パイを必要とすることに注意する必要があることを行う場合Fib(10)を計算するためのメモリの数。あなたは現在自分自身に10個のメモリしか与えません。

これが意味をなさない場合は、MIN_SEQUENCEを0に設定し、Fib(0)を計算するときにコードが何をするかを尋ねます。あなたのコードを1として

1

、シーケンスのサイズは、あなたが

mem->sequence_size = atoi(argv[1]);

そして、あなたのように正しくチェックされているwhileループに渡しているパラメータに設定されています:

while(counter < mem->sequence_size)を。

したがって、Fib 2はフィボナッチ配列から2つの要素0 1のみを印刷する必要があります。 0 1 1の出力が必要な場合は、fib 3としてプログラムを実行していませんか?

+0

質問は、引数はどういう意味ですか? '2'はフィボナッチ数が2つであることを意味するのか、' 'fib(2)'が欲しいという意味ですか?前者の場合、あなたの答えは正しいが、後では答えられない。 – DarkDust

+0

これは私が話していた古典的なオフバイ・ワンの問題です。 AKAフェンスポスト問題。あなたはフェンスポストやそれらの間のスペースを数えますか? – DarkDust

0

counter個のアイテムが印刷されています。つまり、counter == 2のときは2つの数字を出力し、counter == 0のときは数字を出力します。

関連する問題