Почему это занимает больше байта?

Я заменяю только часть своего кода, где хочу использовать первый метод, но, как вы можете видеть, размер моего скетча немного увеличивается

//if(iBPM >= 40 || iBPM <= 170 )
      {
      char iBPMwav[50];
      String thisString = String(iBPM);
      String stringThree =  "n" + thisString;
      stringThree =  stringThree + ".wav";
      stringThree.toCharArray(iBPMwav, 50); 
      tmrpcm.play(iBPMwav);   
      }

Sketch использует 29678 байт (100%)

Это просто, но в конце концов я хочу перейти от числа 40 к 170, и поэтому я хочу использовать первый метод.

//if(iBPM >= 40 || iBPM <= 170 )
  {
      if(iBPM == 71)
tmrpcm.play("n71.wav"); 
  else if(iBPM == 72)
tmrpcm.play("n72.wav");
  else if(iBPM == 73)
tmrpcm.play("n73.wav");  
  else if(iBPM == 74)
tmrpcm.play("n74.wav");     
  else if(iBPM == 75)
tmrpcm.play("n75.wav"); 
  else if(iBPM == 76)
tmrpcm.play("n76.wav"); 
  else if(iBPM == 77)
tmrpcm.play("n77.wav"); 
  else if(iBPM == 78)
tmrpcm.play("n78.wav"); 
  else if(iBPM == 79)
tmrpcm.play("n79.wav"); 
  else if(iBPM == 80)
tmrpcm.play("n80.wav"); 
  else if(iBPM == 81)
tmrpcm.play("n81.wav");
  else if(iBPM == 82)
tmrpcm.play("n82.wav");  
  else if(iBPM == 83)
tmrpcm.play("n83.wav");     
  else if(iBPM == 84)
tmrpcm.play("n84.wav"); 
  else if(iBPM == 85)
tmrpcm.play("n85.wav"); 
  else if(iBPM == 86)
tmrpcm.play("n86.wav"); 
  else if(iBPM == 87)
tmrpcm.play("n87.wav"); 
  else if(iBPM == 89)
tmrpcm.play("n89.wav");
  else if(iBPM == 90)
tmrpcm.play("n90.wav");
  else if(iBPM == 91)
tmrpcm.play("n91.wav"); 
  else if(iBPM == 92)
tmrpcm.play("n92.wav");
  else if(iBPM == 93)
tmrpcm.play("n93.wav");  
  else if(iBPM == 94)
tmrpcm.play("n94.wav");     
  else if(iBPM == 95)
tmrpcm.play("n95.wav"); 
  else if(iBPM == 96)
tmrpcm.play("n96.wav"); 
  else if(iBPM == 97)
tmrpcm.play("n97.wav"); 
  else if(iBPM == 98)
tmrpcm.play("n98.wav"); 
  else if(iBPM == 99)
tmrpcm.play("n99.wav");
  else if(iBPM == 100)
tmrpcm.play("n100.wav"); 
  else if(iBPM == 101)
tmrpcm.play("n101.wav"); 
  else if(iBPM == 102)
tmrpcm.play("n102.wav");                                                     
else 
 tmrpcm.play("n170.wav");
}

Sketch использует 29024 байта (101%)

, 👍0

Обсуждение

Вы используете класс String, который довольно мощный и не легкий. Всегда рекомендуется НЕ использовать класс String на микроконтроллерах., @Kwasmich

Знаете ли вы, что iBPM >= 40 || iBPM <= 170 всегда верно?, @Edgar Bonet

@EdgarBonet Нет, я не знал, @Noajm IsMy Name

Затем вы должны узнать, что означают операторы >=, <= и ||., @Edgar Bonet

@EdgarBonet Да, я просмотрел это после того, как вы упомянули и узнали откуда-то еще. Скажи мне об этом, какая огромная ошибка, парень, ха-ха., @Noajm IsMy Name


2 ответа


Лучший ответ:

2

Я предлагаю использовать более простые имена файлов (одинаковый размер, всегда трехзначные числа)

/// Возвращаем текст "n000.wav" ... "n255.wav"
/// в зависимости от параметра
char* makeFileName(byte i) {    
  static char name[9] = "nxxx.wav";
  byte digit = i/100;
  name[1] = '0' + digit;
  i -= digit*100; 
  digit = i/10;
  name[2] = '0' + digit; 
  i -= digit*10;
  name[3] = '0' + i;

  return name;
}
,

Мне кажется умным. Я попробую сегодня., @Noajm IsMy Name

Хорошо, мне нравится твоя идея... изменение имени файлов будет для меня расшатыванием маховика. Вместо этого я сделал две версии вашего кода: первую для "nxx.wav" и одну для "nxxx.wav"., @Noajm IsMy Name


1

Хотя класс Strings делает программу C/C++ простой для понимания и сопровождения, как указано в комментариях, использование класса Strings требует интенсивного использования памяти, и его следует избегать при нехватке памяти. Например, встроенные процессоры, используемые в большинстве платформ Arduino.

Вот 2 примера, где Stings используется и не используется. Обратите внимание на сокращение с 2326 байт до 734 байт памяти программы, необходимой для хранения скетча во встроенном процессоре.

void setup() 
{
}

void loop() 
{
  uint8_t iBPM;
  uint8_t pointer;
  for(iBPM = 40; iBPM <= 170; iBPM++)
  {
    char iBPMwav[50];
    String thisString = String(iBPM);
    String stringThree =  "n" + thisString;
    stringThree =  stringThree + ".wav";
    stringThree.toCharArray(iBPMwav, 50); 
//  tmrpcm.play(iBPMwav);   
  }
}

Sketch использует 2326 байт (7%) места для хранения программ. Максимум 32256 байт. Глобальные переменные используют 27 байт (1%) динамической памяти...

void setup() 
{
}

void loop() 
{
  uint8_t iBPM;
  uint8_t pointer;
  for(iBPM = 40; iBPM <= 170; iBPM++)
  {
    char iBPMwav[50];
    pointer = 0;
    char temp_str[10];
//  String thisString = String(iBPM);
//  String stringThree =  "n" + thisString;
//  stringThree =  stringThree + ".wav";
//  stringThree.toCharArray(iBPMwav, 50); 
    itoa(iBPM, temp_str, 10);
    if(iBPM < 100)
    {
      strncpy(&iBPMwav[pointer],"n0",2);
      pointer += 2;
      strncpy(&iBPMwav[pointer],temp_str,2);
      pointer += 2;
    }
    else
    {
      strncpy(&iBPMwav[pointer],"n",1);
      pointer += 1;
      strncpy(&iBPMwav[pointer],temp_str,3);
      pointer += 3;
    }
    strncpy(&iBPMwav[pointer],".wav",4);
//  tmrpcm.play(iBPMwav);   
  }
}

Sketch использует 734 байта (2%) места для хранения программ. Максимум 32256 байт. Глобальные переменные используют 15 байт (0%) динамической памяти...

,

Кстати: String использует даже больше оперативной памяти, чем может видеть компилятор. А String+String ужасно сложный, создает много мусора :), @DataFiddler