STM32 создание и использование class

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
Мною создан проект с++ с использованием класса. Но я не могу обратиться к функциям созданного объекта. Программа просто не видит эти функции. При этом проблем с созданием объекта не возникло.
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Без кода Вам будет сложно помочь.
 

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
Без кода Вам будет сложно помочь.
Вряд-ли ошибка в коде

C++:
GButton ok();    // создание объекта

ok.lol();        // попытка обратитьтся к функцие объекта, выдаёт ошибку

error: request for member 'tick' in 'butt1', which is of non-class type 'GButton()'
// так выглядит ошибка
GButton переделан под stm32:
/*
 * GButton.h
 *
 *  Created on: May 6, 2021
 *      Author: root-
 */

#ifndef BTNS_GBUTTON_HPP_
#define BTNS_GBUTTON_HPP_

#include "main.h"
#include <stddef.h>


typedef struct {
    bool btn_deb :1;
    bool hold_flag :1;
    bool counter_flag :1;
    bool isHolded_f :1;
    bool isRelease_f :1;
    bool isPress_f :1;
    bool step_flag :1;
    bool oneClick_f :1;
    bool isOne_f :1;
    bool inv_state :1;
    bool mode :1;
} GyverButtonFlags;

#define NORM_OPEN 0
#define NORM_CLOSE 1
#define MANUAL 0
#define AUTO 1

class GButton {
public:
    GButton(bool dir = NORM_OPEN);
    virtual ~GButton();

    void lol();

    void setDebounce(uint16_t debounce);        // установка времени антидребезга (по умолчанию 80 мс)
    void setTimeout(uint16_t new_timeout);        // установка таймаута удержания (по умолчанию 300 мс)
    void setClickTimeout(uint16_t new_timeout);    // установка таймаута между кликами (по умолчанию 500 мс)
    void setStepTimeout(uint16_t step_timeout);    // установка таймаута между инкрементами (по умолчанию 400 мс)
    void setDirection(bool dir);                // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE)

    bool isPress();        // возвращает true при нажатии на кнопку. Сбрасывается после вызова
    bool isRelease();    // возвращает true при отпускании кнопки. Сбрасывается после вызова
    bool isClick();        // возвращает true при клике. Сбрасывается после вызова
    bool isHolded();    // возвращает true при удержании дольше timeout. Сбрасывается после вызова
    bool isHold();        // возвращает true при нажатой кнопке, не сбрасывается
    bool state();        // возвращает состояние кнопки

    void tick(bool state = 0);

private:
    GyverButtonFlags flags;
    uint8_t _PIN = 0;
    uint16_t _debounce = 60;
    uint16_t _timeout = 500;
    uint16_t _click_timeout = 500;
    uint16_t _step_timeout = 400;
    uint8_t btn_counter = 0, last_counter = 0, last_hold_counter = 0;
    uint32_t btn_timer = 0;
    bool btn_state = false;
    bool btn_flag = false;
}button;

GButton ok();

#endif /* BTNS_GBUTTON_HЗЗ_ */
 

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
Ошибка заключалась в использование скобок после создания класса

Правильный способ:
GButton ok;    // создание объекта
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
в настройках среды можно решить 90% проблем связанных с с++
самому-то не смешно?
Большинство "проблем с С++" на форумах - это незакрытые скобки, неописанные переменные, непонимание работы операторов. Или вот Вы - перепутали обьект с функцией. Какие "настройки среды" помогут в этом случае? :)

Учите язык программирования и не кивайте на "настройки". Запомните, 99% ошибок компиляции - это ошибки в коде.
 

SashaPetrov

✩✩✩✩✩✩✩
22 Май 2019
54
5
самому-то не смешно?
Большинство "проблем с С++" на форумах - это незакрытые скобки, неописанные переменные, непонимание работы операторов.
Вы знаете только одну из проблем. Прежде чем мне удалось хотя-бы объявить класс, было множество проблем со средой.

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

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Прежде чем мне удалось хотя-бы объявить класс, было множество проблем со средой.
каких, даже любопытно? Вам не приходит в голову, что в этом виновата не среда? :)

У меня опыта мало, я ни разу не менял настройки Ардуино. Почему-то у меня и без этого классы компилируются :)
 

rGlory

★✩✩✩✩✩✩
11 Май 2021
200
20
Если уж пишете на С++, то не используйте typedef struct - для С++ эта конструкция не только бесполезная, но и вредная.

Класс, от которого вы не собираетесь наследоваться и не собираетесь использовать полиморфно совершенно не обязательно должен иметь виртуальный деструктор. Для PC это в принципе по барабану, но вы для микроконтроллера пишете.

Глобальные объекты в заголовочном файле определять не надо, если хотите объявить, то используйте extern. Итд.
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Класс, от которого вы не собираетесь наследоваться и не собираетесь использовать полиморфно совершенно не обязательно должен иметь виртуальный деструктор.
ну, здесь это ни на что не влияет, а вообще ВСЕГДА обьявлять деструктор - полезная привычка.
А вот то, что у него обьект кнопки обьявлен в заголовочном файле - это серьезный ляп, это я просмотрел.
 

rGlory

★✩✩✩✩✩✩
11 Май 2021
200
20
ну, здесь это ни на что не влияет, а вообще ВСЕГДА обьявлять деструктор - полезная привычка.
Между всегда объявлять деструктор и всегда объявлять виртуальный деструктор есть большая разница, особенно для МК. Для ESP32 наверное сильно не скажется, но если так начать писать для какого нибудь ATtiny, то без флеша можно быстро остаться.

А вот то, что у него обьект кнопки обьявлен в заголовочном файле - это серьезный ляп, это я просмотрел.
Мало того, их там двое! (как в анекдоте про Илью Муромца :ROFLMAO: )