2014-10-09 4 views
1

Как я могу инициализировать элемент в структуре? Я имею эту структуру:Инициализация переменной матрицы в структуре C

typedef struct { int mat[x][x]; int res; } graphe; 
graphe g; 

я ожидал, чтобы это работало:

g.mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}}; 

, но это не так.

+0

Вам нужно будет уточнить, что «не работает». – 0x499602D2

+0

Похоже, вы имели в виду: 'g.mat = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}};'. То есть другой набор фигурных скобок для инициализации массива. – 0x499602D2

+0

Назначение и инициализация - это разные понятия в C. Вы не инициализируетесь, а назначаете. –

ответ

2

Основная проблема заключается в том, что массивы не назначаются, и к тому моменту, когда вы хотите установить g.mat, он уже был инициализирован по умолчанию. То, что вы пытаетесь, должно присвоить значениям существующего экземпляра значениям. Еще одна проблема - некоторые отсутствующие фигурные скобки.

Вместо умолчанию инициализация g, а затем пытается назначить значения своих членов, вы можете инициализировать на graphe объект с заданными значениями для членов:

graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}}; 

Это также неявно инициализировать g.res к 0, но вы также можете инициализировать его конкретное значение:

graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}, 42}; 

Вот пример использования designated initializers. Это может быть легче читать, чем в предыдущих примерах, и вы можете изменить порядок полей:

graphe g = { .mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}}, .res = 42}; 
+0

Теперь он работает благодаря –

1

Вы можете инициализировать ваш g в точке определения, как показано в ответ @ juanchopanza в.

Однако, вы можете также присвоить новое значение g позже (в случае необходимости), используя такой же синтаксис, в сочетании с соединением буквального особенностью языка C

g = (graphe) { { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, 42 }; 

Заметим, что оператор присваивания будет работать только для всего объекта структуры. Если вы хотите присвоить новое значение только массиву g.mat, не касаясь каких-либо других полей g, тогда оператор присваивания не будет работать для этой цели, поскольку массивы в C не могут быть назначены. Тем не менее, вы все еще можете использовать memcpy в сочетании с соединением буквальным, чтобы скопировать новые значения в g.mat

memcpy(g.mat, (int [x][x]) { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, sizeof g.mat); 

Это на самом деле то, что вы пытались сделать в вашем вопросе.

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