语言: Visual C ++,MFC
环境: Visual Studio 2005
所以我发布了一个类似的问题,但我已经意识到我在问错误的问题。我正在尝试使用循环来调用几个不同变量上的函数,但是在此过程中的某个地方,程序崩溃了。
简化代码如下,但我认为解释它实际上更容易。我有一个函数,它接受一个CString作为参数。我有几个变量希望提供给这个函数,所以我将它们的名字放入一个数组中,我试图将它们传递给函数。
//下面的代码是我有什么,但它不起作用//
标题文件:
CString m_strTop;
CString m_strLeft;
CString m_strRight;
CString m_strBottom;
CString *var[4];
源文件: 构造()
CString *var[4] = {
&m_strTop
, &m_strLeft
, &m_strRight
, &m_strBottom
};
源文件: 的 theFunction()
void myClass::DoDataExchange(CDataExchange* pDX)
{
CSAPrefsSubDlg::DoDataExchange(pDX);
for(int i = 2001, j = 0; i <= 2004; i++, j++)
{
// THE LINE BELOW IS WHERE THINGS GO WONKY, SPECIFICALLY AT &var[j]
DDX_Text(pDX, i, *var[j]); // 'i' is the ID of the textbox
}
}
- DDX_Text期望的内容 -
void AFXAPI DDX_Text(
CDataExchange* pDX,
int nIDC,
CString& value
);
就像我说的那样,我只需要为函数提供变量的实际名称。至少我认为。它实际上做的是在对话框中的文本框和将存储文本框输入的变量之间建立连接。我正确地解除了引用和一切,但我不认为这是正确的方法。
感谢您的帮助。对于那些回答我之前问题的人,我抱怨歪曲了这个问题。
答案 0 :(得分:3)
var
是指向CString
的指针数组
var[j]
是指向CString
的指针
&var[j]
是指向CString
的指针。
现在您需要传递CString
对象。所以你需要:
DDX_Text(pDX, i, *var[j]); // dereference a pointer to CString.
考虑使用std::vector
而不是C阵列。它将是:
std::vector<CString> var(4);
...
DDX_Text(pDX, i, var[j]); // pass a CString object
我注意到你在构造函数中再次声明了变量var
:
CString *var[4] = { // this declares new temporary variable,
// it doesn't initialize one from the header file
&m_strTop
, &m_strLeft
, &m_strRight
, &m_strBottom
};
不应该吗? :
var[0] = &m_strTop;
var[1] = &m_strLeft;
var[2] = &m_strRight;
var[3] = &m_strBottom;
我想你需要以下内容:
// header file
class myClass
{
std::vector<CString> var_;
...
};
// source file
myClass::myClass() : var_(4)
{
...
}
void myClass::theFunction(CDataExchange* pDX)
{
CSAPrefsSubDlg::DoDataExchange(pDX);
for(int i = 2001, j = 0; i <= 2004; i++, j++)
{
DDX_Text(pDX, i, var_[j]); // 'i' is the ID of the textbox
}
}
答案 1 :(得分:1)
你没有将正确的东西传递给DDX_Text。它的第三个参数是对CString的引用。你传递的是指针的地址。所以你应该做一些像
这样的事情DDX_Test(pDX, i, *var[j]);