Работа с массивом, размер массива sizeof()

bortnik27
Offline
Зарегистрирован: 23.06.2019

Подскажите почему, а главное что делать, вызываю функцию sizeof() она выдает неверные значения, ну или если быть корректным, не те что я жду, а именно, код:

int daysofwork[] = {2,4};
int val = 0;
void setup {
Serial.begin(9600);
}
void loop {
 val = sizeof(daysofwork);
Serial.println(val);
}

в данном случае val = 4, если элемента 3 то шести, как я понял она возвращает количество байт занимаемых массивом, а как получить в числовом выражении количество элементов массива или длину массива?

negavoid2
Offline
Зарегистрирован: 06.05.2020
val = sizeof(daysofwork) / sizeof(int);

 

bortnik27
Offline
Зарегистрирован: 23.06.2019

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

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

bortnik27 пишет:

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

Если б догадались - сами бы и сделали наверно.

Это не костыль, а широко используемый метод получения размера массива.  Что вы тут хотите "исправить" - не понятно. Если вы спрашиваете о какой-нибудь системной функции, которая бы возвращала длину массива - такой в С/С++ нет.

Что вы подразумеваете под "реальной длиной" - я вообще не в курсе. Вы случайно со скриптовыми языками не путаете?

На самом деле в языке Си ситуация, когда автор программы не знает длину созданного им самим массива - довольно редкая, наверно поэтому отдельной функции под это не придумали.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

uint32_t array[] = {1,2,3,4,5,6,7,8};

без привязки к конкретному типу данных:

size = sizeof(array)/sizeof(array[0]);

конпилятор сам вычислит всё, что надо и подставит

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Дополню предыдущего оратора:
sizeof(array) вернёт количество байт всего массива
а,
sizeof(array[0]) вернёт количество байт одного элемента
Ну и соответственно разделив первое на второе, получим количество элементов массива

rkit
Offline
Зарегистрирован: 23.11.2016
template <typename T, size_t N> constexpr size_t countof(T const (&)[N]) { return N; }

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

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

rkit пишет:

Вариант с sizeof втихую даст неправильный результат,  ...

sizeof всегда даёт правильный результат.

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

ЕвгенийП пишет:

rkit пишет:

Вариант с sizeof втихую даст неправильный результат,  ...

sizeof всегда даёт правильный результат.

sizeof, может и всегда, а вот вариант - может дать и неправильный.

bortnik27
Offline
Зарегистрирован: 23.06.2019

b707 пишет:

bortnik27 пишет:

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

Если б догадались - сами бы и сделали наверно.

Это не костыль, а широко используемый метод получения размера массива.  Что вы тут хотите "исправить" - не понятно. Если вы спрашиваете о какой-нибудь системной функции, которая бы возвращала длину массива - такой в С/С++ нет.

Что вы подразумеваете под "реальной длиной" - я вообще не в курсе. Вы случайно со скриптовыми языками не путаете?

На самом деле в языке Си ситуация, когда автор программы не знает длину созданного им самим массива - довольно редкая, наверно поэтому отдельной функции под это не придумали.

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

Я пишу программу для общего пользования и мне стремно что в цикле у меня i < val, а не i<sizeof(array); если мы пишем массив, а часто сами заносим его размер, то странно что нет такой функции, вот для меня это и есть костыль. 

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

bortnik27 пишет:
отдельная переменная меня напрягает.
А кто Вам сказал, что она должна быть переменной? Обзовите её const - будет константа. А определите через define или обзовёте constexpr - будет ещё круче - константа времени компиляции. Не понимаю, почему константа Вас напрягает больше, чем функция?

bortnik27 пишет:

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

Это не костыль, а самый что ни на есть мэйнстримовый метод получения реального размера массива. Только не как в №1, а как в #4

bortnik27 пишет:
Я пишу программу для общего пользования

Не зная таких простых вещей? Ну, удачи!

bortnik27 пишет:
мне стремно
Стрёмно - не пишите. Ещё Рая Абельская советовала: "не хочите - не ешьте".

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

дел

bortnik27
Offline
Зарегистрирован: 23.06.2019

не понимаю зачем столько желчи

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

bortnik27 пишет:

не понимаю зачем столько желчи

просто у нас велосипеда нет... :((

Жена просит добавить: да и водка кончилась! Вот! И велосипед, в общем,  не так важен.

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

bortnik27 пишет:

не понимаю зачем столько желчи


Ну а как еще реагировать на человека, который вместо изучения норм языка - обьявляет их неправильными? Разве это можно обсуждать серьезно?

вы похоже ничему не научились за полтора года.... Ни программированию на С, ни общению на форумах:)

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

bortnik27 пишет:

не понимаю зачем столько желчи

Это Вы про посты №№ 2 и 9? Я тоже не понимаю :-(

bortnik27
Offline
Зарегистрирован: 23.06.2019

b707 пишет:
bortnik27 пишет:

не понимаю зачем столько желчи

Ну а как еще реагировать на человека, который вместо изучения норм языка - обьявляет их неправильными? Разве это можно обсуждать серьезно? вы похоже ничему не научились за полтора года.... Ни программированию на С, ни общению на форумах:)

Где ж я их неправильными объявил? Сказал странно, что нет такой функции или оператора. К сожалению да, программированию так и не удалось уделить столько времени сколько хотелось бы, а на счет общения на форуме, писать человеку "если б догадались" крайне не уважительно, тем более вы меня не знаете и не знаете мои интеллектуальные способности, да я не программист, к сожалению, но это никак не говорит о моих возможностях найти закономерность где 2=4 3=6, как то оскорбительно звучит, не находите?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

bortnik27 пишет:
писать человеку "если б догадались" крайне не уважительно

И? Что сказать хотел? В сети нет и  не может быть априорного уважения. Покажи за что тебя следует уважать. Это не светский раут и ханжество неуместно. В этом основное положительно достоинство сети, в отличии от очных форм общения.