[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]планирую инициализировать все поля структуры y одинаковой строкой[/uquote]надо каждое поле и инициализировать
[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]получаю варнинг[/uquote]странно, у меня оно без варнингов собирается (gcc 6.5.0, 7.4.0, 8.2.0; -Wall)
[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]инициализируется только первое поле структуры[/uquote]так и должно быть
[uquote="ARV",url="/forum/viewtopic.php?p=3544835#p3544835"]планирую инициализировать все поля структуры y одинаковой строкой[/uquote]планировать мало, нужно сделать Ваш код инициализирует только первый элемент. Наверное, Вы по аналогии с
ARV писал(а):для структур правило "для всех" не действует?
Нет, конечно. С чего бы ?
Проинициализируется только первое поле структуры.
Такое правило (инициализация всех ячеек одним значением) только для массивов. В структурах могут быть разные типы полей, по этому подобное правило было бы нелогичным.
ARV писал(а):проинициализирует все элементы и поля семерками... или нет?
ЕМНИП, и для массива - нет. Только первый элемент, остальные - нулями.
Для GCC можно ещё '...' использовать для указания диапазона.
В любом случае, любые попытки инициализировать элементы чем-то, отличным от нуля, будут увеличивать размер прошивки, тем больше, чем больше элементов в массиве, структуре и т.д.
[uquote="WiseLord",url="/forum/viewtopic.php?p=3545811#p3545811"]ЕМНИП, и для массива - нет. Только первый элемент, остальные - нулями.[/uquote]
Неохота искать источники, но я так тоже всегда считал. А значит откуда то вбилось.)
AAX писал(а):решили, что всё проинициализируется "1"?
да, а разве я не прав?[/uquote]я ж ссылку дал. Можно было бы за минуту прочесть, и понять, прав-не прав... Это ж не википедия Это руководство GCC.
[uquote="ARV",url="/forum/viewtopic.php?p=3545804#p3545804"]
AAX писал(а): Но чтобы получить это предупреждение мне пришлось добавить gcc опцию -Wmissing-braces
у меня по умолчанию -Wall[/uquote]Вы, наверное, решили, что опция -Wall включает все возможные предупреждения компилятора? This enables all the warnings about constructions that some users consider questionable. Впрочем, ходить по ссылкам, читать - скукота... гораздо лучше положиться на мнение неизвестного человека из интернетов, с вероятностью 95% - бестолкового, т.к. "толковым" в интернетах отвисать некогда Мкей, тогда давайте так: -Wall не включает всех возможных предупреждений. С настройками по-умолчанию (-Wall) приведённая Вами конструкция не вызывает появления каких-либо предупреждений при компиляции при помощи gcc version 5.4.0 (AVR_8_bit_GNU_Toolchain_3.6.0_1734)
всегда перед тем, как задать вопрос на форуме, пытаюсь найти ответ в доступных мне источниках, в частности, при помощи поиска в google
AAX писал(а):приведённая Вами конструкция не вызывает появления каких-либо предупреждений при компиляции при помощи gcc version 5.4.0
в том-то и дело, что от версии к версии avr-gcc меняет своё поведение "по умолчанию". в документации тоже не всегда легко найти особенности именно этой версии. но главное - невозможно понять, почему именно так, а не иначе "было-стало". и в этом случае обращаюсь на форум.
AAX писал(а):гораздо лучше положиться на мнение неизвестного человека из интернетов, с вероятностью 95% - бестолкового
вы сейчас себя имели ввиду?
указанные мной версии компилятора выдают указанные мною предупреждения, и ведут себя так, как я описал. хоть я и имею набор версий от 3.х.х. до 8.х.х, проверять каждую как-то лень. причина "странной" на мой взгляд инициализации структур мне уже стала понятна - спасибо "бестолковым", кто уже успел мне объяснить. причина появления варнингов - не понятна до сих пор, как не понятен до сих пор и способ избавления от них (не считая отключения опции) без необходимости инициализировать каждое поле принудительно.
пока это всё.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="ARV",url="/forum/viewtopic.php?p=3549882#p3549882"]причина появления варнингов - не понятна до сих пор[/uquote]глюк конкретной версии?
Спойлер
arkhnchul@arkhost-scow:/tmp$ cat tst1.c
#define CNT 10
typedef struct{
char about_a[CNT];
char about_f[CNT];
char about_d[CNT];
char about_i[CNT];
char about_t[CNT];
} n_t;
typedef struct{
int x;
n_t y;
}my_t;
my_t var = {
.x = 12,
.y = {"1"}
};
int main(){
return 0;
}
arkhnchul@arkhost-scow:/tmp$ avr-gcc -Wall -Wmissing-braces -c -S tst1.c
arkhnchul@arkhost-scow:/tmp$ avr-gcc --version
avr-gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[uquote="ARV",url="/forum/viewtopic.php?p=3549882#p3549882"]вы сейчас себя имели ввиду? [/uquote]в том числе и себя, конечно.
Если человек высказывает мнение по обсуждаемому вопросу, обычно следует поинтересоваться источником его знания. И ознакомиться с ним, т.к. 1) люди не всегда формулируют точно, мануалы и учебники пишут лучше. Ну, и просто - при каждом пересказе информации свойственно искажаться. 2) человек, обычно, высказывается только о предмете, вызвавшем обсуждение. В мануале или в учебнике есть шанс получить дополнительное полезное знание, о вещах, не упомянутых в контексте данного обсуждения.
Даже если Вам повезло, и Вы встретились (чудом) в интернетах с "толковым" человеком, у него наверняка не будет времени вникать в нюансы Вашего вопроса и разжёвывать ответ. Это как у линуксоидов когда-то было принято: вместо ответа на вопрос отправлять читать нужный man.
[uquote="WiseLord",url="/forum/viewtopic.php?p=3545811#p3545811"]...
Только первый элемент, остальные - нулями....[/uquote]
В данном случае только первый элемент. Заполнять остальное нулями компилятор не обязан. Чистка буфера до обмена в Си всегда отдавалась на откуп программисту. И это правильно.
А вот интересно, если написать static int Buffer[100], компилятор заполнит буфер нулями? Вообще, должен - инициализация статических переменных нулями гарантируется.
Статические точно обнуляются, а глобальные, как отметил shindax, в принципе, не обязательно, но практически наверняка, компилятор их оптимизирует подобно статическим. По крайней мере, в случае avr-gcc и типичных флагах компиляции (-Os) разницы между прошивками, где глобальные массивы объявлены как static, и прошивками, где - не static, никакой нет.
здравствуйте! проблема с кодом, выложить пока не могу, т. к. не рядом с компом. но и не могу успокоиться найдя проблему.суть вот в чем:в целом код работал, после незначительных, на мой взгляд, манипуляции с переменными он перестал выполнять свои функции. пытался отладчиком отловить баг, но не смог. компилируется чисто, при отладке в дис. коде вижу что происходит сброс PC(rjump PC 0*0000) . Подскажите пожалуйста, почему эта гадость могла возникнуть, где копать?
Варианты, когда код перестаёт работать после незначительного изменения:
1) Вы не использовали volatile там где надо.
2) У вас утечка памяти.
3) Вы выходите за пределы массивов.
4) В коде связанные переменные, находящиеся в разных модулях - изменился порядок инициализации.
[uquote="da-nie",url="/forum/viewtopic.php?p=3551245#p3551245"]Варианты, когда код перестаёт работать после незначительного изменения[/uquote] спасибо,покопаюсь. из всего Вами перечисленного утечка памяти особо привлекло внимание.Такое понятие в микроконтроллерах я еще не слышал.
Добавлено after 1 hour 3 minutes 21 second:
[uquote="da-nie",url="/forum/viewtopic.php?p=3551245#p3551245"]Советую скачать cppcheck[/uquote] хороший инструмент,необходимая вещь для новичка!отсканировал свой косячный код выдало несколько явных ошибок и одну сомнительную,все исправил и заработало. Спасибо большое,сегодня спать хоть буду спокойно
Столкнулся с проблемой. Хочу в устройстве сохранять настройки между включениями-выключениями. Микроконтроллер MSP432P401R. У него встроенного еепрома нет. Но я подумал, что мог бы использовать последние блоки флэш памяти с адреса 3f000 до 3ffff. Благо этого флэша там аж 256килобайт. Попробовал, сделал функцию записи во флэш после выхода из конфигурационного меню. Запустил. Запускаю отладчик, смотрю память: FFFFFFFFFFFFF. Выполняю под отладчиком - всё работает. Выхожу из отладчика, захожу по-новой - снова FFFFFFFFFFF. Короче при каждой перепрошивке вся память стирается. Можно ли как-то этот участок памяти "обезопасить" от стирания. Или хотя бы, чтобы при прошивке там записывались бы какие-то начальные установки.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."