подскажите как можно обнулить переменную

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

есть массиы

 byte celoe[8]={0,0,0,0,0,0,0,0}; 

его надо обнулять при каждом проходе цикла

но сейчас он 8 элементов, а есть будет 80..800 то смотрится это страшновать

ВОПРПОС: можно ли (С и ардуина могут ли?) обявить и обнулить массив такой записью?

 byte celoe[8]={0}; 

???

Logik
Offline
Зарегистрирован: 05.08.2014

memset поможет.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

так?

memset(celoe,0,8); 

Logik
Offline
Зарегистрирован: 05.08.2014

да вроде.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

если масив объявлен как 

byte celoe[8]={0,0,0,0,0,0,0,0}; 

то да.., изменили на 

int celoe[8]={0,0,0,0,0,0,0,0}; 

уже не прокатит.

for (int i=0; i<8; i++) celoe[i]=0;

прокатит в обоих вар-ах.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да, memset(celoe,0,8); работает

при этом памяти жрет ровно столько, сколько и byte celoe[8]={0,0,0,0,0,0,0,0};

главное не ошибиться и не задавать его больше, чем размер переменной.

Logik
Offline
Зарегистрирован: 05.08.2014

xDriver пишет:

если масив объявлен как 

byte celoe[8]={0,0,0,0,0,0,0,0}; 

то да.., изменили на 

int celoe[8]={0,0,0,0,0,0,0,0}; 

уже не прокатит.

for (int i=0; i<8; i++) celoe[i]=0;

прокатит в обоих вар-ах.

В обоих вариантах прокатит будет memset(celoe,0,sizeof(celoe));

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а разве memset -у надо не число байт заменяемых указывать?

тогда для int будет *2 размер, а long *4....

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

а разве memset -у надо не число байт заменяемых указывать?

 

sizeof()  дает размер в байтах, а не число элементов

Забавно, что ТС не приходит в голову набрать в гугле memset и sizeof

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Logik пишет:

xDriver пишет:

если масив объявлен как 

byte celoe[8]={0,0,0,0,0,0,0,0}; 

то да.., изменили на 

int celoe[8]={0,0,0,0,0,0,0,0}; 

уже не прокатит.

for (int i=0; i<8; i++) celoe[i]=0;

прокатит в обоих вар-ах.

В обоих вариантах прокатит будет memset(celoe,0,sizeof(celoe));

конечно !

не хотел давать гранату... 

далее последовало бы (при отличном от byte)

for (int i=0; i<sizeof(celoe); i++) // что то ;

не работает !

 

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

не хотел давать гранату... 

далее последовало бы (при отличном от byte)

for (int i=0; i<sizeof(celoe); i++) // что то ;

не работает !

 

Почему не работает-то? - работает

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707 пишет:

xDriver пишет:

не хотел давать гранату... 

далее последовало бы (при отличном от byte)

for (int i=0; i<sizeof(celoe); i++) // что то ;

не работает !

 

Почему не работает-то? - работает

не понял...

int celoe[8];

for (int i=0; i<sizeof(celoe); i++) celoe[i]=i;

работает ?

ну то есть оно работает, но как !

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

вопрос был весьма конкретный. и не стоял о иных возможностях

мне достаточно было ответа "да" или "нет"

но спасибо Logik за memset - о нем не знал.

цикл - это старый и самый "школьный" метод... так тчо его даже не рассматривал (если есть иные механизмы)

ну и спасибо b707 за уточнение по sizeof - я думал он дает размер в виде числа элементов, а не в байтах...а щас почитал, оказывается именно для МАССИВОВ он возращает размер в байтах... а для остально (строки например) - просто числом её длинну

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

не понял...

int celoe[8];

for (int i=0; i<sizeof(celoe); i++) celoe[i]=i;

работает ?

ну то есть оно работает, но как !

Ну вы других-то совсем за идиотов не держите :) Я ж сразу написал. что sizeof дает длину структуры в байтах, а не число элетнтов.  Вот, так. к примеру, работает:

int celoe[8];
byte *ptr; 

for (int i=0; i<sizeof(celoe); i++) 
{ ptr = ((byte *)(celoe)) +i;
 Serial.write(*ptr);  // отсылаем массив по Сериал по байтам
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ELITE пишет:

цикл - это старый и самый "школьный" метод... так тчо его даже не рассматривал (если есть иные механизмы)

Вы будете удивлены, заглянув внутрь типичному memset'у: https://searchcode.com/codesearch/view/19105601/

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018
void setup() {
 Serial.begin(9600);
}
int test1[5]={0,0,0,0,0};
long test2[5]={0,0,0,0,0};
char test3[5]={0,0,0,0,0};
byte test4[5]={0,0,0,0,0};
void loop() {
 Serial.println( sizeof(test1) );
 Serial.println( sizeof(test2) );
 Serial.println( sizeof(test3) );
 Serial.println( sizeof(test4) );
}

результат

10
20
5
5
 
значит если будет
int celoe[5];
for (int i=0; i<sizeof(celoe); i++) celoe[i]=i;
то будет цикл  до 10 вместо 5
 
итого не хорошо
 
а вот для
int test6 = 123456;
long test7 = 123456;
char test8 = '123456';
результаты
2
4
1

это я чтото не понял.... но похоже sizeof дает размер в байтах самой переменной, вместо её размера в символах...

 

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

ну и спасибо b707 за уточнение по sizeof - я думал он дает размер в виде числа элементов, а не в байтах...а щас почитал, оказывается именно для МАССИВОВ он возращает размер в байтах... а для остально (строки например) - просто числом её длинну

sizeof для любых структур возвращает размер занимаемой памяти в байтах. В том числе для массивов, структур, классов...

И для строк тоже - в байтах. Просто для строки, если это классичемкий ASCII - размер в байтах и в символах совпадает. А вот если строка UTF - то уже нет.

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

это я чтото не понял.... но похоже sizeof дает размер в байтах самой переменной, вместо её размера в символах...

 

Вы меня каждый раз удивляете :))))

Что такое размер переменной int в символах? :)

Какой размер "в символах" числа 255?

Три (255) . два (0хFF) или восемь b11111111 ? :)))

Rootware
Offline
Зарегистрирован: 11.01.2018

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

int celoe[5];
for (int i=0; i<(sizeof(celoe)/sizeof(int)); i++) celoe[i]=i;

Поправьте, если не прав.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

b707 пишет:

ELITE пишет:

это я чтото не понял.... но похоже 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;};

b707
Offline
Зарегистрирован: 26.05.2017

Rootware пишет:

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

int celoe[5];
for (int i=0; i<(sizeof(celoe)/sizeof(int)); i++) celoe[i]=i;

Поправьте, если не прав.

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

#define ARRAY_SIZE 5
int celoe[ARRAY_SIZE];
for (int i=0; i<ARRAY_SIZE; i++) celoe[i]=i;

 

Logik
Offline
Зарегистрирован: 05.08.2014

если массив из фигзнает чего, инициализирован невестьчем и ХЗ сколько,то пишем for (int i=0; i<(sizeof(celoe)/sizeof(celoe[0])); i++).

Например так

 AT_COMMANDS AT_Command[]=
{
  {ATE,      NULL, NULL},
  {ATI,      ReciveATI_OK, NULL},  
  {ATCIFSR,  LockalIP, NULL },
 };

//проверка индекса в диапазоне
  if(InitID<sizeof(AT_Command)/sizeof(AT_Command[0]))
  {