C/C++

Измерить размер массива в функции Arduino. sizeof работает некорректно с переданной в функцию переменной.

Функция:
 byte XORByteArray(byte _Bytes[]) { 
byte tmpByte = 0x00;
byte _BytesLength = sizeof(_Bytes);
for (byte i = 0; i < _BytesLength; i++) {
tmpByte ^= _Bytes[i];
}
return tmpByte;
}
вычисляет XOR только для 2х первых элементов, как заставить ее вычислять весь массив?
Barat Nurdinov
Barat Nurdinov
466
Никак не заставить. Только явно вручную передавать длину массива в функцию - вторым параметром. Именно так (длину каждого измерения массива отдельным параметром) и передают массив в функцию в языке C - если функции надо знать размер массива.

Конструкция byte _Bytes[] - всего лишь синтаксический сахар для byte *_Bytes. Обе записи в описании формального параметра функции абсолютно идентичны. В функцию XORByteArray передаётся ТОЛЬКО указатель на начало массива - БЕЗ какой-либо информации о длине массива. И sizeof(_Bytes) возвращает длину значения типа char*.

P.S. В языке C НЕТ массивов - есть только синтаксический сахар над указателям.
Alex Pronin
Alex Pronin
84 586
Лучший ответ
создавай массив с уже заданным размером. сложности при работе с МК только во вред
Валерий Лебедь
Валерий Лебедь
52 817
Статический массив существует только в той области видимости, где он создан. В аргументах функции его создать невозможно, поэтому byte bytes[] или даже byte bytes[1001] преобразуется в byte* bytes
соответственно такая функция принимает не статический массив а указатель. А при попытке передать статик, он неявно преобразуется в адрес (указатель) своего первого элемента, просто чтобы соответствовать типу принимаемого аргумента.
Nurulloi Malikzod
Nurulloi Malikzod
51 416
for (byte i = 0; i < _BytesLength-1

если размер массива неизвестен на момент компиляции программы – sizeof() не сможет его посчитать и выдаст размер указателя (2 байта на AVR)
Алексей Шакин
Алексей Шакин
23 558
Barat Nurdinov В вашем варианте будет только 1 итерация цикла, так как sizeof определяет размер массива всегда 2
Ксорят, чтобы изменить значение байта, а не его адрес.
Твоя функция вообще ничего не изменяет.
И возвращать функции ничего не надо.
Получил на входе массив, обработал, и всё.
Если надо, вернул успешность или неуспешность обработки.

А размер массива типа char измеряется чаще в цикле типа:
int Size=0;
while(Bytes[i]) Size++;

То есть пока есть значение в элементе массива, отличное от нуля, увеличить размер массива Size на 1.

Либо без поиска размера массива char, пока while(Bytes[i]), выполняй свой ксор.