Проблема инициализации массива struct

Цель для этого состоит в том, чтобы создать структуру, которая включает в себя имя, идентификатор, имя файла и логическое значение, а затем создать массив этих структур. Вот что я придумал:

struct Amiibo
{
  char *aName{};
  char *ID{};
  char *AudioFileName{};
  bool alreadyPlayed{false};
};  

Amiibo amii[20] = {

      {"Mario","A5005B00","MARIO",false},                     //0
      {"Meta Knight","A5 00 02 00","MK"},                     //1
      {"Inkling", "A5 00 05 00","INK"},                       //2
      {"Donkey Kong","A5 00 01 00","DK"},                     //3
      {"Lucas","A5 00 0A 00","LUCAS"},                        //4
      {"Duck Hunt", "A5 00 08 00","DUCKH"},                   //5
      {"Ocarina of Time Link","A5 00 01 00","OOTL"},          //6
      {"Breath of The Wild Link","random","BOTWL"},           //7
      {"8-bit Link","random","8BITL"},                        //8
      {"Toon Link","random","TOONL"},                         //9      
      {"Mr. Game and Watch","random","GANDW"},                //10
      {"Falco","random","FALCO"},                             //11
      {"King Dedede","random","DEDEDE"},                      //12
      {"Mewtwo","random","MEWTWO"},                           //13
      {"Captain Falcon","random","CAPF"},                     //14
      {"ROB","random","ROB"},                                 //15
      {"PAC-MAN","random","PACMAN"},                          //16
      {"Cloud","random","CLOUD"},                             //17
      {"Ness","random","NESS"},                               //18
      {"Ryu","random","RYU"}                                  //19

};

Это дает мне следующую ошибку:

ошибка: не удалось преобразовать " {"Mario", "A5005B00", "MARIO", false}" из " в "Amiibo"

И та же ошибка для всех остальных элементов массива. Я попытался изменить amii[20] на указатель с помощью *amii[20]. Это привело меня к этой ошибке:

скобки вокруг скалярного интилизатора типа "Amiibo"

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

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

, 👍1

Обсуждение

Если вы используете значения по умолчанию, вы не можете использовать этот тип инициализации, вам нужно иметь правильные конструкторы, чтобы заставить его работать. Однако это будет сложно с этими C-строками, @KIIV

Не могли бы вы привести пример правильного конструктора?, @Ethan Braun

структура Amiibo {"... "Amiibo(постоянное имя*, постоянное имя* идентификатор, постоянное имя * аудио) : имя{ имя}, идентификатор{ идентификатор}, имя аудиофайла{ аудио } { ; } и еще один с 4 параметрами... (кстати, вам также нужно изменить внутренние типы на " const char*", иначе он будет кричать об отбрасывании квалификатора), @KIIV

Просто опустить значения по умолчанию?!, @DataFiddler


1 ответ


1

Если вы используете значения по умолчанию в объявлении структуры, вы должны определить также конструкторы для установки определенных элементов:

struct Amiibo
{
  const char *aName{};
  const char *ID{};
  const char *AudioFileName{};
  bool alreadyPlayed{false};

  Amiibo() = default;  // реализация по умолчанию для конструктора default
  
  Amiibo(const char* name, const char* id, const char * audio)  // конструктор с тремя строками c в качестве параметров
  : aName{ name }
  , ID{ id }
  , AudioFileName{ audio }
  { ; }
};  

Amiibo amii[] = {
      {"Mario","A5005B00","MARIO",false},                     //0
      {"Meta Knight","A5 00 02 00","MK"},                     //1
      {"Inkling", "A5 00 05 00","INK"},                       //2
      {"Donkey Kong","A5 00 01 00","DK"},                     //3
      {"Lucas","A5 00 0A 00","LUCAS"},                        //4
      {"Duck Hunt", "A5 00 08 00","DUCKH"},                   //5
      {"Ocarina of Time Link","A5 00 01 00","OOTL"},          //6
      {"Breath of The Wild Link","random","BOTWL"},           //7
      {"8-bit Link","random","8BITL"},                        //8
      {"Toon Link","random","TOONL"},                         //9      
      {"Mr. Game and Watch","random","GANDW"},                //10
      {"Falco","random","FALCO"},                             //11
      {"King Dedede","random","DEDEDE"},                      //12
      {"Mewtwo","random","MEWTWO"},                           //13
      {"Captain Falcon","random","CAPF"},                     //14
      {"ROB","random","ROB"},                                 //15
      {"PAC-MAN","random","PACMAN"},                          //16
      {"Cloud","random","CLOUD"},                             //17
      {"Ness","random","NESS"},                               //18
      {"Ryu","random","RYU"}                                  //19
};

Кстати на старых AVR все эти строки также будут храниться в памяти

,

Премного благодарен. Я могу в конечном итоге просто использовать переключатель или что-то еще, чтобы избежать проблем с памятью., @Ethan Braun