Массив строк

YaSerg
Offline
Зарегистрирован: 02.03.2017

Всем привет!

Не очень понятна работа массива со строками. В частности на примере следующего кода сформирую вопросы:


char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};
 
void setup(){
Serial.begin(9600);
}
 
void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}

1. Как создать пустой массив для последующего доавления строчных элементов?
2. Как добавлять в такой массив элементы не исключая старые?
3. Как узнать размер такого массива, чтобы в последчтвии перебрать построчно?
4. Как очистить массив.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

YaSerg пишет:

1. Как создать пустой массив для последующего доавления строчных элементов?
2. Как добавлять в такой массив элементы не исключая старые?
3. Как узнать размер такого массива, чтобы в последчтвии перебрать построчно?
4. Как очистить массив.

1. массивы пустыми не бывают.

2. никак.

3. ты это должен знать при создании массива.

4. никак.

YaSerg
Offline
Зарегистрирован: 02.03.2017

YaSerg пишет:

2. Как добавлять в такой массив элементы не исключая старые?

Возможно тогда, как вариант, перезаписать массив создав его снова и перезаписав (перебирая с добавлением нового элемента) элементы с новым.

YaSerg пишет:

3. Как узнать размер такого массива, чтобы в последчтвии перебрать построчно?

sizeof(char) это не то пальто?

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

YaSerg пишет:

1. Как создать пустой массив для последующего доавления строчных элементов?

2. Как добавлять в такой массив элементы не исключая старые?
3. Как узнать размер такого массива, чтобы в последчтвии перебрать построчно?
4. Как очистить массив.

Если Вам нужна такая продвинутая функциональность, то Нужно просто создать класс Array со всеми необходимыми методами и пользовать на здоровье (по анаогии хоть с Array в JScript). Можно попробовать выдрать готовую реализацию Array из какого-нибудь обощённого STL или ещё откуда - их готовых 100500.

Насколько всё это будет убийственно для памяти и других ресурсов - тут Вы сам себе злобный Буратино.

В С++ ведь настоящих массивов нет, есть только индексируемые области памяти :)

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

YaSerg пишет:

1. Как создать пустой массив для последующего доавления строчных элементов?
2. Как добавлять в такой массив элементы не исключая старые?
3. Как узнать размер такого массива, чтобы в последчтвии перебрать построчно?
4. Как очистить массив.

1. Пустой - по-моему никак. Но можно создать массив заранее оговоренного размера с пустыми элементами. Поскольку этот массив будет содержать только указатели на строки, пустые элементы не будут занимать много места.

char *strs[NUMBER_OF_STRINGS];

2. При условии обьявления массива указателей, как в п. 1 -

strs[i] = "bar";
strs[i] = "foo"; 

или

strcpy(strs[i], "foo");

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

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

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

Вообще-то в GCC есть STL'вский std::array, но в поставке ардуино это благополучно выброшено. Хотите - можете перейти на Studio - там наверняка есть (хотя, не проверял).

strarbit
Offline
Зарегистрирован: 12.06.2016

หนังสือยอดเยี่ยม Замечательная книга
C++ How to Program - Paul J. Deitel, Harvey M. Deitel

YaSerg
Offline
Зарегистрирован: 02.03.2017

b707 пишет:

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

А что за пустая ссылка? Недопонимаю немного.

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

b707 пишет:

2. При условии обьявления массива указателей, как в п. 1 -

char *strs[NUMBER_OF_STRINGS];
strs[i] = "bar";
strs[i] = "foo"; 

или

strcpy(strs[i], "foo");

Должен поправится, утром в п.2 сообщения #2 написал фигню, странно что гуру промолчали. Первая строчка обьявляет только массив пустых указателей, то есть указателей, которые никуда не указывают. Если попытаться присвоить членам этого массива строки или скопировать их туда функцией strcpy - мы будем писать в неразмеченную память и это закончится печально. Прежде чем помещать в массив строки, необходимо выделить для них память функцией malloc

.

Правильно так

char *strs[NUMBER_OF_STRINGS]; 
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

b707 пишет:

Правильно так

char *strs[NUMBER_OF_STRINGS]; 
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");

ты проверял?

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

Клапауций 112 пишет:

ты проверял?

Неа. Что, опять не так?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если вам хочется маятся , то займитесь перегрузкой операторов.

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

qwone пишет:

Если вам хочется маятся , то займитесь перегрузкой операторов.

нет, мне не хочется :) Я просто за правду :)

 

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

qwone пишет:

Если вам хочется маятся , то займитесь перегрузкой операторов.

А что в ней такого "маятного". Красивое решение, позволяющее инкапсулировать всю мелочёвку.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А я ссылку забыл вставить. http://cppstudio.com/post/10058/