【问题标题】:Problem with an array of pointers指针数组的问题
【发布时间】:2011-06-13 14:56:40
【问题描述】:

语言: C++、MFC

问题:我试图向函数传递一些指向包含在数组中的变量的指针,但编译器似乎不同意我的做法。这是我的代码:

头文件:

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
};

源文件: DoDataExchange()

void FSC_3DPersp::DoDataExchange(CDataExchange* pDX)
{
   CSAPrefsSubDlg::DoDataExchange(pDX);

   for(int i = 2001, j = 0; i <= 2004, j < 4; i++, 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 
);

我想以这种方式进行 DataExchange,因为在我的几个文件中,我有超过 75 个变量,并且使用循环可以显着压缩代码并简化事情。

我知道我遇到的问题是我只是为 DDX_Text 提供了错误的参数,但我知道它需要 CStrings。但是,我很确定我没有正确引用它们。

任何帮助将不胜感激!

~乔恩

【问题讨论】:

  • 我修复了取消引用错误,但现在我的程序在代码到达 for 循环时崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?我不确定它还能是什么......
  • 您有包含 75 个控件的对话框?你真正想要完成什么?那个 for 循环可能会引起我的注意,就像 CRect 的字符串表示对我来说一样。
  • 显然您没有在编译时启用警告。如果你要求它这样做,任何体面的编译器都会告诉你语法错误。
  • 我基本上是在为一个更大的应用程序创建一个首选项对话框。我的偏好对话框页面之一有一个大表,用户需要用值填写。我刚刚数了一下,我夸大了一点……在我最大的对话框首选项屏幕上有 54 个 CEdit,而不是 75 个。

标签: c++ visual-c++ pointers mfc operator-overloading


【解决方案1】:

代替

DDX_Text(pDX, i, &var[j]);

使用

DDX_Text(pDX, i, *(var[j]));

因为你已经有一个间接级别。

关于这个:

for(int i = 2001, j = 0; i <= 2004, j < 4; i++, j++)

我不确定你是否知道你在那里设置的条件是正确的,因为逗号运算符就是这样工作的。您应该留下左边的,因为当j &lt; 4 表达式正确时它永远不会为假,或者使用 && 运算符更清楚。

我假设您使用 Visual Studio 进行 MFC 编程,因此我建议在该行设置一个断点并确保您的数组已正确初始化。如果是,那么问题出在其他地方。

【讨论】:

  • 这会编译我的代码,但现在当代码到达这一点时它会崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?
  • 很好,塔马斯。这无疑为我的未来保驾护航,但由于某种原因它仍然崩溃。
  • 我的回答是否有助于定位问题?
  • 是的,我能够准确定位到它失败的地方。谢谢!
【解决方案2】:
DDX_Text(pDX, i, &var[j]); // 'i' is the ID of the textbox

应该是

DDX_Text(pDX, i, *var[j]); // 'i' is the ID of the textbox

虽然,查看您的 for 循环和索引 ij,我不确定您要完成什么。

【讨论】:

  • 这会编译我的代码,但现在当代码到达这一点时它会崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?
【解决方案3】:

你需要dereferenceCString指针:

DDX_Text(pDX, i, *var[j])

【讨论】:

  • 这会编译我的代码,但现在当代码到达这一点时它会崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?
  • @Jon:你的循环应该做什么?现在它只会在值 i: 2001 - 2004 和 j: 0 - 3 之间循环?
  • 我的错误......我实际上简化了我的代码以发布在这里。我一定是忘记换号码了。它应该初始化文本框(使用从 2001 开始的编号 ID)和存储它们的变量(数组中的变量)之间的数据交换。
【解决方案4】:

DDX_Text(pDX, i, &amp;var[j]); 正在发送一个指针的地址,一个 CString **。

您的 DDX_Text 函数要求引用该值。

改用DDX_Text(pDX, i, *var[j]);

【讨论】:

  • 这会编译我的代码,但现在当代码到达这一点时它会崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?
【解决方案5】:

DDX_Text 期望引用 CString。但是,&amp;var[j] 会生成一个指针 (CString**)。你应该用*var[j](取消引用指针)来调用它——即DDX_Text(pDX, i, *var[j]);

编辑: 您的循环可能没有达到您的预期。 for-loop 条件 (i &lt;= 2010, j &lt; 4) 将 i 与 2010 进行比较,将结果丢弃,将 j 与 4 进行比较并使用该结果。如果要组合条件,请使用&amp;&amp;(逻辑与)、||(逻辑或)或!(逻辑非)。

但是,索引似乎还不错。

【讨论】:

  • 这会编译我的代码,但现在当代码到达这一点时它会崩溃。我收到以下错误:“访问冲突读取位置 0x000000a3。”也许我的索引不正确?
【解决方案6】:

代替

DDX_Text(pDX, i, &var[j]);

使用

DDX_Text(pDX, i, var[j]);

不要使用地址 (&amp;var[j]) 或取消引用 (*var[j])。只需使用var[j]

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2013-03-25
    • 2015-04-21
    相关资源
    最近更新 更多