Инициализация матричной переменной в структуре C - PullRequest
2 голосов
/ 31 марта 2019

У меня есть следующая структура:

struct transform {
    double A[4][4];
};

Я знаю Я могу инициализировать всю структуру следующим образом:

struct transform myTransform;
myTransform = (struct transform){{{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}}};

Но почему я не могусделать следующее?

struct transform secondTransform;
secondTransform.A = {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}};

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

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

Редактировать: я использую стандарт C99 для моего проекта.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

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

Однако вы можете инициализировать структуру без явной инициализации всех членов.Это делается с помощью назначенного инициализатора .

struct transform {
    double A[4][4];
    int b;
    char *c;
};

struct transform t = { .A = {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}}, .b = 5 };

Любое поле, не инициализированное явным образом, - это implicity, инициализируемое в 0 или NULL, в зависимости от типа.

0 голосов
/ 31 марта 2019

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

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