Для проекта в классе Parallel Computing мне нужно реализовать параллельную версию Game of Life.Проблемы с ошибками сегментации в реализации игры жизни
Я использую функцию, написанную автором моего учебника под названием «read_row_stripped_matrix». Эта функция считывает входные данные из файла, который содержит количество строк в матрице, количество столбцов в матрице и данные в матрице.
Функция устанавливает двумерную матрицу, выделяя одномерный массив, называемый «хранилищем», который содержит все данные матрицы. Каждая строка из двухмерных матриц указывает на первый элемент в хранилище, как на этой картинке:
Мы должны очистить код функции, так что он подходит с нашим гидом в стиле C. Поэтому я очистил несколько вещей, чтобы было более понятно.
Проблема, с которой я столкнулся, возникает с указанием каждой строки в матрице на ее первый элемент в хранилище. Я получаю ошибку сегментации во время подключения этих указателей, в частности, в данном разделе функции:
/* Dynamically allocate matrix. Allow double subscripting
through 'a'. */
*storage = my_malloc (id, local_rows * *n * sizeof(int));
*subs = my_malloc (id, local_rows * PTR_SIZE);
for (i = 0; i < local_rows; i++) {
*subs[i]=&(*storage[i * *n]);
}
Что меня озадачивает, что я уверен, что я выделил достаточно памяти для массива. В примере, который я тестирую, * m и * n равно 5, а local_rows равно 5. Поэтому я выделяю 25 * sizeof (int) для хранения, которое должно быть достаточным для хранения всех элементов для матрицы 5x5.
Это функция my_malloc, которая mallocs для конкретного процессора:
/*
* Function 'my_malloc' is called when a process wants
* to allocate some space from the heap. If the memory
* allocation fails, the process prints an error message
* and then aborts execution of the program.
*/
void* my_malloc (
int id, /* IN - Process rank */
int bytes) /* IN - Bytes to allocate */
{
void *buffer;
if ((buffer = malloc ((size_t) bytes)) == NULL) {
printf ("Error: Malloc failed for process %d\n", id);
fflush (stdout);
MPI_Abort (MPI_COMM_WORLD, MALLOC_ERROR);
}
return buffer;
}
Я честно найти указатели запутанным, так что простите меня, если этот вопрос очевиден. Я работаю над этим дольше, чем должен, поэтому мой мозг, вероятно, жарится.
Если вам нужно больше кода, не стесняйтесь спрашивать.
Пожалуйста, прочитайте, как создать [Minimal, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – OldProgrammer
Простите, я отредактирую это и сделаю его более читаемым. –
Хорошо, я думаю, это немного лучше. –