VariusRain
@VariusRain
музыкант-программист-конструктор

Как удалять элементы из массива в Arduino (c++)?

Приветствую всех!

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

Набросал класс, в нём хранится тот самый массив и есть функция:

String StringClass::GetNextString() {
    String result = "NONE";
    if (LastStringCount == 0) {
        return result;
    }
    randomSeed(analogRead(A1));
    int index = random(0, LastStringCount );
    result = StringList[index];
    String tmp[LastStringCount -1];
    int j = 0;
    for(int i = 0; i < LastStringCount ; i++) {
        if (i != index) {
            tmp[j] = StringList[j];
            Serial.println(tmp[j]);
            j++;
        }
    }
    LastStringCount--;
    for(int i = 0; i < LastStringCount ; i++) {
            StringList[j] = tmp[i];
        }
    }
    return result;
}

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

Очень прошу совета у более опытных товарищей. Я пробовал работать с динамическим выделением памяти через new и delete, но из-за того, что всё это работает на указателях, не смог вернуть строчное значение функции.

Катастрофически сказывается нехватка опыта.
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
VariusRain
@VariusRain Автор вопроса
музыкант-программист-конструктор
Изменяю ответ в связи с тем, что нашёл решение.

На ответ натолкнул комментарий товарища Roman
В общем решение состоит из двух частей:
1. Оставить массив строк в покое. Пусть он будет в том виде, в котором задан изначально.
2. Дополнительно создаём массив чисел, который будет хранить индексы и после выборки случайного индекса делаем "сортировку" (это скорее сдвиг одного элемента, но всё же) уже в массиве индексов
int index = random(0, LastStringCount );
    result = StringList[Indexes[index]];
    int j = 0;
    for(int i = 0; i < LastStringCount ; i++) {
        if (i != index) {
            Indexes[j] = Indexes[i];
            Serial.println(Indexes[j]);
            j++;
        }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
bool alreadyDisplayed [lastStringCount + 1];
for (int n = 0; n < lastStringCount; ++n)
    alreadyDisplayed[n] = false;
int index;
do {
    index = random(0, LastStringCount );
} while (alreadyDisplayed[index] == true);
alreadyDisplayed[index] = true;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы