Смешанная структура с 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, и код хорошо работает с платой.
@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
Попробуйте использовать обозначение указателя на символ (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]. Возможно, симулятор более дотошный, чем компилятор, и поэтому отказывается работать с кодом, который генерирует предупреждения.
- Как реализовать обратное перечисление?
- GPS автономный робот
- Как разделить входящую строку?
- устаревшее преобразование из строковой константы в 'char*'
- Использование аналогового входа для чтения кнопки
- Преобразование строки в массив символов
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- как быстро loop() работает в Arduino
Какую версию 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