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 が返されます。誰か提案はありますか?

4

4 に答える 4

1

古典的なオビ ワン エラー (オフバイワン)。あなたがする必要があります:

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

(編集済み、以前の投稿は範囲外の配列アクセスを引き起こしていました)

于 2011-02-10T16:57:49.873 に答える
1

あなたのコードはうまくいくようです...

Fib(2) に 3 つの数値を出力させたい場合は、おそらく次の行を見たいと思うでしょう:

while(counter < mem->sequence_size) {

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

これが意味をなさない場合は、MIN_SEQUENCE0 に設定し、 を計算するときにコードが何をするか自問してくださいFib(0)

于 2011-02-10T16:58:28.303 に答える
1

あなたのコードに従って、シーケンスサイズはあなたが渡すパラメータに設定されています

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

while ループでは、次のように正しくチェックしています。

while(counter < mem->sequence_size).

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

于 2011-02-10T16:58:59.067 に答える
0

counternumber 個のアイテムを印刷しています。つまり、counter == 2 の場合は 2 つの数値を出力し、counter == 0 の場合はゼロの数値を出力します。

于 2011-02-10T17:06:11.640 に答える