Немного предыстории: у меня есть библиотека кода C, которая является частью большой системы (все C).Для этой конкретной части библиотеки C должен быть создан графический интерфейс, который позволяет пользователям поиграть с опциями.Для графического интерфейса я выбрал QT, так как желательна межплатформенная поддержка.Я использую Eclipse и MinGW в качестве IDE и компилятора (но я думаю, что вопрос больше в языке, чем в конкретном компиляторе?).
С QT я создал виджет, который содержит указатель на структуру, реализованную в Cон содержит указатели на несколько функций, которые выполняют логику библиотеки C.
//QTWidget.cpp
extern "C" {
#include "c-src/CLogic.h"
//extern char* textHelper;
}
QTWidget::QTWidget(QWidget *parent)
{
//rtw is a struct that contains a function pointer to a member of QTWidget
this->rtw.displayText = &QTWidget::displayText;
this->clogic = CLogic_getInstance(&rtw);
}
//Public SLOT, connected to a button's clicked SIGNAL
void QTWidget::buttonClicked()
{
this->clogic->buttonClicked();
}
void QTWidget::displayText(char *text, int position)
{
//I've tried creating a QString from the char*, but this does not work at all.
//ui.textItem->setText(textHelper);
ui.textItem->setText(text);
}
Когда пользователь нажимает кнопку в графическом интерфейсе, вызывается метод QTWidget :: buttonClicked (), который сообщает библиотеке Cсделать что-то.Обратите внимание, что структура CLogic имеет ссылку на QTWidget в форме структуры RefToWidget, которая содержит указатель на функцию.
//CLogic.c
static CLogic instance;
void CLogic_buttonClicked()
{
//I've tried several variants here, such as making a global
//char* textHelper = "Hello World";
//that is referenced by using the "extern" keyword in the CPP file above.
instance.rtw->displayText("Hello World", 1);
}
CLogic* CLogic_getInstance(RefToWidget *rtw)
{
instance.rtw = rtw;
instance.buttonClicked = &CLogic_buttonClicked();
}
При отладке этой программы я обнаружил, что все вызовы функций выполняются, как предполагалось(когда я нажимаю кнопку, вызывается buttonClicked () слота QT, вызывается CLogic_buttonClicked (), который вызывает QTWidget :: displayText (), как и планировалось, но в этом последнем вызове параметры недопустимы. Текстовые символы char *на 0x1 и утверждает, что указывает на память вне границ, а позиция int выглядит как какое-то случайное число (неинициализированное).
Как передать эти данные из C в CPP?
РЕДАКТИРОВАТЬ@Luccas Matteis:
#ifdef __cplusplus
#include "QTWidget.h"
extern "C" {
#endif
struct RefToWidget{
#ifdef __cplusplus
void (QTWidget::*displayLine)(char* text, int lineNumber);
#else
void (*displayLine)(char* text, int lineNumber);
#endif
};
typedef struct RefToWidget RefToWidget;
#ifdef __cplusplus
}
#endif
Как уже было сказано выше, вызовы функций ведут себя, как и ожидалось, но данные не передаются «правильно» (хотя, когда я на это смотрю, код кажется немного ...странно ...;))