Генератор строк не работает должным образом

Я пытаюсь построить случайную строку, сохранить ее в EEPROM как int, затем прочитать ее и вывести.
Если я даю ему предопределенную строку, тогда он работает нормально. Но что-то не так с генератором случайных строк.

  String output;
  char letter;

  String mystr=""; //"АВCabc123..";
  String characters = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
  String numbers = "0123456789";
  String other = "<>!.,()?|=&%¤#";

  // добавляем случайные символы в пустую строку
  for(int i=0 ; i < 12 ; i++){
    mystr += characters[random(0, characters.length())];
  }
  // добавляем два числа, одно другое и еще два символа
  mystr += numbers[random(0, numbers.length())];
  mystr += numbers[random(0, numbers.length())];
  mystr += other[random(0, other.length())];
  mystr += characters[random(0, characters.length())];
  mystr += characters[random(0, characters.length())];

  // зациклить строку и поместить по одному символу в каждый адрес EEPROM
  for(int i=0 ; i < mystr.length() ; i++)
  {
    EEPROM.writeInt( i,mystr[i] );
  }

  // прочитать строку обратно из EEPROM
  for(int i=0 ; i < 17 ; i++){
    letter = EEPROM.readInt(i);
    output += letter;
  }

Если я запущу код, вывод будет "H". Каждый раз.
Если я использую предопределенную строку «ABCabc123..», то она работает правильно.

Что я делаю неправильно при создании mystr?

, 👍0

Обсуждение

EEPROM.writeInt() и EEPROM.readInt() не похожи на стандартные функции Arduino. Где ты достал их? Также обратите внимание, что «¤» не является символом ASCII. Это занимает два байта, если вы пишете его в UTF-8., @Edgar Bonet

@EdgarBonet Я не могу включить EEPROM.h . Думаю, его нет на платах Digispark. Я нашел EEPROM.h и скачал его, но когда я его включил, я получил ошибку, что Debug.h отсутствует. Поэтому я просто отказался от этого и нашел другую библиотеку., @Andreas


1 ответ


1

Ваша первая ошибка — использовать String. Не. Вместо этого используйте массив char.

char mystr[18]; // Место для 17 символов плюс завершающий символ NULL

Ваши строковые константы также должны быть массивами символов, а не переменными String. А лучше поместить их в PROGMEM:

const char characters[] PROGMEM = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
const char numbers[] PROGMEM = "0123456789";
const char other[] PROGMEM = "<>!.,()?|=&%¤#";

Теперь заполнение целевого массива выглядит следующим образом:

for(int i=0 ; i < 12 ; i++){
  mystr[i] = pgm_read_byte_near(characters + random(0, 50));
}

mystr[12] = pgm_read_byte_near(numbers + random(0, 10));
mystr[13] = pgm_read_byte_near(numbers + random(0, 10));
mystr[14] = pgm_read_byte_near(other + random(0, 14));
mystr[15] = pgm_read_byte_near(characters + random(0, 50));
mystr[16] = pgm_read_byte_near(characters + random(0, 50));
mystr[17] = 0; // Не забудьте NULL...

Ваша вторая проблема связана с использованием EEPROM.writeInt и EEPROM.readInt. Они предназначены для записи целых значений, а не символов. Вместо этого просто используйте EEPROM.read и EEPROM.write:

for (int i = 0; i < 17; i++) {
    EEPROM.write(i, mystr[i]);
}

Затем, чтобы прочитать обратно:

for (int i = 0; i < 17; i++) {
    mystr[i] = EEPROM.read(i);
}
// И не забудьте завершить строку...
mystr[17] = 0;
,

Я не могу заставить это работать. Во-первых, похоже, что рандом не меняется между прогонами. Каждый раз я получаю одну и ту же строку, только если я что-то меняю, я получаю другой результат. Когда я вывожу массив, символ за символом, я получаю более короткую строку, чем должна быть. 7 символов Åo-Åyäv И два из них не входят в иероглиф char., @Andreas

Случайно не случайно, нет. Это *псевдо*случайно. Вы должны установить «начальное число», чтобы изменить «случайную» последовательность., @Majenko

Я понимаю. Тогда я попробую использовать другой подход., @Andreas