简体   繁体   中英

Fibonacci Sequence

#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;
}

Ok, I have this program that I've been working on for a while now, the problem is that the sequence of numbers are off by 1 and I can not seem to find where it is. It's not printing the 0 for fib(0). So when I do Fib(2) it gives me 0 1 instead of 0 1 1, anyone have any suggestions?

A classical Obi Wan error (off-by-one). You need to do:

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

(Edited, the previous posting was causing out-of-bounds array access)

Your code seems to work...

If you want Fib(2) to print out three numbers, you'll probably want to look at this line:

while(counter < mem->sequence_size) {

If you do that however, you need to note that you will need 11 pieces of memory to calculate Fib(10). You currently would only give yourself 10 pieces of memory.

If this doesn't make sense, then set MIN_SEQUENCE to 0, and ask yourself what your code does when you calculate Fib(0) .

As per your code, the sequence size is set to the parameter you are passing

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

And in the while loop you are checking correctly as:

while(counter < mem->sequence_size) .

So Fib 2 should be printing only 2 elements 0 1 from the fibonacci sequence. If you need the output of 0 1 1 then wouldn't you be running the program as fib 3 ?

You are printing counter number of items. ie, when counter == 2, you are printing two numbers, and when counter == 0 you are printing zero numbers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM