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

 
 
> Инициализация структур в KEIL.
PanovAU
сообщение Sep 12 2012, 05:12
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 12-01-05
Из: Екатеринбург
Пользователь №: 1 905



Наткнулся на проблему при инициализации структур в KEIL ( версия 4.54).
До сих пор всегда ( в IAR и Builder ) пользовался такой фишкой:

Цитата
В стандарте С99 (6.7.8) есть интересная вещь - так называемые designators (обозначения?). Их использование позволяет инициализировать элементы структур при помощи списка инициализации не обращая внимания на порядок следования элементов. Например

struct StTest {
int i;
char c;
double d;
};
int main(int argc, char *argv[])
{
struct StTest st1={.d=0.1, .i=1, .c='a'},
st2={.c='b',.d=0.2,.i=2};
printf("st1.i= %d st1.c= %c st1.d= %f\n",st1.i,st1.c,st1.d);
printf("st2.i= %d st2.c= %c st2.d= %f\n",st2.i,st2.c,st2.d);
return EXIT_SUCCESS;
}

А вот собственно и результат работы такой програмки

commander@a64:$ ./teststructinit
st1.i= 1 st1.c= a st1.d= 0.100000
st2.i= 2 st2.c= b st2.d= 0.200000

Такая вещь бывает очень полезна, так как нет необходимости помнить порядок следования элементов структуры.
© Yuriy Volkov


А KEIL на такую инициализацию ругается "main.cpp(542): error: #29: expected an expression". В IAR тот же код компилится без проблем.


И еще примеры из стандарта
Цитата
1702 EXAMPLE 10 Structure members can be initialized to nonzero values without depending on their order:

div_t answer = { .quot = 2, .rem = -1 };

1703 EXAMPLE 11 Designators can be used to provide explicit initialization when unadorned initializer lists might be misunderstood:

struct { int a[3], b; } w[] =
{ [0].a = {1}, [1].a[0] = 2 };

1704 EXAMPLE 12 Space can be “allocated” from both ends of an array by using a single designator:

int a[MAX] = {
1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};

In the above, if MAX is greater than ten, there will be some zero-valued elements in the middle; if it is less than ten, some of the values provided by the first five initializers will be overridden by the second five.

1705 EXAMPLE 13 Any member of a union can be initialized:

union { /* ... */ } u = { .any_member = 42 };

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
редактор
сообщение Sep 12 2012, 05:49
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Попробуйте следующий вариант
Код
struct StTest st1={1, 1, 'a'};

Должно сработать.
PS. В KEIL надо помнить последовательность. либо присваивать отдельно по элементам (для надежности).


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 12 2012, 05:51
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



C свойствах проекта, во вкладке С/С++ в поле "Misc Controls" впишите --c99 и всё скомпилируется.

PS
Проверил ваш пример на живом приборе, всё ок, на тепминал выдало то, что ожидалось:
Цитата
st1.i= 1 st1.c= a st1.d= 0.100000
st2.i= 2 st2.c= b st2.d= 0.200000


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 12 2012, 05:54
Сообщение #4


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

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



Попробуйте в опциях проекта C/C++ в строке Misc Controls задать --С99
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 12 2012, 08:05
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (VAI @ Sep 12 2012, 08:51) *
впишите --c99
И проект из C++ превращается в C. В задачнике спрашивается: зачем тогда вводить в заблуждение программистов, которые будут сопровождать программу, называя файл main.cpp? С++ не допускает подобную инициализацию структур. Хотите C - называйте файл main.c


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 08:49
Рейтинг@Mail.ru


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