Смешанная структура с int и string

Я хочу создать такую структуру:

Команды структуры
 struct commands
{
  int   cmd;
  char  descr[25];
};

commands cmds[] =
{
  {16, "Hammond Organ"},
  {17, "Percussive Organ"},
  {18, "Rock Organ"},
  { 0, "" }                   // маркер конца списка
};

Компилятор не возражает, но в симуляторе все значения cmds[i].descr равны нулю.

И линия

Serial.write(cmds[1].descr);

ничего не печатает.

Пожалуйста, порекомендуйте, как переписать код.

Спасибо.

Спасибо за ответ. Мне это очень помогло.

Что-то не так с симулятором (Симулятор для Arduino - версия 1.11E, разработанный Virtronics). Тем временем я получил плату Mega 2560, и код хорошо работает с платой.

, 👍2

Обсуждение

Какую версию IDE и avr-g++ вы используете? Если вы включите подробную компиляцию, вы должны увидеть расположение avr-tools (avr-g++, avr-objdump...) и сгенерированного файла elf. Запустите avr-nm -Cn path_to_the_elf_file, чтобы увидеть адрес памяти, где хранится cmds, затем avr-objdump -s -j .data path_to_the_elf_file, чтобы увидеть его содержимое. Это выглядит так, как ожидалось?, @Edgar Bonet

Ардуино IDE 1.8.10. Поскольку я новичок, я не понимаю остальной части вашего вопроса., @bernkopf48

Моя проблема теперь решена ответами VillageTech и VE7JRO., @bernkopf48


2 ответа


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

2

Должно быть что-то не так с симулятором, который вы используете, потому что ваш код работает для меня (Arduino IDE 1.8.9, OSX, Arduino Uno).

struct commands
{
  int   cmd;
  char  descr[25];
};

commands cmds[] =
{
  {16, "Hammond Organ"},
  {17, "Percussive Organ"},
  {18, "Rock Organ"},
  { 0, "" }                   // маркер конца списка
};

void setup(){
  Serial.begin(9600);
  Serial.write(cmds[1].descr);
}

void loop(){}
,

Приведенный выше скетч не выдает ошибок или предупреждений при использовании моей версии ОС и IDE., @VE7JRO

То же самое. Чисто компилируется с -Os -Wall -Wextra и прекрасно работает как с avr-g++ 5.4.0 (поставляется с Ubuntu 19.10), так и с 7.3.0 (поставляется с Arduino IDE 1.8.10)., @Edgar Bonet


0

Попробуйте использовать обозначение указателя на символ (char *) вместо обозначения массива (char[]) в объявлении структуры:

struct commands
{
    int   cmd;
    char*  descr;
};
  • ИЛИ-

используйте объявление структуры как есть, но измените инициализацию массива, как показано ниже:

commands cmds[] =
{
    {16, {"Hammond Organ"}},
    {17, {"Percussive Organ"}},
    {18, {"Rock Organ"}},
    { 0, {""}}                   // маркер конца списка
};

Кроме того, кажется, что это всегда должно быть написано как:

struct commands cmds[] = 
{
    // здесь ваш код
};

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

Спасибо за ответ. Мне это очень помогло.

Должно быть что-то не так с симулятором (Симулятор для Arduino — версия 1.11E, разработанный Virtronics). Тем временем я получил плату Mega 2560, и как нотация указателя символов (char ), так и нотация массива (char[]) хорошо работают с платой. Компилятор (Arduino IDE v. 1.8.10) действительно выдает предупреждения: ISO C++ запрещает преобразование строковой константы в 'char' [-Wwrite-strings]. Возможно, симулятор более дотошный, чем компилятор, и поэтому отказывается работать с кодом, который генерирует предупреждения.

,