一些背景信息:
我有一份C代码库,它是一个更大系统(全部都是C)的一部分。对于这个特定的C库的部分,必须创建一个GUI,允许用户使用选项。为了支持跨平台,我选择了QT作为GUI工具。
我使用Eclipse和MinGW作为IDE和编译器(但我认为问题更多地与语言相关而不是编译器?)。
在QT中,我创建了一个小部件,它持有指向C中实现的结构体的指针,该结构体包含指向执行C库逻辑的几个函数的指针。
当用户在GUI中按下按钮时,方法QTWidget::buttonClicked()被调用,它告诉C库去执行某些操作。请注意,CLogic结构体有一个对QTWidget的引用,以struct RefToWidget的形式持有一个函数指针。
在调试此程序时,我发现所有函数调用都按预期执行(当我按下按钮时,QT槽buttonClicked()被调用,接着调用CLogic_buttonClicked(),计划中调用QTWidget::displayText()),但在最后一个调用中,参数是无效的。char *文本指向0x1,并声称指向越界的内存,而int位置看起来像是一些随机数(未初始化)。
如何将这些数据从C传递到CPP?
编辑@Luccas Matteis:
在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);
}
当用户在GUI中按下按钮时,方法QTWidget::buttonClicked()被调用,它告诉C库去执行某些操作。请注意,CLogic结构体有一个对QTWidget的引用,以struct 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();
}
在调试此程序时,我发现所有函数调用都按预期执行(当我按下按钮时,QT槽buttonClicked()被调用,接着调用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
如上所述,函数调用的行为表现正常,但数据未被“正确”传递(尽管当我看代码时,代码似乎有点奇怪... ;))