определить размер массива

iopq
Offline
Зарегистрирован: 05.07.2016

есть список констант в виде массива типа байт 

byte A[] =  {0x01, 0x00, 0x00, 0x10};
byte B[] =  {0x02, 0x10};
byte C[] =  {0x03, 0x15, 0x00, 0x00, 0x00, 0x10};
byte D[] =  {0x04, 0x20, 0x00};

они используются функцией 

func(A, 4);

которая представляет собой 

void func(byte arr[], int size)
{ 
///
}

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

если я делаю так

void loop()
{
 func(A, sizeof(A));
}

то работает, а если так

void loop()
{
 func2(A);
}

func2(byte arr2[])
{
 func(arr2, sizeof(A));
}

то все. что не так?

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

iopq пишет:

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

Вообще то, почти всегда в языках C/C++ массивы передаются в функции с 2-мя параметрами: массив + его размер. Это связано с тем, что в C/C++ на самом деле массивы не могут передаваться в качестве параметров, а вместо них передаётся указатель на 1-й элемент массива. Т.е. когда вы записываете func2(byte arr2[])- это вам кажется что вы передаёте массив, на самом деле компилятор вместо этого подставит func2(byte *arr2). А по указателю на начало массива вы ничего не можете сказать о его размере.

(Это сделано по бедности, в погоне за производительностью, когда в 1970г. проектировали C, а C++ просто вынужден быть совместимым с C, являясь надмножеством C).

Иногда, если описание массива находится в области видимости (если вы хорошо понимаете что делаете), то в данной точке программы можно определить размер описанного массива, например так:

long int arr[] = { 1, 2, 3, 4, 5 };
...
int razmer = sizeof( arr ) / sizeof( arr[ 0 ] );

  

iopq
Offline
Зарегистрирован: 05.07.2016

большое спасибо. раз положено будем передавать вместе с размером

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Но сначала размер, а потом имя массива.

void func(int size,byte *arr);

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

qwone пишет:

Но сначала размер, а потом имя массива.

void func(int size,byte *arr);

Но в большинстве функций стандартной библиотеки C (ANSI C) всё как-раз наоборот: сначала массив, затем его длина - см.: fgets(), read(), write(), strncpy() и мн. др.

Хотя этот порядок не имеет никакого значения (IMHO).

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

Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Olej пишет:

Хотя этот порядок не имеет никакого значения (IMHO).

Ошибаетесь :) Значение есть и немалое. То в каком порядке вы расположите данные, напрямую даст команду компилятору то в каком порядке из загружать в стек и доставать оттуда. Ну а дальше уже нужно смотреть как это факт повлияет на размер кода и его быстродействие в вашем случае.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Olej пишет:

Хотя этот порядок не имеет никакого значения (IMHO).

Порядок - имеет первостепенное значение.

Факультативные параметры могут идти только после обязательных и никак не наоборот.

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

sadman41 пишет:

Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.

Длина для многих строчных функций вида str*() не требуется исключительно и только потому, что при раьботе со строками мы работаем не с целым массивом, а только с его частью, ограниченной символом-терминатором '\0', который, по договорённости, в языке C трактуется как конец строки.

char x[ 80 ] = "xyz", y[ 80 ];
strcpy( y, x );
 

Здесь мы копируем не массив x, а только малую часть массива из 4-х байт, заканчивая символом-терминатором '\0'.

А вот здесь наоборот:

char x[ 80 ] = { 'x' , 'y', 'z' }, y[ 80 ];
strcpy( y, x );

Здесь вы получаете тяжелейшую в её локализации ошибку, когда делается попытка копирования не только 80 байт, но и далеко за пределами массива x, пока случайно не встретится байт с значением 0, или/и случится ошибка нарушения защиты памяти.

Вот поэтому во многих руководствах рекомендуют везде где можно использовать strncpy() вместо strcpy().

 

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

Olej пишет:

sadman41 пишет:

Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.

Длина для многих строчных функций вида str*() не требуется исключительно и только потому, что при раьботе со строками мы работаем не с целым массивом, а только с его частью, ограниченной символом-терминатором '\0', который, по договорённости, в языке C трактуется как конец строки.

А мужики-то и не знали...

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

brokly пишет:

Ошибаетесь :) Значение есть и немалое. То в каком порядке вы расположите данные, напрямую даст команду компилятору то в каком порядке из загружать в стек и доставать оттуда. 

Глупость сказана!

andriano пишет:

Порядок - имеет первостепенное значение.

Факультативные параметры могут идти только после обязательных и никак не наоборот.

И ещё раз повторена...

В случае передачи адреса начала массива вместо массива - передача параметра по ссылке, а не по значению, как это принято в C/C++ и где это единственный способ относительно массивов - а). указание длины массива отдельным параметром - обязательна, а б). порядок указания параметров адреса начала массива и его длины - не имеет абсолютно никакого значения.

   

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

sadman41 пишет:

А мужики-то и не знали...

Читайте матчасть, мужики...

RTFM ;-)

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

andriano пишет:

Порядок - имеет первостепенное значение.

Факультативные параметры могут идти только после обязательных и никак не наоборот.

При передаче массивов нет там никаких факультативных параметров. Не нужно путать грешное с праведным...

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

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

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

sadman41 пишет:

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

sadman41, пойдите матчасть почитайте ... и вдумчиво и 3 раза. 

Чтоб херню не писать ... "для новичков".

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Olej пишет:

Глупость сказана!

И ещё раз повторена...

Глуп тот, кто пытается толковать о том чего не понимает. Выши наезды - бездоказательная биллиберда. Я вот назову вас чайником, без объяснения принчин, и вы будете чайником ? 

Так что ляпнул - отчитайся, обоснуй.

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

Я думаю, он за "чистый си" !

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

brokly пишет:

А ссылку на матчасть дать не может :) 

Я для тебя матчасть, придурок. Ты спрашивай - я растолкую.

Я таких как ты переучил не одну сотню ... а некоторые из них, сердешные, так этот барьер и не приодолели.

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Olej пишет:

brokly пишет:

А ссылку на матчасть дать не может :) 

Я для тебя матчасть, придурок. Ты спрашивай - я растолкую.

Я таких как ты переучил не одну сотню ... а некоторые из них, сердешные, так этот барьер и не приодолели.

Случай тяжелый. Админы, как считаете разговор в таком ключе это норма ?

Слышь олежка, ты для меня просто кусок чего то непонятного, чего быть не должно :) Тобой даже подтереться нельзя :) И это , на всякий случай, "училку" свою поприжми, а то оторвут ведь :)

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

brokly пишет:

А ссылку на матчасть дать не может :) Потому как сам ее никада не видел , матчасть эту :)))) 

Ссылку тебе? Ню-ню ...

Иди, читай, просветляйся ISO/IEC 14882:1998,  ISO/IEC 14882:2003

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Мне почитать хватило вот этого береда:

http://arduino.ru/forum/apparatnye-voprosy/sborka-godovogo-rele-vremeni-na-arduino#comment-350953

Сразу ясен уровень твоего понимания предмета. И твои отсылки к стандартам - ни о чем. Ты покажи где там сказано, что расположение передаваемых параметров ни на что не влияет. А то я смотрю бомбит тебя не по детски :)

А то что ты тут про массивы плел, с видом гуру, каждый школьник знает. То же мне учитель:) Умора, стандарт он дважды прочитал :)

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

brokly пишет:

Случай тяжелый. Админы, как считаете разговор в таком ключе это норма ?

у трупа страуса нужно спросить про ключи. О_О

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Клапауций 555 пишет:

у трупа страуса нужно спросить про ключи. О_О

У тебя ошипка. Воторой раз справшивать не нужно. Я уже спросил.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

brokly пишет:

Я уже спросил.

ты не у тех спросил.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Клапауций 555 пишет:

ты не у тех спросил.

А я не собирался спрашивать у "тех" , ты просто не понял. 

Кстати, о помощи "гуру" новичкам. В соседней теме все раскрыто:

http://arduino.ru/forum/programmirovanie/bool-arr01000000-skonvertirovat-v-byte-b01000000

Что нИ реплика, то с ляпами. "Учитель года", блин :)