gpt4 book ai didi

c - 斐波那契数列

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:18 25 4
gpt4 key购买 nike

#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 而不是 0 1 1,有人有什么建议吗?

最佳答案

经典的 Obi Wan 错误(差一)。你需要做的:

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

(已编辑,之前的帖子导致越界数组访问)

关于c - 斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com