определить размер массива
- Войдите на сайт для отправки комментариев
Ср, 14/03/2018 - 23:19
есть список констант в виде массива типа байт
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)); }
то все. что не так?
как сделать что бы обойтись без второго аргумента?
Вообще то, почти всегда в языках C/C++ массивы передаются в функции с 2-мя параметрами: массив + его размер. Это связано с тем, что в C/C++ на самом деле массивы не могут передаваться в качестве параметров, а вместо них передаётся указатель на 1-й элемент массива. Т.е. когда вы записываете
func2(
byte
arr2[])
- это вам кажется что вы передаёте массив, на самом деле компилятор вместо этого подставитfunc2(
byte
*arr2)
. А по указателю на начало массива вы ничего не можете сказать о его размере.(Это сделано по бедности, в погоне за производительностью, когда в 1970г. проектировали C, а C++ просто вынужден быть совместимым с C, являясь надмножеством C).
Иногда, если описание массива находится в области видимости (если вы хорошо понимаете что делаете), то в данной точке программы можно определить размер описанного массива, например так:
большое спасибо. раз положено будем передавать вместе с размером
Но сначала размер, а потом имя массива.
Но сначала размер, а потом имя массива.
Но в большинстве функций стандартной библиотеки C (ANSI C) всё как-раз наоборот: сначала массив, затем его длина - см.: fgets(), read(), write(), strncpy() и мн. др.
Хотя этот порядок не имеет никакого значения (IMHO).
Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.
Хотя этот порядок не имеет никакого значения (IMHO).
Ошибаетесь :) Значение есть и немалое. То в каком порядке вы расположите данные, напрямую даст команду компилятору то в каком порядке из загружать в стек и доставать оттуда. Ну а дальше уже нужно смотреть как это факт повлияет на размер кода и его быстродействие в вашем случае.
Хотя этот порядок не имеет никакого значения (IMHO).
Порядок - имеет первостепенное значение.
Факультативные параметры могут идти только после обязательных и никак не наоборот.
Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.
Длина для многих строчных функций вида str*() не требуется исключительно и только потому, что при раьботе со строками мы работаем не с целым массивом, а только с его частью, ограниченной символом-терминатором '\0', который, по договорённости, в языке C трактуется как конец строки.
Здесь мы копируем не массив x, а только малую часть массива из 4-х байт, заканчивая символом-терминатором '\0'.
А вот здесь наоборот:
Здесь вы получаете тяжелейшую в её локализации ошибку, когда делается попытка копирования не только 80 байт, но и далеко за пределами массива x, пока случайно не встретится байт с значением 0, или/и случится ошибка нарушения защиты памяти.
Вот поэтому во многих руководствах рекомендуют везде где можно использовать strncpy() вместо strcpy().
Первый пераметр в виде src/dst сохраняет однотипность с функциями, где параметр size может быть опущен или не требуется. Например strcpy() и т.п.
Длина для многих строчных функций вида str*() не требуется исключительно и только потому, что при раьботе со строками мы работаем не с целым массивом, а только с его частью, ограниченной символом-терминатором '\0', который, по договорённости, в языке C трактуется как конец строки.
А мужики-то и не знали...
Ошибаетесь :) Значение есть и немалое. То в каком порядке вы расположите данные, напрямую даст команду компилятору то в каком порядке из загружать в стек и доставать оттуда.
Глупость сказана!
Порядок - имеет первостепенное значение.
Факультативные параметры могут идти только после обязательных и никак не наоборот.
И ещё раз повторена...
В случае передачи адреса начала массива вместо массива - передача параметра по ссылке, а не по значению, как это принято в C/C++ и где это единственный способ относительно массивов - а). указание длины массива отдельным параметром - обязательна, а б). порядок указания параметров адреса начала массива и его длины - не имеет абсолютно никакого значения.
А мужики-то и не знали...
Читайте матчасть, мужики...
RTFM ;-)
Порядок - имеет первостепенное значение.
Факультативные параметры могут идти только после обязательных и никак не наоборот.
При передаче массивов нет там никаких факультативных параметров. Не нужно путать грешное с праведным...
Просто добрый совет: вы бы свой пыл обратили на новичков. И им полезно будет что-то новое узнать и вы со старожилами не посретесь.
Просто добрый совет: вы бы свой пыл обратили на новичков. И им полезно будет что-то новое узнать и вы со старожилами не посретесь.
sadman41, пойдите матчасть почитайте ... и вдумчиво и 3 раза.
Чтоб херню не писать ... "для новичков".
Глупость сказана!
И ещё раз повторена...
Глуп тот, кто пытается толковать о том чего не понимает. Выши наезды - бездоказательная биллиберда. Я вот назову вас чайником, без объяснения принчин, и вы будете чайником ?
Так что ляпнул - отчитайся, обоснуй.
Народ, о чем мы тут толкуем с воинствующим неучем. Заканчивайте, он вона как слюной брызжет. А ссылку на матчасть дать не может :) Потому как сам ее никада не видел , матчасть эту :)))) Этот человек не понимает реализацию, для него все одинаково.
Я думаю, он за "чистый си" !
А ссылку на матчасть дать не может :)
Я для тебя матчасть, придурок. Ты спрашивай - я растолкую.
Я таких как ты переучил не одну сотню ... а некоторые из них, сердешные, так этот барьер и не приодолели.
А ссылку на матчасть дать не может :)
Я для тебя матчасть, придурок. Ты спрашивай - я растолкую.
Я таких как ты переучил не одну сотню ... а некоторые из них, сердешные, так этот барьер и не приодолели.
Случай тяжелый. Админы, как считаете разговор в таком ключе это норма ?
Слышь олежка, ты для меня просто кусок чего то непонятного, чего быть не должно :) Тобой даже подтереться нельзя :) И это , на всякий случай, "училку" свою поприжми, а то оторвут ведь :)
А ссылку на матчасть дать не может :) Потому как сам ее никада не видел , матчасть эту :))))
Ссылку тебе? Ню-ню ...
Иди, читай, просветляйся: ISO/IEC 14882:1998, ISO/IEC 14882:2003
Мне почитать хватило вот этого береда:
http://arduino.ru/forum/apparatnye-voprosy/sborka-godovogo-rele-vremeni-na-arduino#comment-350953
Сразу ясен уровень твоего понимания предмета. И твои отсылки к стандартам - ни о чем. Ты покажи где там сказано, что расположение передаваемых параметров ни на что не влияет. А то я смотрю бомбит тебя не по детски :)
А то что ты тут про массивы плел, с видом гуру, каждый школьник знает. То же мне учитель:) Умора, стандарт он дважды прочитал :)
Случай тяжелый. Админы, как считаете разговор в таком ключе это норма ?
у трупа страуса нужно спросить про ключи. О_О
у трупа страуса нужно спросить про ключи. О_О
У тебя ошипка. Воторой раз справшивать не нужно. Я уже спросил.
Я уже спросил.
ты не у тех спросил.
ты не у тех спросил.
А я не собирался спрашивать у "тех" , ты просто не понял.
Кстати, о помощи "гуру" новичкам. В соседней теме все раскрыто:
http://arduino.ru/forum/programmirovanie/bool-arr01000000-skonvertirovat-v-byte-b01000000
Что нИ реплика, то с ляпами. "Учитель года", блин :)