подскажите как можно обнулить переменную
- Войдите на сайт для отправки комментариев
Ср, 24/01/2018 - 15:48
есть массиы
byte celoe[8]={0,0,0,0,0,0,0,0};
его надо обнулять при каждом проходе цикла
но сейчас он 8 элементов, а есть будет 80..800 то смотрится это страшновать
ВОПРПОС: можно ли (С и ардуина могут ли?) обявить и обнулить массив такой записью?
byte celoe[8]={0};
???
memset поможет.
так?
memset
(celoe,
0
,8);
да вроде.
если масив объявлен как
то да.., изменили на
уже не прокатит.
прокатит в обоих вар-ах.
да, memset(celoe,0,8); работает
при этом памяти жрет ровно столько, сколько и byte celoe[8]={0,0,0,0,0,0,0,0};
главное не ошибиться и не задавать его больше, чем размер переменной.
если масив объявлен как
то да.., изменили на
уже не прокатит.
прокатит в обоих вар-ах.
В обоих вариантах прокатит будет memset(celoe,0,sizeof(celoe));
а разве memset -у надо не число байт заменяемых указывать?
тогда для int будет *2 размер, а long *4....
а разве memset -у надо не число байт заменяемых указывать?
sizeof() дает размер в байтах, а не число элементов
Забавно, что ТС не приходит в голову набрать в гугле memset и sizeof
если масив объявлен как
то да.., изменили на
уже не прокатит.
прокатит в обоих вар-ах.
В обоих вариантах прокатит будет memset(celoe,0,sizeof(celoe));
конечно !
не хотел давать гранату...
далее последовало бы (при отличном от byte)
не работает !
не хотел давать гранату...
далее последовало бы (при отличном от byte)
не работает !
Почему не работает-то? - работает
не хотел давать гранату...
далее последовало бы (при отличном от byte)
не работает !
Почему не работает-то? - работает
не понял...
работает ?
ну то есть оно работает, но как !
вопрос был весьма конкретный. и не стоял о иных возможностях
мне достаточно было ответа "да" или "нет"
но спасибо Logik за memset - о нем не знал.
цикл - это старый и самый "школьный" метод... так тчо его даже не рассматривал (если есть иные механизмы)
ну и спасибо b707 за уточнение по sizeof - я думал он дает размер в виде числа элементов, а не в байтах...а щас почитал, оказывается именно для МАССИВОВ он возращает размер в байтах... а для остально (строки например) - просто числом её длинну
не понял...
работает ?
ну то есть оно работает, но как !
Ну вы других-то совсем за идиотов не держите :) Я ж сразу написал. что sizeof дает длину структуры в байтах, а не число элетнтов. Вот, так. к примеру, работает:
цикл - это старый и самый "школьный" метод... так тчо его даже не рассматривал (если есть иные механизмы)
Вы будете удивлены, заглянув внутрь типичному memset'у: https://searchcode.com/codesearch/view/19105601/
результат
int
celoe[5];
for
(
int
i=0; i<
sizeof
(celoe); i++) celoe[i]=i;
то будет цикл до 10 вместо 5
итого не хорошо
это я чтото не понял.... но похоже sizeof дает размер в байтах самой переменной, вместо её размера в символах...
ну и спасибо b707 за уточнение по sizeof - я думал он дает размер в виде числа элементов, а не в байтах...а щас почитал, оказывается именно для МАССИВОВ он возращает размер в байтах... а для остально (строки например) - просто числом её длинну
sizeof для любых структур возвращает размер занимаемой памяти в байтах. В том числе для массивов, структур, классов...
И для строк тоже - в байтах. Просто для строки, если это классичемкий ASCII - размер в байтах и в символах совпадает. А вот если строка UTF - то уже нет.
это я чтото не понял.... но похоже sizeof дает размер в байтах самой переменной, вместо её размера в символах...
Вы меня каждый раз удивляете :))))
Что такое размер переменной int в символах? :)
Какой размер "в символах" числа 255?
Три (255) . два (0хFF) или восемь b11111111 ? :)))
Для массива состоящего из элементов не умещающихся в один байт используйте делитель чтобы правильно подсчитать не размер памяти под массив, а число элементов:
Поправьте, если не прав.
это я чтото не понял.... но похоже sizeof дает размер в байтах самой переменной, вместо её размера в символах...
Вы меня каждый раз удивляете :))))
я только учу С....
//кстати о пьянке
что с аппаратной точки зрения более выгодно (что меньше тратит процессорных циклов и памяти)
1) задавать явно byte arr[5] = {0,0,0,0,0};
2) через byte arr[]; memset(arr,0,sizeof(arr));
3) через byte arr[]; for (int i=0; i<sizeof(arr); i++) {arr[i] = 0;};
Для массива состоящего из элементов не умещающихся в один байт используйте делитель чтобы правильно подсчитать не размер памяти под массив, а число элементов:
Поправьте, если не прав.
Ошибок в этом коде нет, но с учетом того, что в Си размер массива должен быть задан явно еще до компиляции, мне сложно представить ситуацию, в которой размер массива пришлось бы вычислять в программе. Поэтому правильнее ваш код записать так:
если массив из фигзнает чего, инициализирован невестьчем и ХЗ сколько,то пишем
for
(
int
i=0; i<(
sizeof
(celoe)/
sizeof
(celoe[0]
)); i++)
.Например так