Массив как часть структуры - PullRequest
0 голосов
/ 23 сентября 2018

Я довольно новичок в C и у меня возникли проблемы с использованием массива как части структуры.У меня есть структура, определенная следующим образом:

typedef struct
{
 int row;
 int col;
 int * puzzle[5][5]
} data;

Позже в функции я пытаюсь использовать эту структуру следующим образом:

void foo(int grid[5][5])
{
 data *puz = (data *)malloc(sizeof(data));
 puz->row = 3;
 puz->col = 2;
 puz->puzzle = grid;  // causes an error
 }

Последнее утверждение приводит к присвоению ошибки "в выражение с типом массива ".Я понимаю, что это как-то связано со структурой данных знака равенства и массива, но я не уверен, как решить эту проблему.Любая помощь очень ценится.Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

This ...

    int * puzzle[5][5]

... объявляет puzzle как массив из 5 массивов из 5 указателей на int каждый.В разговорной речи мы чаще называем такую ​​вещь массивом 5 x 5, но главное, что вы должны оценить, это то, что базовый тип скалярного элемента является типом указателя.Это не соответствует скалярному типу элемента (int) параметра функции foo, и в любом случае вряд ли это то, что вы хотите.(Обратите внимание, что в вашем коде пропущена необходимая точка с запятой после объявления этого члена.)

Вероятно, вместо этого элемент структуры должен быть объявлен как ...

int puzzle[5][5];

... т.е.2D массив int.C не имеет назначения целого массива, поэтому в этом случае вам нужен другой способ скопировать параметр функции в новую структуру.Вы можете написать набор вложенных циклов, но проще использовать memcpy():

memcpy(&puz->puzzle, grid, sizeof(puz->puzzle));

В том маловероятном случае, когда ваша структура будет содержать указатель на массив, тогдаВы можете объявить его как

int (*puzzle)[5];

или

int (*puzzle)[5][5];

или даже

int *puzzle;

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

0 голосов
/ 23 сентября 2018

Я думаю, вам следует вызвать функцию с указателем на массив и соответствующим образом изменить сигнатуру функции.Но если вы хотите скопировать массив, а не указать на него, вы должны выполнить что-то вроде memcpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...