Перейти к содержанию
    

Инициализация структур

Добрый день :)

 

Есть такая проблема при разработке программ: пишешь, пишешь, а потом надо вдруг добавить какое-то поле к структуре. И если например:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если компилятор поддерживает C99, то можно делать так:

Struct1 structElement =
{
    .Number = 1,
    .Value = 0.56
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если компилятор поддерживает C99, то можно делать так:

Struct1 structElement =
{
    .Number = 1,
    .Value = 0.56
}

 

 

:cheers: Отлично! Все нормально, VisualDSP 5.1 поддерживает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно делать так:

 

Вот интересно, почему в C++ это не добавили?

Т.е. gcc умеет, но в нарушение стандарта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот интересно, почему в C++ это не добавили?

Т.е. gcc умеет, но в нарушение стандарта...

 

напишите структуре конструктор, делов-то..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

... и почему я об этом не подумал?..

 

Только оно

а) будет ли работать с глобальной const TStruct my_struct ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

самый нормальный вариант инициализации структур - не через имена полей а через макрос.

единожды переопределенный макрос не позволит пропустить неотредактированный остальной текст.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот интересно, почему в C++ это не добавили?

Т.е. gcc умеет, но в нарушение стандарта...

C++ 11 разве не умеет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C++ 11 разве не умеет?

Тот, что в стандарте - нет.

 

Вот тут http://stackoverflow.com/questions/6181715...-initialisation тему обсуждали со всех возможных сторон. Красивого решения, к сожалению, не нашли...

 

 

PS а вообще, надо б в эклипс написать feature request, чтоб в парсере кода добавили поддержку, и пользоваться вариантом из C99 в коде С++. Один фиг gcc это умеет, а задачей "писать код под все компиляторы разом" я не заморачивался; подозреваю, там будет куда больше проблем, чем эти структуры.

 

 

Вот, кстати, в процессе нашёл интересное описание расширений gcc: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В конструкторе есть такая штука как список инициализаци. Ну т.е. constructor(): field1(255), field2(32.5){};

 

Прелесть такого подхода в том, что если переменная(с типом нашей структуры с хитрым конструктором) имеет static storage duration и класс удовлетворяет требованиям standard layout то инициализация будет выполнена статически и не потребует накладных расходов в рантайме. Т.е. Байты будут разложены по полочкам еще на этапе выполнения startup.

 

Уж не знаю на сколько это по стандарту, но на практике это подтверждено ни раз и не два. Написанное же в теле конструктора - не всегда разруливалось статически. Так что всегда стараюсь для инициализации использовать именно вышеописанный вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения за небольшой оффтоп, не хочется новую тему создавать.

Наверное, глупый вопрос, но точный ответ на него нигде не нашел.

Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры?

Грубо, говоря, вот это выполняется за одинаковое количество тактов?

buff[0] =1;

и

Struct.buff[0] =1;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переменные массив и структура одного типа, обе глобальные или обе локальные, то как правило обращение к ним сформированное компилятором одинаковое, место массива в структуре компилятор рассчитает сам. Проверить несложно, откомпилируйте в asm.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры?

Либо АБСОЛЮТНО одинаково, либо работа со структурой дает выигрыш в общем случае, когда рядом идет работа и с другими элеменами этой структуры.

Исключения могут только быть, по понятной причине, при работе с пакованной структурой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, что развеяли мои сомнения.

Получается выгодно и красиво заворачивать кольцевой буфер и его элементы в структуру. И легко потом понять в программе, что относится к кольцевому буферу, а что нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумеется. А еще лучше перейти на C++ и завернуть в класс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...