String массив

vostok
Offline
Зарегистрирован: 24.12.2019

Доброго времени знатоки. подскажите пожалуйста ответы на вопросы.

1. Определяю массив 

String ves[]={};

Как правильно добавлять данные в цикле в строковый массив?

for (int i=0; stroka.length(); i++){

ves[i] = stroka;

}

Если делаю так, ничего в массив не добавляется если вывести к примеру: S

erial.print(ves[0]);

Как правильно работать с массивом типа String, добавлять и читать данные?

2. Как узнать размер (количество элементов массива?)

через цикл for не получается и через 

sizeof(ves)

тоже не работает и

sizeof(ves)/sizeof(*ves) 

не работает и через

sizeof(ves)/sizeof(ves[0]) 

тоже не работает.

 

Заранее спасибо за помощь.

 

 

vostok
Offline
Зарегистрирован: 24.12.2019

Еще вопрос, как очистить полностью Serial? 

Serial.flush();

не помогает.

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

vostok пишет:

1. Определяю массив 

String ves[]={};

Это пустой массив без элементов. В него нельзя ничего ни добавить ни записать ни прочитать.

 

В целом совет - открыть учебник и прочитать что такое массив.

vostok
Offline
Зарегистрирован: 24.12.2019

Я читал, про массивы, я возможно не до понял как создать массив с динамическим количество. т.е не фиксированный. подскажите.

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

Никак.

bwn
Offline
Зарегистрирован: 25.08.2014

vostok пишет:

Я читал, про массивы, я возможно не до понял как создать массив с динамическим количество. т.е не фиксированный. подскажите.

МК, к сожалению, даром предвидения пока не обладают. 

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

vostok пишет:

как создать массив с динамическим количество. т.е не фиксированный. подскажите.

На входе в блок (функцию) объявите его с размером, заданным в переменной, типа так:

size_t n;
...
n = ...
...
{
    String massiv[n];
    ....
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Картина маслом: ЕвгенийП подкладывает нубу аватар ;)

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

sadman41 пишет:

ЕвгенийП подкладывает нубу аватар ;)

1. Пятница, а вчерась строителя пепелацев забанили.
2. Кто скажет, что это неправильно или оно не работает, пусть первый бросит в меня камень.

Человек спросил - я ответил. Что он будет потом с этим делать - не моё свинячье дело.

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

vostok пишет:

1. Как правильно добавлять данные в цикле в строковый массив?

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

Так что правильный ответ на ваш вопрос - никак.

Цитата:
2. Как узнать размер (количество элементов массива?)

строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.

 

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

 

 

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

Блин, ну чё за приземлённость в пятницу-то! Мой же вариант нормально работает в gcc. Давайте посмотрим, что ТС дальше с ним делать будет!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.

Она сработает, чекай:


String array[6];

void setup()
{
	Serial.begin(9600);
	
	Serial.println(sizeof(array)/sizeof(array[0]));
}

void loop()
{
	
}

Выведет 6, как и положено, т.е. кол-во элементов в массиве. Работает для любых типов, к которым можно применить оператор sizeof. Что там унутре String - компилятор не волнует, а sizeof(String), емнип = 6 байт, именно столько занимают его внутренние члены (указатель на строку, переменная длины строки и пр.).

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

DIYMan пишет:

Она сработает, чекай:

Выведет 6, как и положено, т.е. кол-во элементов в массиве. Работает для любых типов, к которым можно применить оператор sizeof.

ну да, согласен, фигню сморозил. Размер обьекта String постоянный, он не включает динамическую строку

тогда почему у ТС не работает - ХЗ.

 

vostok
Offline
Зарегистрирован: 24.12.2019

sadman41 пишет:

Картина маслом: ЕвгенийП подкладывает нубу аватар ;)

 

По делу бы написал, но видимо чрезмерное ...

vostok
Offline
Зарегистрирован: 24.12.2019

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

vostok
Offline
Зарегистрирован: 24.12.2019

b707 пишет:

vostok пишет:

1. Как правильно добавлять данные в цикле в строковый массив?

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

Так что правильный ответ на ваш вопрос - никак.

Цитата:
2. Как узнать размер (количество элементов массива?)

строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.

 

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

Подумываю об этом в другом месте кода)

 

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

vostok пишет:

По делу бы написал, но видимо чрезмерное ...

Молодой человек, я Вам написал абсолютно по делу и то, что я написал - работает. То, что коллеги решили пошутить насчёт того, что Вам ещё рано использовать такие возможности, не отменяет того факта, что я точно и правильно ответил на Ваш вопрос.

Надеюсь получить Ваши извинения.

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

sadman41 пишет:

Картина маслом: ЕвгенийП подкладывает нубу аватар ;)

кстати, а что в этом не так? обычный локальный массив, вроде? в чем аватар то? :)

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

vostok пишет:

По делу бы написал, но видимо чрезмерное ...

неправильно помогаем? - а как надо?

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

b707 пишет:

кстати, а что в этом не так? обычный локальный массив, вроде? в чем аватар то? :)

Область видимости.

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

b707 пишет:
в чем аватар то? :)
Я так понял, что sadman41 этим постом высказал обоснованные сомнения в том, что ТС сумеет воспользоваться этой техникой. Типа, гуманнее было бы сказать, что нельзя, чем открывать этот ящик Пандоры с которым у ТС будет "не понос, так геморрой". Но, вот чем я провинился перед ТС, я так и не понял. Что он спросил, на то я и ответил.

Вот, кстати, подоспело:

sadman41 пишет:

Область видимости.

ну, да. И не только. Примерно это я имел в виду: "не понос, так геморрой".

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

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

sadman41 пишет:

Область видимости.

ну, да. И не только.

область видимости - это очевидно, массив локальный со всеми вытекающими.  А что "не только"?

Сорри за надоедливость, если скажете не лезть - не буду

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

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

vostok пишет:

как создать массив с динамическим количество. т.е не фиксированный. подскажите.

На входе в блок (функцию) объявите его с размером, заданным в переменной, типа так:

size_t n;
...
n = ...
...
{
    String massiv[n];
    ....
}

Это не динамический массив. Его нельзя увеличить в процессе работы.

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

rkit пишет:

Его нельзя увеличить в процессе работы.

смотря как трактовать слова "в процессе работы". В процессе работы блока - нельзя. А в процессе работы всей программы - можно

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

b707 пишет:
А что "не только"?
да, всё, что следует из локальности и динамичности. Кроме области видимости, это, например, несохранение старых значений между входами в блок, отсутствия какого-либо контроля корректности выделения памяти под массив при входе в блок, можно много ещё всяких граблей напридумывать.

А вообще, я не хочу что-либо писать в теме пока не получу извинений от ТС. Обойдётся.

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

b707 пишет:

rkit пишет:

Его нельзя увеличить в процессе работы.

смотря как трактовать слова "в процессе работы". В процессе работы блока - нельзя. А в процессе работы всей программы - можно

Никак нельзя.

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

b707 и rkit, не спорьте о терминах. Правильное название этой штуки - "массив переменной длины" ("variable length array").

Кстати, если интересно, с такими массивами вполне нормально работает sizeof. Разумеется, он выполняется динамически.

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

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

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

ок, спасибо. Это все мне известно, думал может что еще.

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

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:
чем я провинился перед ТС, я так и не понял.

Ты виноват уж тем, что он не понял твоего ответа.

ЕвгенийП пишет:
Надеюсь получить Ваши извинения.

Правда надеешься? :-)

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

b707 пишет:
не сердитесь
Да, о чём Вы? Разве я давал повод к таким предположениям?

Ворота пишет:
Правда надеешься? :-)
Чем язвить, скажите лучше, когда прошивка для метеостанции готова будет? :-)

bwn
Offline
Зарегистрирован: 25.08.2014

Ворота пишет:

Правда надеешься? :-)

Как гласят народные сказания: Девушка Надежда, умирает последней; Надежда, наш компас земной; Надежды юношей питают; Куда не целуй, ой, это про неофитов.))))