2014-12-19 3 views
1

Как создать матрицу структур или матрицу указателей на структуры? Элементами в матрице a должны быть структуры типа Area.Матрица структур в C

Вот что я пытался до сих пор:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

typedef struct { 
    char type_toy[20]; 
    int nr; 
    char town[20]; 
    char direction; 
} Area; 

void AllocMatrix(int N, int M, Area** a) { 
    int i; 
    a = malloc(N * sizeof(Area *)); 
    for (i = 0; i < N; i++) { 
    a[i] = calloc(M, sizeof(Area*)); 
    } 
} 

int main() { 
    int N, M; 
    Area** a; 
    printf("N = ..., M = ..."); 
    scanf("%d %d", &N, &M); 
    AllocMatrix(N, M, a); 

    for (i = 0; i < N; i++) { 
    for (j = 0; j < M; j++) { 
     scanf ("%s", &a[i][j].town); 
     scanf ("%s", &a[i][j].type_toy); 
     scanf ("%d", &a[i][j].nr); 
     scanf ("%s", &a[i][j].direction); 
    } 
    } 
    return 0; 
} 
+1

вам нужно 'а [я] = calloc (M, SizeOf (Area)); 'поскольку вы выделяете память для' M'-матриц в строке 'i'-th – vsoftco

+0

Очень часто в C стоит представлять матрицы как одномерные массивы (возможно, как конечный * гибкий элемент массива * некоторых' struct') и получить к ним доступ, например макрос '#define matrix_at (m, i, j) m [(i) * width + (j)]' –

ответ

3

недействительным AllocMatrix (Int N, Int M, Area ** а) {

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

Далее,

а [I] = calloc (М, SizeOf (Площадь *));

должен быть sizeof(Area), и если применяется моя первая точка, она должна быть (*a)[i] =

+0

хороший улов с тройным указателем, +1! – vsoftco

+0

У меня также есть предупреждение при компиляции: format '% s' ожидает аргумент типа 'char *', аргумент buet 2 имеет тип 'char (*) [20]' [-Wformat =] scanf ("% s", & а [I] [J] .town); ^ –

+0

@ VladŞtefanDieaconu удалить '&' –

1

Вот простой вариант, если вам не требуется иметь функцию:

scanf("%d %d", &N, &M); 

Area (*a)[M] = calloc(N, sizeof *a); 

и остальная часть вашего кода такая же. Было бы хорошо, чтобы проверить, прежде чем делать M > 0malloc, а также проверить, что malloc не возвращает NULL перед продолжением,


Также ваши scanfs неверны:

  • "%s""%19s" должно быть, чтобы предотвратить переполнение буфера
  • & не должен быть включен для %s, это потому, что %s ожидает указатель на первый символ, чтобы w rite (не указатель на весь массив), и когда вы используете имя массива, он неявно преобразуется в указатель на первый элемент.
  • char direction; должны иметь "%c"
+0

Спасибо. Он работает сейчас. –

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