Maxiangwang 发表于 2024-9-1 17:21:55

MFC点击控件后报警类型不匹配

void CFX3UDlg::OnBnClickedButton2()
{
        // TODO: 在此添加控件通知处理程序代码
        CString str,str1,str2;
        if (m_FXPLC.ReadDeviceRandom(_T("D50\nD60"), 2, PLCRdata ) == 0x00)
        {
                str1.Format(_T("%d"), PLCRdata);

                str2.Format(_T("%d"), PLCRdata);

                str = str1 + _T(",") + str2;

                MessageBox(_T("str"));
        }
}


\\报警提示
d:\a01\_work\11\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\olemisc.cpp(423) : AppMsg - Warning: constructing COleException, scode = DISP_E_TYPEMISMATCH ($80020005).
0x76AE0D72 处(位于 FX3U.exe 中)引发的异常: Microsoft C++ 异常: COleException,位于内存位置 0x004FE4A0 处

FishC 发表于 2024-9-1 17:22:04

鱼油,你好!你提到的这个报警类型不匹配问题是由于 `MessageBox` 函数的参数错误引起的。

在 `MessageBox` 中传递字符串变量 `str` 时,不应该添加双引号 `_T("str")`,直接传递变量即可。

另外,关于 `PLCRdata` 的格式化,有两个 `str1` 和 `str2`,但值是一样的,可能是复制粘贴或逻辑有误。

这里是修正后的代码:

void CFX3UDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str, str1, str2;

    if (m_FXPLC.ReadDeviceRandom(_T("D50\nD60"), 2, PLCRdata) == 0x00)
    {
      // 假设 PLCRdata 是一个数组,并且我们要读取第一个和第二个数据
      str1.Format(_T("%d"), PLCRdata);
      str2.Format(_T("%d"), PLCRdata);

      str = str1 + _T(",") + str2;

      // 这里直接使用str变量,而不是_T("str")
      MessageBox(str);
    }
}

总结:
1. `MessageBox()` 传参时直接使用字符串变量。
2. 确保 `PLCRdata` 是数组并正确访问数组元素。

希望这个解释对你有所帮助!如果你还有其他问题,随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

Maxiangwang 发表于 2024-9-1 17:30:15

FishC 发表于 2024-9-1 17:22
鱼油,你好!你提到的这个报警类型不匹配问题是由于 `MessageBox` 函数的参数错误引起的。

在 `MessageB ...

void CFX3UDlg::OnBnClickedButton2()
{
        // TODO: 在此添加控件通知处理程序代码
        CString str,str1,str2;
        if(m_FXPLC.ReadDeviceRandom(_T("D50\nD60"), 2, PLCRdata ) == 0x00)
        {
                str1.Format(_T("%d"), PLCRdata);

                str2.Format(_T("%d"), PLCRdata);

                str = str1 + _T(",") + str2;

                MessageBox(str);
        }
}

\\更改后还是错误

FishC 发表于 2024-9-1 17:30:25

Maxiangwang 发表于 2024-09-01 17:30
void CFX3UDlg::OnBnClickedButton2()
{
        // TODO:...

明白了,问题可能是由于 `PLCRdata` 的使用不当引起的。通常,`ReadDeviceRandom` 函数的第三个参数可能是一个数组或指针。因此,在格式化 `str1` 和 `str2` 时,应该分别从 `PLCRdata` 数组中获取数据。

假设 `PLCRdata` 是一个长度为 2 的数组,我们可以这样做:

1. 确保 `PLCRdata` 是一个长度为 2 的数组。
2. 修正字符串拼接部分。

修改后的代码如下:

// 假设 PLCRdata 是一个长度为 2 的数组
int PLCRdata;

void CFX3UDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str, str1, str2;

    if (m_FXPLC.ReadDeviceRandom(_T("D50\nD60"), 2, PLCRdata) == 0x00)
    {
      // 获取数组中的每个数据
      str1.Format(_T("%d"), PLCRdata);
      str2.Format(_T("%d"), PLCRdata);

      str = str1 + _T(",") + str2;

      // 这里直接使用str变量
      MessageBox(str);
    }
}

请确认 `PLCRdata` 的声明和定义是否正确,并确保传入的数组大小与 `ReadDeviceRandom` 函数期望的一致。上述代码假设 `PLCRdata` 是一个长度为 2 的 `int` 数组,并且在 `ReadDeviceRandom` 函数中正确填充数据。

如果你仍然遇到问题,请检查 `ReadDeviceRandom` 函数的具体实现和参数是否正确传递。希望这次能解决你的问题!有问题继续留言。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

Maxiangwang 发表于 2024-9-1 18:14:14

FishC 发表于 2024-9-1 17:30
明白了,问题可能是由于 `PLCRdata` 的使用不当引起的。通常,`ReadDeviceRandom` 函数的第三个参数可 ...

还是报错

FishC 发表于 2024-9-1 18:14:21

Maxiangwang 发表于 2024-09-01 18:14
还是报错

理解了。感谢你的耐心。让我们一步一步来检查和改正。

1. **检查 `PLCRdata` 的定义:** 确认 `PLCRdata` 是一个数组,并且有足够的空间存储读取的数据。

2. **修正格式化输出:** 需要从数组中提取数据进行格式化。

以下是一个改进的版本:

void CFX3UDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str, str1, str2;

    if(m_FXPLC.ReadDeviceRandom(_T("D50\nD60"), 2, PLCRdata) == 0x00)
    {
      // 假设 PLCRdata 是一个尺寸为 2 的数组
      str1.Format(_T("%d"), PLCRdata);
      str2.Format(_T("%d"), PLCRdata);

      // 拼接字符串
      str = str1 + _T(",") + str2;

      // 显示读取的数据
      MessageBox(str);
    }
}

确保 `PLCRdata` 定义如下:

int PLCRdata;// 示例定义,确保容纳从 ReadDeviceRandom 读取的两个整数

**注意:** 请确认 `ReadDeviceRandom` 确实是按这种方式工作,并且第三个参数确实是一个数组。

希望这次能解决你的问题。如果还有其他问题,随时问我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: MFC点击控件后报警类型不匹配