|
Инициализация структур, Как сделать инициализацию до выполнения программы по именам полей? |
|
|
|
Nov 25 2015, 14:30
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634

|
Добрый день  Есть такая проблема при разработке программ: пишешь, пишешь, а потом надо вдруг добавить какое-то поле к структуре. И если например: Код typedef struct { int Number; float Value; } Struct1; вдруг поменялось на Код typedef struct { float Percent; int Number; float Value; } Struct1; то все структуры инициализированные Код Struct1 structElement = { 1, 0.56 }; будут совсем даже неправильно заполненными. То что в дополнительном поле, которое появилось, будет 0 меня не интересует, это допустимо Т.е. получается только инициализация отдельно по полям? И никаких структур-констант, если хочешь чтобы все было четко по полям? Код void SetStruct1 ( void ) { structElement.Number = 1; structElement.Value = 0.56; }
Сообщение отредактировал kolobochishe - Nov 25 2015, 14:32
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Nov 25 2015, 14:56
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634

|
Цитата(aaarrr @ Nov 25 2015, 19:48)  Если компилятор поддерживает C99, то можно делать так: Код Struct1 structElement = { .Number = 1, .Value = 0.56 }  Отлично! Все нормально, VisualDSP 5.1 поддерживает.
|
|
|
|
|
Nov 27 2015, 07:09
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(psL @ Nov 26 2015, 11:23)  C++ 11 разве не умеет? Тот, что в стандарте - нет. Вот тут http://stackoverflow.com/questions/6181715...-initialisation тему обсуждали со всех возможных сторон. Красивого решения, к сожалению, не нашли... PS а вообще, надо б в эклипс написать feature request, чтоб в парсере кода добавили поддержку, и пользоваться вариантом из C99 в коде С++. Один фиг gcc это умеет, а задачей "писать код под все компиляторы разом" я не заморачивался; подозреваю, там будет куда больше проблем, чем эти структуры. Вот, кстати, в процессе нашёл интересное описание расширений gcc: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Dec 9 2015, 16:37
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Прошу прощения за небольшой оффтоп, не хочется новую тему создавать. Наверное, глупый вопрос, но точный ответ на него нигде не нашел. Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры? Грубо, говоря, вот это выполняется за одинаковое количество тактов? Код buff[0] =1; и Код Struct.buff[0] =1;
|
|
|
|
|
Dec 9 2015, 17:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Atlantis- @ Dec 9 2015, 18:37)  Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры? Либо АБСОЛЮТНО одинаково, либо работа со структурой дает выигрыш в общем случае, когда рядом идет работа и с другими элеменами этой структуры. Исключения могут только быть, по понятной причине, при работе с пакованной структурой.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 10 2015, 12:12
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(Сергей Борщ @ Dec 10 2015, 00:43)  Разумеется. А еще лучше перейти на C++ и завернуть в класс. А нельзя еще в структуре константы прописать? Размер буфера и маску? Структура в памяти линейно располагается, а если в ней объявить константу с ключевым словом const ?
|
|
|
|
|
Dec 10 2015, 12:27
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Atlantis- @ Dec 10 2015, 12:12)  А нельзя еще в структуре константы прописать? Размер буфера и маску? Структура в памяти линейно располагается, а если в ней объявить константу с ключевым словом const ? Конечно можно! Вот так, например: CODE struct TMyStruct { static const uint32 Const1 = 12; //-- interger "constants" only enum TSome { EItem1 = 0, EItem2 = 13, };
}; Компилятор, правда, нужен правильный
|
|
|
|
|
Dec 10 2015, 13:09
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(CrimsonPig @ Dec 10 2015, 15:27)  Конечно можно! Вот так, например: CODE struct TMyStruct { static const uint32 Const1 = 12; //-- interger "constants" only enum TSome { EItem1 = 0, EItem2 = 13, };
}; Компилятор, правда, нужен правильный  и как оно будет выглядеть в памяти? Исходя из того что элементы структуры в памяти должна быть расположены линейно. А static const это другой тип памяти, если не ошибаюсь. Keil - "правильный" компилятор?
|
|
|
|
|
Dec 10 2015, 13:46
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Atlantis- @ Dec 10 2015, 13:09)  и как оно будет выглядеть в памяти? Исходя из того что элементы структуры в памяти должна быть расположены линейно. А static const это другой тип памяти, если не ошибаюсь. Keil - "правильный" компилятор? Если целочисленные константы заданы через enum, то они никак не будут выглядеть в памяти. static const член структуры тоже, скорее всего ничего в памяти занимать не будет, компилятор его сократит просто до целочисленной константы, если, конечно, не страдать фигней и не пытаться брать адрес такой константы..
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|