Программерские приёмчики: размер String-массива.

Dimanoss
Offline
Зарегистрирован: 29.05.2016
День добрый.  Столкнулся с забавной несуразностью в языке: если есть необходимость, например, перебрать в цикле String[], необходимо где-то (отдельной переменной) жёстко определять количество элементов в массиве. :-(  Встроенная в релизацию языка функция sizeof() возвращает размер в байтах, что, при динамическом определении количества элементов массива, может удовлетворять лишь в случае, когда все элементы массива имеют одинаковую длину.
 
Вопрос к Зубрам Ардуинопрограммирования: есть ли в вашем арсенале какие-то ухищрения, способные обойти вышеупомянутое? 
rkit
Offline
Зарегистрирован: 23.11.2016

Есть один секрет, доступный только самым великим гуру программирования. Перед программированием нужно прочитать документацию. В ней всё написано.

b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

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

Открою великий секрет - в  языке Си "все элементы массива имеют одинаковую длину" всегда, на то он и массив.

присоединяюсь к предыдущему оратору - может вам что-то почитать ПРЕЖДЕ чем задавать вопросы., а то сейчас вы даже спросить грамотно не можете.

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

Dimanoss пишет:

День добрый. 

Здравствуйте
Dimanoss пишет:
Столкнулся с забавной несуразностью в языке
Бывает. Я вот прямо в этой теме столкнулся с забавной несуразностью в Вашей голове. Все мы с чем-то сталкиваемся.

А если хотите задать вопрос и получить ответ, приведите код (только полностью), чтобы было видно какие именно массивы Вы имеете в виду.

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

Может быть это все потому, что массив вида:
String arr[3]={"abc","defgh","ijklmno"};
По сути своей является двумерным ?

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

Kakmyc пишет:
Может быть это все потому, что массив вида: String arr[3]={"abc","defgh","ijklmno"}; По сути своей является двумерным ?

Ну, во, первых не является. А во-вторых, давайте сейчас разведём кофейную гущу и начнём гадать какого там вида у ТС массив.

Если ему надо - приведёт код, а если не надо, так нам-то оно нафига?

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

Хотя опять же все с виду нормально считает в таком случае:

 

#include <iostream.h>
#include <string.h>
string arr[]={"abc","defg","hijklmno"};

int main()
{
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
	std::cout<<arr[i]<<"+"<<endl;
	}
}

//Результат

abc+
defg+
hijklmno+

[Program finished]

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Kakmyc пишет:

Хотя опять же все с виду нормально считает в таком случае:

а почему он должен иначе считать? - это одномерный массив. И элементы, опять же, одинаковой длины :)

код, по сути, вот от такого ничем не отличается:

int arr[]={1, 2, 3};

int main()
{
	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
	......
	}
}

 

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

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

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

Почитал , узнал про string.length() и string.capacity().
А что же тогда возвращает sizeof() ?

rkit
Offline
Зарегистрирован: 23.11.2016

В описании sizeof и в определении String, очевидно.

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

Kakmyc пишет:
А что же тогда возвращает sizeof() ?
Размер экземпляра класса String. Он всегда одинаковый, независимо от длины строки.

brokly
brokly аватар
Онлайн
Зарегистрирован: 08.02.2014

Kakmyc пишет:
Почитал , узнал про string.length() и string.capacity(). А что же тогда возвращает sizeof() ?

Ты просто посмотри КАКОЙ размер возвращает sizeof. И подумай, на размер чего он смахивает ? 

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

brokly пишет:
И подумай, на размер чего он смахивает ?
Даже боюсь представить ... размер правда имеет значение?

Dimanoss
Offline
Зарегистрирован: 29.05.2016
нет, я понимаю, что удел Великих - надувать щёки и отсылать читать документацию.  :-)   Но вопрос был: так как в языке нет конструкции, подобной 
 
String arr[] = {"a", "bbbb", "cccccccccccccc"};
int arrCount = arr.count();
 
тo как КОНКРЕТНО ВЫ получаете количество элементов String-массива?  Элементы массива, напомню, разной длины.
 
Пример уважаемого Kakmyc'a использует перебор.  Как делаете ВЫ? :-)
b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

 вопрос был: так как в языке нет конструкции, подобной 
 
String arr[] = {"a", "bbbb", "cccccccccccccc"};
int arrCount = arr.count();
 
тo как КОНКРЕТНО ВЫ получаете количество элементов String-массива?  Элементы массива, напомню, разной длины.
 
элементы этого массива ОДИНАКОВОЙ длины. Об этом НЕСКОЛЬКО РАЗ написано выше. Вы хотя бы пытайтесь вникнуть в чужие ответы,  если уж не хотите читать документацию.
 
Цитата:
Пример уважаемого Kakmyc'a использует перебор.  Как делаете ВЫ? :-)

неn там никакого перебора. Число элементов массива в коде Кактуса вычисляется в одно действие. без всякого перебора:



int arrCount =  sizeof(arr)/ sizeof(arr[0]);

 

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

 Вы хотя бы пытайтесь вникнуть в чужие ответы,  если уж не хотите читать документацию.

Ждать, что человек, не хотящий читать документацию, будет читать ответы - признак безумия.

b707
Онлайн
Зарегистрирован: 26.05.2017

rkit пишет:

Ждать, что человек, не хотящий читать документацию, будет читать ответы - признак безумия.

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

Dimanoss
Offline
Зарегистрирован: 29.05.2016

b707 пишет:

элементы этого массива ОДИНАКОВОЙ длины. 

 

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

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Dimanoss пишет:

b707 пишет:

элементы этого массива ОДИНАКОВОЙ длины. 

 

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

Логично. Выходит, что в памяти резервируется объём для размера указателя на объект String помноженный на количество таковых объектов.

b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

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

не угадали. Создайте несколько экземпляров String разной длины, от пары символов до пары строк текста. Потом измерьте их размер посредством sizeof() - вы убедитесь

а) в том что размер экземпляра String не зависит от хранящейся в нем строки и

b) что этот размер может быть МЕНЬШЕ длины этой строки

Читайте документацию по String

Dimanoss
Offline
Зарегистрирован: 29.05.2016

sadman41 пишет:

...в памяти резервируется объём для размера указателя на объект String помноженный на количество таковых объектов.

 

да, похоже на то.  Спасибо.  

b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

да, похоже на то.  Спасибо.  

да он, похоже, сомневается??

Слушайте, ну не позорьтесь уже, ЧИТАЙТЕ ДОКУМЕНТАЦИЮ!

Dimanoss
Offline
Зарегистрирован: 29.05.2016

b707 пишет:

...ну не позорьтесь уже, ЧИТАЙТЕ ДОКУМЕНТАЦИЮ!

Уважаемый, если бы я спросил, а читать ли мне документацию, а Вы бы мне ответили, что - да, читать, то всё было бы правильно.  Здесь же я задал вопрос, потому, что НЕ НАШЁЛ там решения возникшей проблемы или банально НЕ ПОНЯЛ.  Для чего, собственно, форум нужен?

Если Вы и отсылаете к документации, не сочтите за труд дополнить своё праведное возмущение ссылочкой.  Пожалуйста.

 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

Уважаемый, если бы я спросил, а читать ли мне документацию, а Вы бы мне ответили, что - да, читать, то всё было бы правильно. 

если у вас вообще возникает вопрос "А читать ли мне документацию?" - то делать вам в программировании и конкретно на этом форуме нечего.

rkit
Offline
Зарегистрирован: 23.11.2016

Dimanoss пишет:

Здесь же я задал вопрос, потому, что НЕ НАШЁЛ там решения возникшей проблемы или банально НЕ ПОНЯЛ.  Для чего, собственно, форум нужен?

Уж не для того, чтобы вестись на такое очевидноe вранье.

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

Dimanoss пишет:

нет, я понимаю, что удел Великих - надувать щёки и отсылать читать документацию.  :-) ... как КОНКРЕТНО ...

Нет, я понимаю, что удел альтернативно умеющих читать, топать ногой и требовать КОНКРЕТНЫХ ответов!

Но КОНКРЕТНЫЙ ответ был дан ещё в посте #6 и посте #7 -

sizeof(arr) / sizeof(arr[0])

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

Это видимо, вина великих, что Вы ответа не заметили и не поняли?

Dimanoss
Offline
Зарегистрирован: 29.05.2016

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

...КОНКРЕТНЫЙ ответ был дан ещё в посте #6 и посте #7  и что-то, благодарности отвечающим от Вас не поступило, только гнилые наезды.

 

По постам: пост 19 разяснил, как это работает (читайте пост 21).  Благодарность была озвучена.  Замечу однако, что лишь пост 6 содержал конкретный пример, остальные Гуру лишь истерили, что новичкам тут нечего делать, что где-то про это уже написано, и что это надо найти и прочитать.  Тем не менее - спасибо, как оно работает, стало понятно.

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

Dimanoss, я уже понял Вашу отмазку. Моё отношение к ней и к Вашим вопросам вообще, Вы, наверное, уже поняли по моему ответу в Вашей новой теме. Оно не изменилось после этого Вашего поста.

Dimanoss
Offline
Зарегистрирован: 29.05.2016

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

Моё отношение ... к Вашим вопросам вообще.....

 

если ЕвгенийП, признанный здесь знаток организации памяти, не смог одной фразой ответить на вопрос, видимо, вопрос был не таким уж и простым. :-)  Не смог или не захотел.

 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Dimanoss пишет:

если ЕвгенийП, признанный здесь знаток организации памяти, не смог одной фразой ответить на вопрос, видимо, вопрос был не таким уж и простым. :-)

теперь, когда вы знаете ответ - перечитайте вопрос в первом сообщении. Если вы будете честны перед собой - вы увидите, что этот вопрос не простой, он глупый. А это не одно и тоже, на глупые вопросы не так просто ответить.