|
структуры, доступ к полям |
|
|
|
Feb 8 2015, 10:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
вот у нас структура, через typedef Код typedef struct abc_s { int aa; int bb; } abc_t; создаю переменную этого типа Код abc_t abc; дальше, хочу присвоить значение полю aa в моей переменной Код abc.aa = 8; выдает ошибку. Почему? И как правильно? а затолкав в ф-ю - все нормально. Т.е. вне ф-ии нельзя, получается, проводить начальную инициализацию?
|
|
|
|
|
Feb 8 2015, 12:16
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Метценгерштейн @ Feb 8 2015, 15:14)  нельзя одно поле инициализировать вне ф-ии. Можно только всю структуру пачкой. Можно! Это GNU-расширение стандарта. Нужно использвать компилятор, это умеющий, например, gcc: CODE static struct mtd_partition myboard_nand_partitions[] = { /* All the partition sizes are listed in terms of NAND block size */ { .name = "xloader-nand", .offset = 0, .size = 4*(SZ_128K), .mask_flags = MTD_WRITEABLE }, { .name = "uboot-nand", .offset = MTDPART_OFS_APPEND, .size = 14*(SZ_128K), .mask_flags = MTD_WRITEABLE }, { .name = "params-nand", .offset = MTDPART_OFS_APPEND, .size = 2*(SZ_128K) }, { .name = "linux-nand", .offset = MTDPART_OFS_APPEND, .size = 40*(SZ_128K) }, { .name = "jffs2-nand", .size = MTDPART_SIZ_FULL, .offset = MTDPART_OFS_APPEND, }, };
|
|
|
|
|
Feb 8 2015, 17:20
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(SM @ Feb 8 2015, 20:14)  Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде struct abc_s *next_item; и никто это не обругал. Попробовал. Не получается. Но и имя структуры тоже не помогает. Нужно саму структуру определить. А, нет, получилось (в обоих вариантах). Когда struct перед типом добавил. Код typedef struct { __IO uint8_t A; __IO uint8_t B; uint16_t RES; // bool a; struct Dev_t *pDev; } Dev_t;
|
|
|
|
|
Feb 8 2015, 17:35
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(ViKo @ Feb 8 2015, 20:20)  Попробовал. Не получается. Все получается: Код typedef struct _abc_s { int a; int b; struct _abc_s *next; } ABC_S, *PABC_S; а вот запись struct ABC_S *next; (вместо struct _abc_s *next;) по логике не совсем корректна, так как ABC_S определен через typedef, а не через сам struct. По крайней мере, не красива, если даже и корректна по стандарту (я тут не уверен).
|
|
|
|
|
Feb 8 2015, 17:41
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(ViKo @ Feb 8 2015, 20:39)  И я не понимаю причин, почему бы оно не должно работать. Не может оно работать. ВНЕ ФУНКЦИЙ (где объявляют глобальные переменные) нельзя писать отдельное присваивание, как это пытался сделать ТС, а можно только инициализатор. А внутри функции и у автора темы все работает, о чем он и написал. то есть, подробно, на примере: Код typedef struct abc_s { int aa; int bb; } abc_t;
abc_t abc; abc.aa = 8; // это неправильно, это ошибка, описанная в первом сообщении.
abc_t abc1 = { .aa=8 }; // это правильно, это инициализатор.
void main(void) { abc.aa = 8; // и это правильно, так как в функции }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|