Как посчитать количество байт в массиве?

John2015
Offline
Зарегистрирован: 02.02.2016

Подскажите пожалуйста как можно посчитать автоматом количество байт в массиве

То есть если длина строки увеличилась в массиве  соответственно и в  переменной  “а”  меняем количество байт.

nsigned char our_data[40] = {"1,2,3,4,5,6,7,8"};


int a = 15;

void setup()
 {
  Serial.begin(9600);
 }

void loop()
 {


   
    
    
    unsigned char i;
for (i = 0; i < a; i = i + 1) {
  Serial.println(our_data[i]);
}
   
     Serial.println("   ");
    delay(1000); 


 }

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
byte msg[3];
......

byte n=sizeof(msg);

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

jeka_tm пишет:

byte msg[3];
......

byte n=sizeof(msg);

sizeof(msg) всегда будет 2. msg это указатель на массив.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

аргументируй

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Надо так

String msg;
int len=length(msg);

jeka_tm пишет:

аргументируй

В твоем варианте msg это указатель, длина указателя для 8 битных контроллеров = 2, для 32 битных = 4.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

блин. меня сбило название темы

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Во-первых цель непонятна, точнее неоднозначна. Если нужно просто узнать длину строки, то есть функции типа strlen(); Но тогда почему, если в массиве хранится символьная строка, массив объявлен как unsigned char, почему не просто char. Вторая неоднозначность, почему массив вообще указан с фиксированной длиной (40)? Массив содержит изменяемые данные, т.е. строку в массиве можно будет изменить? А если нет, тогда почему он не const char, и вообще, зачем он нужен как массив, если строку можно вывести в Serial и как строку, а не как отдельные символы. Надеюсь автор понимает, что записав в массив, например, строку "12", нужно выделять под такую строку 3 char, т.е. с учетом завершающего символа '\0'.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Andy пишет:

Надо так

String msg;
int len=length(msg);

Ну, так-то точно не надо. Вы это запускали?

Да и ТС вроде нужно длину char * искать (чем ему не угодила стандартная strlen - не понимаю), а вовсе не String.

John2015
Offline
Зарегистрирован: 02.02.2016

Чтобы подсчитывать корректно контрольную сумму нам нужно выставлять количество байт (a).

Поскольку массив может быть разной длинны и в нем может быть разное количество символов.

          116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};




unsigned char our_data[] = {"ASDFGHSRRDSASDE"};

void setup()
 {
  Serial.begin(9600);
 }

void loop()
 {


     unsigned char our_crc;

    int a = 14;
    our_crc = 0;
    for(byte i=0;i<a;i++)CRC(&our_crc, our_data[i]);

 

John2015
Offline
Зарегистрирован: 02.02.2016

То есть я скажем в массив записываю данные и они разной длинны  и чтобы посчитать контрольную сумму  мне нужно знать количество байт

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

John2015 пишет:
в массив записываю данные и они разной длинны
А как ты узнаешь, что они разной длины? Выходит длину знаешь, её и используй.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Поскольку у Вас не только символы, но и бинарная информация, проще всего завести переменную, где хранить индекс первого свободного байта (он же длина массива) и использовать его для записи данных в этот массив.

 

John2015
Offline
Зарегистрирован: 02.02.2016

Спасибо

__Alexander
Offline
Зарегистрирован: 24.10.2012

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