String массив
- Войдите на сайт для отправки комментариев
Пт, 14/02/2020 - 05:14
Доброго времени знатоки. подскажите пожалуйста ответы на вопросы.
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])
тоже не работает.
Заранее спасибо за помощь.
Еще вопрос, как очистить полностью Serial?
не помогает.
1. Определяю массив
Это пустой массив без элементов. В него нельзя ничего ни добавить ни записать ни прочитать.
В целом совет - открыть учебник и прочитать что такое массив.
Я читал, про массивы, я возможно не до понял как создать массив с динамическим количество. т.е не фиксированный. подскажите.
Никак.
Я читал, про массивы, я возможно не до понял как создать массив с динамическим количество. т.е не фиксированный. подскажите.
МК, к сожалению, даром предвидения пока не обладают.
как создать массив с динамическим количество. т.е не фиксированный. подскажите.
На входе в блок (функцию) объявите его с размером, заданным в переменной, типа так:
Картина маслом: ЕвгенийП подкладывает нубу аватар ;)
ЕвгенийП подкладывает нубу аватар ;)
1. Пятница, а вчерась строителя пепелацев забанили.
2. Кто скажет, что это неправильно или оно не работает, пусть первый бросит в меня камень.
Человек спросил - я ответил. Что он будет потом с этим делать - не моё свинячье дело.
1. Как правильно добавлять данные в цикле в строковый массив?
В C/C++ массив - это непрерывный участок оперативной памяти заранее заданного размера. Таким образом, в момент создания массива контроллер уже должен знать число элементов.
Так что правильный ответ на ваш вопрос - никак.
строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.
Вообще , идея создавать массив обьектов - не слишком эффективна. Правильнее было бы создать массив ссылок на обьекты. Создав заранее массив ссылок на String достаточного размера (благо ссылки занимают немного места) - вы могли по ходу программы добавлять и удалять из него отдельные строки
Блин, ну чё за приземлённость в пятницу-то! Мой же вариант нормально работает в gcc. Давайте посмотрим, что ТС дальше с ним делать будет!
строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.
Она сработает, чекай:
Выведет 6, как и положено, т.е. кол-во элементов в массиве. Работает для любых типов, к которым можно применить оператор sizeof. Что там унутре String - компилятор не волнует, а sizeof(String), емнип = 6 байт, именно столько занимают его внутренние члены (указатель на строку, переменная длины строки и пр.).
Она сработает, чекай:
Выведет 6, как и положено, т.е. кол-во элементов в массиве. Работает для любых типов, к которым можно применить оператор sizeof.
ну да, согласен, фигню сморозил. Размер обьекта String постоянный, он не включает динамическую строку
тогда почему у ТС не работает - ХЗ.
Картина маслом: ЕвгенийП подкладывает нубу аватар ;)
По делу бы написал, но видимо чрезмерное ...
Спасибо всем кто постарался помочь, я не досмотрел в другом куске кода, там ... очищал данные и не заметил что очищаются они после записи данных в массив.
1. Как правильно добавлять данные в цикле в строковый массив?
В C/C++ массив - это непрерывный участок оперативной памяти заранее заданного размера. Таким образом, в момент создания массива контроллер уже должен знать число элементов.
Так что правильный ответ на ваш вопрос - никак.
строчка sizeof(ves)/sizeof(ves[0]) сработала бы, если бы речь шла о простых типах, как например int. Но String - это обьект с динамическим размером, поэтому в результате получается ерунда.
Вообще , идея создавать массив обьектов - не слишком эффективна. Правильнее было бы создать массив ссылок на обьекты. Создав заранее массив ссылок на String достаточного размера (благо ссылки занимают немного места) - вы могли по ходу программы добавлять и удалять из него отдельные строки
Подумываю об этом в другом месте кода)
По делу бы написал, но видимо чрезмерное ...
Молодой человек, я Вам написал абсолютно по делу и то, что я написал - работает. То, что коллеги решили пошутить насчёт того, что Вам ещё рано использовать такие возможности, не отменяет того факта, что я точно и правильно ответил на Ваш вопрос.
Надеюсь получить Ваши извинения.
Картина маслом: ЕвгенийП подкладывает нубу аватар ;)
кстати, а что в этом не так? обычный локальный массив, вроде? в чем аватар то? :)
По делу бы написал, но видимо чрезмерное ...
неправильно помогаем? - а как надо?
кстати, а что в этом не так? обычный локальный массив, вроде? в чем аватар то? :)
Область видимости.
Вот, кстати, подоспело:
Область видимости.
ну, да. И не только. Примерно это я имел в виду: "не понос, так геморрой".
Область видимости.
ну, да. И не только.
область видимости - это очевидно, массив локальный со всеми вытекающими. А что "не только"?
Сорри за надоедливость, если скажете не лезть - не буду
как создать массив с динамическим количество. т.е не фиксированный. подскажите.
На входе в блок (функцию) объявите его с размером, заданным в переменной, типа так:
Это не динамический массив. Его нельзя увеличить в процессе работы.
Его нельзя увеличить в процессе работы.
смотря как трактовать слова "в процессе работы". В процессе работы блока - нельзя. А в процессе работы всей программы - можно
А вообще, я не хочу что-либо писать в теме пока не получу извинений от ТС. Обойдётся.
Его нельзя увеличить в процессе работы.
смотря как трактовать слова "в процессе работы". В процессе работы блока - нельзя. А в процессе работы всей программы - можно
Никак нельзя.
b707 и rkit, не спорьте о терминах. Правильное название этой штуки - "массив переменной длины" ("variable length array").
Кстати, если интересно, с такими массивами вполне нормально работает sizeof. Разумеется, он выполняется динамически.
всё, что следует из локальности и динамичности. Кроме области видимости, это, например, несохранение старых значений между входами в блок, отсутствия какого-либо контроля корректности выделения памяти под массив при входе в блок, можно много ещё всяких граблей напридумывать.
ок, спасибо. Это все мне известно, думал может что еще.
Вы. если что, не сердитесь на мои вопросы, я никогда всерьез не изучал С-С++, поэтому в сообщениях опытных участников постоянно открываю для себя "сокровенное знание".
Ты виноват уж тем, что он не понял твоего ответа.
Правда надеешься? :-)
Правда надеешься? :-)
Как гласят народные сказания: Девушка Надежда, умирает последней; Надежда, наш компас земной; Надежды юношей питают; Куда не целуй, ой, это про неофитов.))))