Обнуление структуры

А если найду такую, которую не обнуляет? Что мне за это будет?

И, да, кстати, даже с теми структурами, что у Вас есть, обнулять-то обнуляет, но Arduino IDE “искаропки” “ругаеццо”!

D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino: In function 'void setup()':
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:12:44: warning: missing initializer for member 'Sample1::f2' [-Wmissing-field-initializers]
 #define ZERO(_X) _X = ((__typeof__(_X)){ 0 })
                                            ^
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:19:5: note: in expansion of macro 'ZERO'
     ZERO(test);
     ^~~~
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:12:44: warning: missing initializer for member 'Sample1::f3' [-Wmissing-field-initializers]
 #define ZERO(_X) _X = ((__typeof__(_X)){ 0 })
                                            ^
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:19:5: note: in expansion of macro 'ZERO'
     ZERO(test);
     ^~~~
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

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

Что-то я не припомню, чтобы я выделял память :))))

Ничего не будет, но заранее: структура с массивом нулевого размера - нещитается.

вот тото и оно!
А без этого вообще о чем говорить? Чтобы обнулить структуру с базовыми типами, вообще не нужно никаких прыжков и ужимок, деструктор по умолчанию справится сам.
тут фигня написана

Что тут за ерунду обсуждают?
Не проще ли завести метод, например, clear()?
Это и правильнее и проще, ИМХО.

Ну, это форум по Ардуино, потому, согласитесь, IDE искаропки – штатная тестовая среда, нравится оно кому-то или нет.

Вы, сударь, простите, за кого меня держите?

Не скажу откуда цитата. Кто не знает – сам себе буратина

– Это водка? – слабо спросила Маргарита.

Кот подпрыгнул на стуле от обиды.

– Помилуйте, королева, – прохрипел он, – разве я позволил бы себе налить даме водки? Это чистый спирт!

В стандарте языка массивов нулевой длины не бывает, а то, что gcc ввёл такое расширение, еще на повод приводить такие коды в доказательство! Нет, уж, мы всё делам по правилам и стандартам!

2 лайка

Дилетантский вопрос: зачем структуру вообще обнулять? Ничего не приходит на ум где это было бы необходимо. И если очень надо, то почему не обнулить ручками, прям вот нолики присвоить всем членам структуры?

Полностью согласен!
Разве что начальные значения элементам структуры задать, и то не факт…

Это же просто:
buf.a=0;
buf.b=0:
Фсё!)))

не, до меня наконец дошло - @vvb333007 хочет предложить какой-то хак для переинициализации структуры, чтобы не надо было полям вручную нолики присваивать.

Но вопрос про поля с динамически выделенной памятью остался.

1 лайк

Ну я и говорю - метод, а как обозвать его: clear() или еще как - не имеет значения.

Если полей много - то не очень то и просто )))

интересно…
__typeof__ это же макрос, вместо которого подставляется тип выражения _X

То есть выражение
ZERO(test);

раскрывается в

test = ((Sample1(test)){ 0 });

и что? Так можно было - переинициализировать существующий обьект заново?
Впервые слышу о таком.

1 лайк

Да, это фишка GCC, насколько я понимаю.
Раскрывается в

((struct Sample1){ 0 })

вспомнил вроде.Попадалось такое в какой-то книжке прошлым летом.
Это не фишка ГСС, а новация в части ООП синтаксиса. Если конструктору передать ссылку на существующий обьект, он вместо того чтоб создать новый, просто переинициализирует старый на том же месте в памяти.

все просто если структура используется во многих местах проекта , а также в прерываниях и имеет нное кол-во полей часть из которых использует 0 как индификатор неосуществленного действия , то гораздо прощее ее полностью обнулить , чем вспоминать , где и какое ты поле уже использовал и оно не нулевое… …
Конечно можно обьявить ее локально в пределах процедуры, но мне она например нужна глобально…
Можно конечно и ручками …но когда 2-3 поля то нормально , а вот много полей… есть вариант что нибудь забыть …
ну и да … например массив символов 20 чаров … когда-то записал 20 символов, потом обнулил записав в начало \0., а потом заполнил на 10 байтов… а в итоге получил 10 байтов +мусор. . Я понимаю , что надо следить за этим , что перед внесением надо очищать всю строку и т.д , но когда таких моментов много вероятность плавующей ошибки растет … так зачем все эти мытарства когда проще перед новым использованием ее просто обнулить , зная что после окончания процедуры значения уже не актуальны… Ну както так сумбурно но вроде понятно…

Да етить вашу мать! Заведи метод с именем clear()!!!

А вообще, если у тебя такое «обнуление» возникает - ты не правильно программу спроектировал.

1 лайк

бред пишете. Как раз текстовый буфер чистить абсолютно не зачем. С ним нужно работать правильно - и проблем не будет.
Всегда, когда вы копируете новую строку в буфер, она должна завершатся терминатором - то есть \0
И тогда если вы внесли в буфер 10 байтов и \0 - вам будет абсолютно фиолетово на мусор в остальных ячейках.

2 лайка

Как верно подметили я на си пишу… нема методов .
Насчет неправильно спроектировал … да это возможно , но пока вот недогнал, как подругому можно …все еще разбираюсь… одну из граблей привел в пример

в том то и проблема я не строку копирую, а байтами и иногда не все зараз , а собирая по частям…
я уже писал понятно , что можно перед использованием обнулить , либо после использования… либо все время дописывать ‘\0’, ручками… как собственно и делал , но когда полей много не проще просто за раз все обнулить и не ломать голову…