kochevkv 1 25 ноября, 2015 Опубликовано 25 ноября, 2015 (изменено) · Жалоба Добрый день :) Есть такая проблема при разработке программ: пишешь, пишешь, а потом надо вдруг добавить какое-то поле к структуре. И если например: 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; } Изменено 25 ноября, 2015 пользователем kolobochishe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба Если компилятор поддерживает C99, то можно делать так: Struct1 structElement = { .Number = 1, .Value = 0.56 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба Если компилятор поддерживает C99, то можно делать так: Struct1 structElement = { .Number = 1, .Value = 0.56 } :cheers: Отлично! Все нормально, VisualDSP 5.1 поддерживает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба можно делать так: Вот интересно, почему в C++ это не добавили? Т.е. gcc умеет, но в нарушение стандарта... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба Вот интересно, почему в C++ это не добавили? Т.е. gcc умеет, но в нарушение стандарта... напишите структуре конструктор, делов-то.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 26 ноября, 2015 Опубликовано 26 ноября, 2015 · Жалоба Спасибо! ... и почему я об этом не подумал?.. Только оно а) будет ли работать с глобальной const TStruct my_struct ? б) неудобно, если надо несколько экземпляров структуры (у конструктора тоже могут быть параметры, но это возврат к той же проблеме - десяток полей малопонятным списком). Отнаследовать от одной структуры пяток разных, переопределить конструкторы - вариант, конечно, но как-то через ж., мне кажется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 26 ноября, 2015 Опубликовано 26 ноября, 2015 · Жалоба самый нормальный вариант инициализации структур - не через имена полей а через макрос. единожды переопределенный макрос не позволит пропустить неотредактированный остальной текст. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 26 ноября, 2015 Опубликовано 26 ноября, 2015 · Жалоба Вот интересно, почему в C++ это не добавили? Т.е. gcc умеет, но в нарушение стандарта... C++ 11 разве не умеет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 27 ноября, 2015 Опубликовано 27 ноября, 2015 · Жалоба C++ 11 разве не умеет? Тот, что в стандарте - нет. Вот тут http://stackoverflow.com/questions/6181715...-initialisation тему обсуждали со всех возможных сторон. Красивого решения, к сожалению, не нашли... PS а вообще, надо б в эклипс написать feature request, чтоб в парсере кода добавили поддержку, и пользоваться вариантом из C99 в коде С++. Один фиг gcc это умеет, а задачей "писать код под все компиляторы разом" я не заморачивался; подозреваю, там будет куда больше проблем, чем эти структуры. Вот, кстати, в процессе нашёл интересное описание расширений gcc: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба В конструкторе есть такая штука как список инициализаци. Ну т.е. constructor(): field1(255), field2(32.5){}; Прелесть такого подхода в том, что если переменная(с типом нашей структуры с хитрым конструктором) имеет static storage duration и класс удовлетворяет требованиям standard layout то инициализация будет выполнена статически и не потребует накладных расходов в рантайме. Т.е. Байты будут разложены по полочкам еще на этапе выполнения startup. Уж не знаю на сколько это по стандарту, но на практике это подтверждено ни раз и не два. Написанное же в теле конструктора - не всегда разруливалось статически. Так что всегда стараюсь для инициализации использовать именно вышеописанный вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба Прошу прощения за небольшой оффтоп, не хочется новую тему создавать. Наверное, глупый вопрос, но точный ответ на него нигде не нашел. Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры? Грубо, говоря, вот это выполняется за одинаковое количество тактов? buff[0] =1; и Struct.buff[0] =1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolyT 0 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба Если переменные массив и структура одного типа, обе глобальные или обе локальные, то как правило обращение к ним сформированное компилятором одинаковое, место массива в структуре компилятор рассчитает сам. Проверить несложно, откомпилируйте в asm. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба Если сравнивать по быстродействию, будет ли отличие, если я меняю значение переменной (или массива) и меняю значение элемента структуры? Либо АБСОЛЮТНО одинаково, либо работа со структурой дает выигрыш в общем случае, когда рядом идет работа и с другими элеменами этой структуры. Исключения могут только быть, по понятной причине, при работе с пакованной структурой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба Спасибо, что развеяли мои сомнения. Получается выгодно и красиво заворачивать кольцевой буфер и его элементы в структуру. И легко потом понять в программе, что относится к кольцевому буферу, а что нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба Разумеется. А еще лучше перейти на C++ и завернуть в класс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться