Инициализация переменной матрицы в структуре C

#c #struct #initialization

#c #структура #инициализация

Вопрос:

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

 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 для своего проекта.

Комментарии:

1. Потому что этот синтаксис будет работать только тогда, когда переменная определена — даже если это может показаться логичным.

2. @WeatherVane Но это определено в struct transform , не так ли?

3. secondTransform.A = это не определение, это присвоение, и правила синтаксиса говорят «нет».

Ответ №1:

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

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

 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 };
  

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

Комментарии:

1. Назначенный инициализатор. Это именно то, что я потратил 45 минут на поиск в Google. Спасибо!

Ответ №2:

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

Комментарии:

1. Так это тот случай, когда «никто не подумал добавить это в стандарт C»?