последовательность фибоначчи с использованием общей памяти в C

У меня вопрос решить, но он дает мне ошибки:

2009-EE-182-Part2.c: In function 'main': 2009-EE-182-Part2.c:35:13: error: expected identifier or '(' before '->' token 2009-EE-182-Part2.c:40:22: error: expected identifier or '(' before '->' token 2009-EE-182-Part2.c:41:14: error: expected identifier or '(' before '->' token 2009-EE-182-Part2.c:42:22: error: expected expression before 'shared_data' 2009-EE-182-Part2.c:44:15: error: expected identifier or '(' before '->' token 2009-EE-182-Part2.c:54:15: error: expected expression before 'shared_data' 2009-EE-182-Part2.c:55:19: error: expected expression before 'shared_data' 

Код:

 # include  # include  # include  # include  # include  # define MAX_SEQUENCE 10 typedef struct{ long fib_sequence[MAX_SEQUENCE]; int sequence_size; } shared_data; char* shared_memory; /* a pointer to the shared memory segment */ int main() { int a,b,m,n,i,j; a=0; b=1; printf("Enter the number of a Fibonacci Sequence:\n"); scanf("%d", &m); if (m  MAX_SEQUENCE) printf("Please enter an integer less than 10\n"); int segment_id; /* the identifier for the shared memory segment */ int segment_size = sizeof(shared_data); /* the size (in bytes) of the shared memory segment */ segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR); /** allocate a shared memory segment */ shared_data *shared_memory = shmat(segment_id, NULL, 0); /** attach the shared memory segment */ printf("\nshared memory segment %d attached at address %p\n", segment_id, shared_memory); shared_data->sequence_size = m; pid_t pid; pid = fork(); if (pid == 0){ printf("Child is producing the Fibonacci Sequence...\n"); shared_data->fib_sequence[0] = a; shared_data->fib_sequence[1] = b; for (i=2;isequence_size;i++){ n=a+b; shared_data->fib_sequence[i] = n; a=b; b=n; } printf("\nChild ends\n"); } else{ printf("Parent is waiting for child to complete...\n"); wait(NULL); printf("Parent ends\n"); for(i=0;isequence_size;i++) printf("%ld ", shared_data->fib_sequence[i]); } /**printf("%s \n", shared_memory); now print out the string from shared memory */ /** now detach the shared memory segment */ if ( shmdt(shared_memory) == -1) { fprintf(stderr, "Unable to detach\n"); } /** now remove the shared memory segment */ shmctl(segment_id, IPC_RMID, NULL); return 0; } 

Утверждение: «Подход к разработке программы фибоначчи заключается в установлении сегмента разделяемой памяти между родительским и дочерним процессами. Этот метод позволяет ребенку записывать содержимое последовательности Фибоначчи в сегмент разделяемой памяти и имеет родительский вывод последовательности когда дочерний элемент завершен. Поскольку память разделена, любые изменения, которые делает ребенок, также будут отражены в родительском процессе. Эта программа будет структурирована с использованием общей памяти POSIX, как описано в http://graphics.im.ntu.edu.tw /~robin/courses/os07/code/03proc/shm-posix.c Эта программа сначала требует создания структуры данных для сегмента разделяемой памяти. Это проще всего выполнить с помощью структуры. Эта структура данных будет содержать два элемента: 1 . Массив фиксированного размера размером MAX_SEQUENCE, который будет удерживать значения Фибоначчи и 2. Размер последовательности, которую должен генерировать дочерний процесс, т.е. sequence_size, где sequence_size ≤ MAX_SEQUENCE.

Эти элементы могут быть представлены в структуре следующим образом:

 # define MAX_SEQUENCE 10 typedef struct{ long fib_sequence[MAX_SEQUENCE]; int sequence_size; } shared_data; 

Родительский процесс будет проходить через следующие шаги: a. Примите параметр, переданный в командной строке, и выполните проверку ошибок, чтобы убедиться, что параметр ≤ MAX_SEQUENCE. б. Создайте сегмент разделяемой памяти размера shared_data. с. Присоедините сегмент разделяемой памяти к его адресному пространству. д. Задайте значение sequence_size для параметра в командной строке. е. Выполните дочерний процесс и вызовите системный вызов wait (), чтобы дождаться завершения дочернего процесса. е. Выведите значение последовательности Фибоначчи в сегменте общей памяти. г. Отсоедините и удалите сегмент разделяемой памяти.

Сегмент разделяемой памяти будет присоединен к адресному пространству ребенка, а также к адресному пространству родителя. Затем дочерний процесс записывает последовательность Фибоначчи в

сегмент разделяемой памяти. Родительский и дочерний процессы должны быть синхронизированы так, чтобы родительский элемент не выводил последовательность Фибоначчи, пока ребенок не завершит создание последовательности. ПРИМЕЧАНИЕ. Отобразите достаточные сообщения на консоли, чтобы сообщить пользователю, когда выполняется определенное действие, например создание и завершение дочернего процесса и т. Д. »

Экспертные умы. Незлая помощь.

Первая проблема:

 int a,b,m,n,i,j; sequence.fib_sequence[0] = a; sequence.fib_sequence[1] = b; 

Вы никогда не инициализируете a и b , вы получаете мусор (и неопределенное поведение). Инициализировать

 a = 0; b = 1; 

Более глубокая проблема: вы настроили сегмент разделяемой памяти, но никогда не используете его. Вы используете глобальный

 shared_data sequence; 

писать в дочерний элемент и читать из родителя. Поскольку этот глобальный не имеет ничего общего с установленной вами общей памятью, действия ребенка не изменяют последовательность родителя.

Вы должны использовать shared_memory , указатель на разделяемую память для записи и чтения. Поэтому вместо char* , это должно быть

 shared_data *shared_memory = shmat(...); 

а затем используйте shared_memory->sequence[i] и т. д.

После исправления shared_data/shared_memory и добавления проверки ошибок программа может выглядеть так:

 # include  # include  # include  # include  # include  # include  # include  # include  // So we could use other sizes without editing the source. #ifndef MAX_SEQUENCE # define MAX_SEQUENCE 10 #endif // Check that MAX_SEQUENCE is large enough! #if MAX_SEQUENCE < 2 #error MAX_SEQUENCE must be at least 2 #endif typedef struct{ long fib_sequence[MAX_SEQUENCE]; int sequence_size; } shared_data; int main() { int a, b, m, n, i; a = 0; b = 1; printf("Enter the number of a Fibonacci Sequence:\n"); // Always check whether input conversion worked if (scanf("%d", &m) != 1) { printf("Invalid input, couldn't be converted.\n"); return EXIT_FAILURE; } if (m <= 0) { printf("Please enter a positive integer\n"); return EXIT_FAILURE; // exit if input is invalid } else if (m > MAX_SEQUENCE) { printf("Please enter an integer less than %d\n", MAX_SEQUENCE); return EXIT_FAILURE; // exit if input is invalid } /* the identifier for the shared memory segment */ int segment_id; /* the size (in bytes) of the shared memory segment */ size_t segment_size = sizeof(shared_data); /* allocate a shared memory segment */ segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR); // Check result of shmget if (segment_id == -1) { perror("shmget failed"); return EXIT_FAILURE; } /* attach the shared memory segment */ shared_data *shared_memory = shmat(segment_id, NULL, 0); // Check whether attaching succeeded if ((void*)shared_memory == (void*)-1) { perror("shmat failed"); goto destroy; // clean up } printf("\nshared memory segment %d attached at address %p\n", segment_id, (void*)shared_memory); shared_memory->sequence_size = m; pid_t pid; pid = fork(); if (pid == 0){ printf("Child is producing the Fibonacci Sequence...\n"); shared_memory->fib_sequence[0] = a; shared_memory->fib_sequence[1] = b; for (i = 2; i < shared_memory->sequence_size; i++){ n = a+b; shared_memory->fib_sequence[i] = n; a = b; b = n; } printf("\nChild ends\n"); } else{ printf("Parent is waiting for child to complete...\n"); wait(NULL); printf("Parent ends\n"); for(i = 0; i < shared_memory->sequence_size; i++) { printf("%ld ", shared_memory->fib_sequence[i]); } printf("\n"); } /* now detach the shared memory segment */ if (shmdt(shared_memory) == -1) { fprintf(stderr, "Unable to detach\n"); } destroy: /* now remove the shared memory segment */ shmctl(segment_id, IPC_RMID, NULL); return 0; }