2015-03-09 3 views
1

Для проекта в классе Parallel Computing мне нужно реализовать параллельную версию Game of Life.Проблемы с ошибками сегментации в реализации игры жизни

Я использую функцию, написанную автором моего учебника под названием «read_row_stripped_matrix». Эта функция считывает входные данные из файла, который содержит количество строк в матрице, количество столбцов в матрице и данные в матрице.

Функция устанавливает двумерную матрицу, выделяя одномерный массив, называемый «хранилищем», который содержит все данные матрицы. Каждая строка из двухмерных матриц указывает на первый элемент в хранилище, как на этой картинке:

enter image description here

Мы должны очистить код функции, так что он подходит с нашим гидом в стиле 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; 
} 

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

Если вам нужно больше кода, не стесняйтесь спрашивать.

+1

Пожалуйста, прочитайте, как создать [Minimal, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – OldProgrammer

+0

Простите, я отредактирую это и сделаю его более читаемым. –

+0

Хорошо, я думаю, это немного лучше. –

ответ

2

Во-первых, вы делаете это:

*subs = my_malloc (id, local_rows * PTR_SIZE); 

Затем вы делаете это:

*subs[i]=&(*storage[i * *n]); 

Довольно уверен, что это ваша проблема, прямо там. Смотрит на меня, как это должно быть действительно:

(*subs)[i]=&(*storage[i * *n]); 
+0

возможно '(* хранение) [i * * n]' также –

+0

Yup. Это тоже. Кажется очевидным. –

+0

Хорошо, я попробую это. Но почему вы помещаете круглые скобки вокруг * subs из любопытства? Спасибо за вашу помощь. –

Смежные вопросы