Собственное определение типа с использованием структуры не дает имени типу

Мне нужно инициализировать несколько кнопок и светодиодов, подключенных к моему Arduino. Чтобы хранить данные, относящиеся к отдельной кнопке или светодиоду, я решил определить свой собственный тип данных, используя две разные структуры. Один для кнопки, а другой для светодиода.

Поскольку мне нужно настроить некоторые графические процессоры и другие периферийные устройства после создания каждой кнопки / светодиода, я реализовал небольшую заводскую функцию, чтобы получить чистый интерфейс и объединить необходимые шаги для создания экземпляра и инициализации.

Определение моего собственного типа button_t работает, как и ожидалось. Компилятор не выдает никаких ошибок. Однако я попытался реализовать тот же подход для типа led_t, когда компилятор выдает следующую ошибку:

пример: 25:1: ошибка: 'led_t' не называет тип

led_t Светодиодный завод (uint8_t pinNumber)

^~~~~

статус выхода 1 'led_t' не указывает тип

Мой пример кода выглядит следующим образом:

#include <Arduino.h>
#include <stdint.h>

struct button_t
{
    const uint8_t pin;
    uint8_t currentState;
    uint8_t lastState;
    uint32_t lastDebounceTime;
};

button_t buttonFactory(uint8_t pinNumber)
{
    button_t btn = {pinNumber, 0, 0, 0};
    // настройка некоторых регистров MCU здесь
    return btn;
};

struct led_t
{
    const uint8_t pin;
    const uint8_t state;
};

led_t ledFactory(uint8_t pinNumber)
{
    led_t led = {pinNumber, 0};
    // настройка некоторых регистров MCU здесь
    return led;
};

void setup()
{
}

void loop()
{
}

, 👍2


2 ответа


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

6

Это ошибка в среде IDE Arduino: при преобразовании вашего файла .ino в файл .cpp было добавлено объявление для функции ledFactory() перед объявлением типа led_t.

Поскольку, по-видимому, эти объявления добавляются непосредственно перед первой функцией вашего скетча, простой обходной путь заключается в том, чтобы поместить все ваши определения типов перед вашими функциями.

,

@альберт, если вам интересно увидеть это искажение своими глазами, проверьте "компиляция" на "Показать подробно"... " в файле / Настройках. Вы должны увидеть полную командную строку компилятора непосредственно перед сообщением об ошибке. Он будет ссылаться на некоторые <build-process-generated-directory>/sketch/your_sketch_name.ino.cpp досье. Там вы видите результат манипулирования процессом сборки вашим файлом .ino в файл .cpp, который он в конечном итоге пытается скомпилировать. И для вашего кода, по крайней мере, в IDE версии 1.8.13, именно то, что описал Эдгар., @timemage


-1

Сначала создайте структуру, а затем создайте функцию и после строки объявления функции C++ — это нижний подход.

,

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, [измените], чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти [в справочном центре](/help/how-to-answer)., @Community