реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> структуры, доступ к полям
Метценгерштейн
сообщение Feb 8 2015, 10:08
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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;

выдает ошибку. Почему? И как правильно?

а затолкав в ф-ю - все нормально. Т.е. вне ф-ии нельзя, получается, проводить начальную инициализацию?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 10:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



правильно вот так:

abc_t abc = {8,9}; // по стандарту

abc_t abc = {.aa=8}; // GNU расширение - красиво, можно выборочно инициализировать, но не каждый компилятор съест.

Использовать операторы можно исключительно в теле функций. Вне функций (при объявлении глобальных переменных) можно применять только их инициализацию, указывая "=" только при самом объявлении переменной.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 8 2015, 11:31
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Метценгерштейн @ Feb 8 2015, 14:08) *
выдает ошибку. Почему? И как правильно?

Ни о чем. Кто выдает? Какую ошибку?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 8 2015, 12:14
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



я разобрался. нельзя одно поле инициализировать вне ф-ии. Можно только всю структуру пачкой.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 12:16
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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,
},
};

Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 8 2015, 12:40
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(SM @ Feb 8 2015, 19:16) *
Можно! Это GNU-расширение стандарта. Нужно использвать компилятор, это умеющий, например, gcc:

Это давно уже стандарт, но только для С, в стандарт С++ (вроде бы) пока ещё не внесли.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 12:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(SSerge @ Feb 8 2015, 15:40) *
Это давно уже стандарт

И, действительно, в ISO/IEC 9899:1999 уже есть... Не знал.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2015, 17:03
Сообщение #8


Универсальный солдатик
******

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



Что-то у меня легко задается элемент структуры в майн-функции. Правда, я не пишу
typedef struct abc_s {
...
Зачем давать название структуре, если будет использоваться определение типа?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 17:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(ViKo @ Feb 8 2015, 20:03) *
Зачем давать название структуре, если будет использоваться определение типа?


Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде struct abc_s *next_item; и никто это не обругал.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2015, 17:20
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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;
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 17:35
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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. По крайней мере, не красива, если даже и корректна по стандарту (я тут не уверен).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2015, 17:39
Сообщение #12


Универсальный солдатик
******

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



Возвращаясь к стартовому вопросу... У меня всё работает. И я не понимаю причин, почему бы оно не должно работать.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 17:41
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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;  // и это правильно, так как в функции
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2015, 17:59
Сообщение #14


Универсальный солдатик
******

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



Я же написал, что работает. В Keil. В Main вот так (я уж свою структуру использовал, из старых упражнений):
Dev.A = 0xBB;
Dev.B = 0x44;
А, оно совсем вне функций? Тогда понятно. Я-то подумал, что в Main не работает.
Просто присвоение - согласен.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 18:00
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(ViKo @ Feb 8 2015, 20:59) *
В Main вот так

А вне Main, как автор хотел, слабо?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.04146 секунд с 7
ELECTRONIX ©2004-2016