Обратиться к объекту из другого файла

Здравствуйте, помогите начинающему, в сети не нашел решения.
Скачал библиотеку для tft экранов Arduino_GFX_Library, примеры работают. Но мне надо разнести программу по файлам
В основном файле есть обьявление
Arduino_GFX gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0 / rotation /, false / IPS */);
Как в другом файле мне использовать объект gfx?
Пробовал добавлять

#include <Arduino_GFX_Library.h>
extern Arduino_GFX *gfx;

При этом компиляция происходит с кучей ошибок, заметил, что если оставить только #include <Arduino_GFX_Library.h>, то происходит тоже самое. Получается, что нельзя инклюдить <Arduino_GFX_Library.h> в нескольких файлах? Я немного знаю язык си, там это обычная практика, как делается в с++?

“Другой” файл должен быть не ino, а cpp. Заметь не .c, а .cpp! Так вот устроена подготовка проекта у Ардуино.
Это как “сол, бол и канифол - пишуццо с мягким знаком, а тарэлька - без! Понять нельзя - нужно запомнить!” ;)))

ЗЫ: А то не поймешь. Остальное. как обычно. Инклюд в оба. В одном объявление, в другом - extern.

1 лайк

А читать что там в ошибках написано не надо, думаешь? Там просто для красоты буквы нарисованы?

1 лайк

Благодарю! Позвольте еще один вопрос. Я хочу подключить файлы написанные на си, но весь интерфейс работы с жки в них, перевести на функции Arduino_GFX , есть способ это сделать?

В одном месте у Вас написано:

а в другом:

Почему в одном месте есть звёздочка, а в другом - нет? Вы считаете, что она там просто для красоты? Для привлечения внимания?

Есть. Но, если бы Вы понимали и подробнее объяснили, что Вы хотите сделать (и зачем), то было бы проще.

У ТСа там тоже есть звёздочка, просто строка вставлена как текст, а не как код, и форумный движок посчитал её за управляющий символ перевода текста на курсив.
Если текст выделить звёздочками (по одной с двух сторон) - получим курсив, по две - жирный, по три - жирный курсив. Аналогично работают подчёркивания. По две тильды превращают текст в перечёркнутый.
В общем, строка по задумке ТСа должна выглядеть так

Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0 /* rotation */, false /* IPS */);

Ну, значит, ТС сам себе злобный Буратино, что тут ещё скажешь.

Если у человека здесь код через задницу вставлен, то остаётся только догадываться, через что он вставлен в IDE.

1 лайк

По теме вопроса реально помог WladDrakula, указав на ошибку инклюде. С плюсами раньше не имел дела, на си можно реализовать через callback , примерно так:

//..код в .h файле
#ifdef __cplusplus
extern "C"
{
#endif
	extern void (*lcd_spi_wr_data)(uint8_t data);//указатель на функцию
	void lcd_set_spi_callback(void (*spi)(uint8_t data));
#ifdef __cplusplus
}
#endif

//..код в .с файле библиотеки
void func(uint8_t d)
{
    //остальной код
	lcd_spi_wr_data(d);//вызов callback функции
}
//************************************
//..код в main.сpp файле
#include <.h>
void spi_wr8b(uint8_t d)//эта функция будет вызываться из си файла 
{
    tft.writedata(d);
}

void setup(void)
{
	lcd_set_spi_callback(spi_wr8b);//назначение callback функции
}

Интересны еще варианты реализации, но я предполагаю что их нет. Проще переписать библиотеку на плюсах. Спасибо за помощь.

Если я правильно понял задачу, то в основном файле (или в любом C++ файле проекта):

#include <Arduino_GFX_Library.h>
Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0 /* rotation */, false /* IPS */);

extern "C" void writedata(uint8_t d) //эта функция будет вызываться из си файла 
{
    gfx->writedata(d);
}

Вызов из C-файла может выглядеть примерно так:

void writedata(uint8_t d);
uint8_t d;
......
writedata(111);
......
d = 222;
writedata(d);
1 лайк

Большое спасибо!