Я пытаюсь выполнить задание для разреженных матриц в C. У меня есть разреженная матрица в виде списка значений и координат, и я преобразовываю ее в формат Yale.
Я столкнулся со странной проблемой выделения памяти, которую, похоже, никто раньше не видел. Мой код:
yale* convertMatrix(matrix_list* input){
int matrix_elements = input->elements;
int matrix_rows = input->m;
yale* yale = (struct y*)calloc(1, sizeof(yale));
int* A = (int*)calloc(matrix_elements, sizeof(int));
int* IA = (int*)calloc(matrix_rows + 1, sizeof(int));
int* JA = (int*)calloc(matrix_elements, sizeof(int));
printf("%d elements\n",matrix_elements);
yale->A = A; // Value
yale->IA = IA; // Row (X)
yale->JA = JA; // Column (Y)
yale->elements = matrix_elements;
yale->m = matrix_rows;
yale->n = input->n;
list* tmp_list = input->first;
for(int i = 0, j = 0, tmp_y = 0; i < matrix_elements && tmp_list!=NULL; i++){
printf("Input Value: %d \n",tmp_list->point.value);
A[i] = tmp_list->point.value;
// Initialise the first row
if(i == 0) IA[0] = tmp_list->point.x;
else{
// Add a new row index
if(tmp_y != tmp_list->point.x){
j++;
IA[j] = i;
tmp_y = tmp_list->point.x;
}
}
JA[i] = tmp_list->point.y;
tmp_list = tmp_list->next;
}
for(int i = 0; i < matrix_elements; i++)
printf("%d,",yale->A[i]);
printf("\n");
for(int i = 0; i < matrix_rows + 1; i++)
printf("%d,",yale->IA[i]);
printf("\n");
for(int i = 0; i < matrix_elements; i++)
printf("%d,",yale->JA[i]);
return yale;
}
А вот структура для Йельского университета:
typedef struct y{
int n;
int m;
int elements;
int *IA;
int *JA;
int *A;
} yale;
Но программа выдает ошибку при первом соответствующем printf на первой итерации цикла.
printf("%d,",yale->A[i]);
Я уверен:
matrix_elements - целое число (9 в моем тестовом примере)
matrix_rows является целым числом
Все A / IA / JA заполнены правильными значениями (если вы поменяете yale-> A на A в printf, все будет работать нормально).
Непосредственная привязка массива к указателям на структуру не влияет на результат.
Неразборчивость, выговор, не типизирование, все безрезультатно.
Благодаря Xcode и gdb я также могу увидеть это в точке segfault. Указатели структуры делают НЕ , кажется, указывают на массивы