Последовательность Фибоначчи - PullRequest
0 голосов
/ 10 февраля 2011
#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, и я не могу найти, где она находится. Он не печатает 0 для fib (0). Поэтому, когда я делаю Fib (2), он дает мне 0 1 вместо 0 1 1, у кого-нибудь есть какие-либо предложения?

Ответы [ 4 ]

1 голос
/ 10 февраля 2011

Ваш код, кажется, работает ...

Если вы хотите, чтобы Fib (2) распечатал три числа, вы, вероятно, захотите взглянуть на эту строку:

while(counter < mem->sequence_size) {

Однако, если вы сделаете это, вы должны заметить, что вам потребуется 11 единиц памяти для вычисления Fib (10).В настоящее время вы бы дали себе только 10 единиц памяти.

Если это не имеет смысла, тогда установите MIN_SEQUENCE на 0 и спросите себя, что делает ваш код при вычислении Fib(0).

1 голос
/ 10 февраля 2011

Согласно вашему коду, размер последовательности установлен на передаваемый вами параметр

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

И в цикле while вы проверяете правильно как:

while(counter < mem->sequence_size).

Таким образом, Fib 2 должен печатать только 2 элемента 0 1 из последовательности Фибоначчи. Если вам нужен вывод 0 1 1, вы не будете запускать программу как fib 3?

1 голос
/ 10 февраля 2011

Классическая ошибка Оби-Вана (по одному). Вам нужно сделать:

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

(отредактировано, предыдущая публикация вызывала доступ к массиву вне границ)

0 голосов
/ 10 февраля 2011

Вы печатаете counter количество позиций. то есть, когда счетчик == 2, вы печатаете два числа, а когда счетчик == 0, вы печатаете нулевые числа.

...