Недавно я начал изучать C ++ для микроконтроллера STM32F103, и я использую библиотеку под названием STM32plus. Проблема в том, что я совсем не привык к C ++ и указателям, и эта библиотека практически использует их.
Итак, в настоящее время у меня есть 1 исходный файл, в котором находится весь мой код, и я хочу начать разбивать его на разделы. Вверху моего основного исходного файла у меня есть объявления вроде этого:
#include "config/stm32plus.h"#include "config/display/tft.h"
using namespace stm32plus;
using namespace stm32plus::display;
typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode;
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel;
LcdAccessMode *_accessMode;
LcdPanel *dsp;
Font *font;
это больше, но это выглядит примерно так (этот раздел для дисплея, есть больше для SD-карты и других компонентов). Я в основном понимаю, что здесь происходит. Одна из моих функций в этом файле выглядит так:
template <class T>
void print(T text)
{
textx+=dsp->measureString(text);
*dsp<<Point(textx,texty)<<text;
}
void println()
{
textx=0;
texty+=font->getHeight()+1;
}
template <class T>
void println(T text)
{
print(text);
println();
}
Теперь я хотел бы попытаться переместить это в отдельный файл или класс (Print.cpp и Print.h), но после того, как попробовал все виды различных вещей, таких как extern class, включая всю библиотеку, предварительные объявления и после поиска в Google более 10 различные ошибки, которые я получал, пытаясь скомпилировать этот код, и, прибегая к помощи того, что я пытаюсь сделать, я просто не могу найти никакого решения. Я бы опубликовал примеры того, что я пробовал, но я удалил все свои предыдущие попытки, и они все равно не сработали.
Итак, может ли кто-нибудь дать мне пример класса или способа поместить эти функции в отдельный файл / класс, чтобы я мог использовать его в основной программе, при этом позволяя основной программе использовать функции отображения?
Любая помощь / совет приветствуется. Обратите внимание, что я все еще новичок в C ++ и что это встроенная система, поэтому объем ОЗУ ограничен (я не могу создать еще один экземпляр экранных объектов / классов)
Что касается функций шаблона:
Во время использования специализации шаблона в файле определение функции шаблона должно быть видимым. Для этого у вас есть две возможности:
Вы записываете определение функций шаблона в файл заголовка и включаете этот файл заголовка во все файлы .cpp, где будут использоваться эти функции.
Вы пишете предварительное объявление вашей функции шаблона для каждого типа, который будет использоваться, это называется предварительным объявлением специализации функции шаблона (см. Это нить для точного синтаксиса).
Относительно указателей области файла:
Если вы хотите, чтобы ваша функция печати была в print.cpp
и использовать dsp
указатель, вы должны сделать этот указатель видимым. Вы могли бы:
1) Добавьте второй параметр в print()
типа LCDPanel *
(хорошее решение). Таким образом, каждый, кто читает объявление функции, знает, что функция print()
использует LCDPanel
и не нужно читать определение функции, чтобы найти, какие глобальные переменные используются.
2) Сделать LCDPanel
указатель глобален и поэтому виден в print.cpp
(плохое решение):
/* main.cpp */
LcdPanel *dsp;
/* main.h */
#include "config/stm32plus.h"#include "config/display/tft.h"
using namespace stm32plus;
using namespace stm32plus::display;
typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode;
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel;
extern LCDPanel *dsp;
/* print.cpp */
#include "main.h"
(Кстати, dsp
не очень хорошее название для обозначения дисплея, потому что dsp
используется для цифровой обработки сигналов во встроенном мире)
Других решений пока нет …