VS2010 MFC 其他类调用另一个类的共有变量失败!

kai$003 2018-10-09 05:42:35
最近在做一个基于对话框的上位机,测试发现一个大问题,不知道论坛大神能否给我指点指点。
void CMFCBakDemoDlg::OnCanDevcfg()
{
INT_PTR nRes;
nRes = m_DevCfg.DoModal();
if(IDCANCEL == nRes)
return;
}


void CDeviceConfig::OnBnClickedButtonStart()
{
if(VCI_StartCAN(Devtype,Devind,0) != STATUS_OK)
{

}else
{
GetDlgItem(IDC_BUTTON_Start)->SetWindowText("运行中"));
}
}


void CMFCBakDemoDlg::OnBnClickedButtonStart()
{
if(VCI_StartCAN(m_DevCfg.Devtype,m_DevCfg.Devind,0) != STATUS_OK)
{

}else
{
GetDlgItem(IDC_BUTTON_Start)->SetWindowText("运行中"));
}
}



Devtype和Devind是CDeviceConfig类的共有成员。

上面3断代码,其中第三段代码运行失败,调试发现Devtype和Devind由原来的3和0,调用后m_DevCfg.Devtype和m_DevCfg.Devind这两个值都变成了0?不知道为什么出现这种问题,以为用VC6.0++也可以正常的,不知道VS2010为什么不能了,希望大神指点迷津。谢谢啦。
...全文
262 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-10-11
  • 打赏
  • 举报
回复
给你说了 将Devtype 定义到 App中;
如、
DWORD m_Devtype ;

在 Config OK 中
AfxGetApp()->m_Devtype=Config 中 Devtype !
kai$003 2018-10-11
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
“但是将Devtype定义在CDeviceConfig中的protected 下public中就不会出现这个问题,“ protected: int xxxx; public:// 表示 protected: 结束, 开始 public , int yyyy; 与 直接 放 public: 无差别, 问题 在 别处, 你的 程序 有 Config 那么 程序 启动 应该 先读 Config 以后有改变 要 存入 Config 。 通常 Config 里的变量定义在 app 中 ,取时 使用 theApp.xxxx 或者 AfxGetApp()->xxxx
不好意思,因为系统环境加密和代码量大,只能上传部分截图还烦请大家帮我解决一下问题,谢谢。想要知道原因。
schlafenhamster 2018-10-10
  • 打赏
  • 举报
回复
EndDiagol(0)退出子窗口后, m_DevCfg已销毁, Devtype 可能已 不存在 !

通常 m_DevCfg 的 结果 要 保存到 ini 文件 中 已备 下次 启动 程序 时 读入 config
kai$003 2018-10-10
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
m_DevCfg.Devtype m_DevCfg=0 ?
用m_DevCfg.domodal显示子窗口,在子窗口中更新Devtype变量等于3,Devtype是关联一个控件的变量,结束后EndDiagol(0)退出子窗口后,在父窗口中m_DevCfg.Devtype获取到的数据是0。
schlafenhamster 2018-10-10
  • 打赏
  • 举报
回复
m_DevCfg.Devtype
m_DevCfg=0 ?
kai$003 2018-10-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 lmj9401 的回复:] 这几行代码,看不到问题所在,关键要找到修改m_DevCfg.Devtype和m_DevCfg.Devind代码才行。
可以借助数据改变断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
[/quote] 好像找到了问题?但还不明白为什么? 如果定义的变量再上面的public里就不成功,不知道这是什么原因。
赵4老师 2018-10-10
  • 打赏
  • 举报
回复
引用 2 楼 lmj9401 的回复:
这几行代码,看不到问题所在,关键要找到修改m_DevCfg.Devtype和m_DevCfg.Devind代码才行。

可以借助数据改变断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}
lmj9401 2018-10-10
  • 打赏
  • 举报
回复
这几行代码,看不到问题所在,关键要找到修改m_DevCfg.Devtype和m_DevCfg.Devind代码才行。
schlafenhamster 2018-10-10
  • 打赏
  • 举报
回复
“但是将Devtype定义在CDeviceConfig中的protected 下public中就不会出现这个问题,“
protected:
int xxxx;
public:// 表示 protected: 结束, 开始 public ,
int yyyy;

与 直接 放 public: 无差别, 问题 在 别处,

你的 程序 有 Config 那么 程序 启动 应该 先读 Config 以后有改变 要 存入 Config 。
通常 Config 里的变量定义在 app 中 ,取时 使用 theApp.xxxx 或者 AfxGetApp()->xxxx
kai$003 2018-10-10
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
EndDiagol(0)退出子窗口后, m_DevCfg已销毁, Devtype 可能已 不存在 ! 通常 m_DevCfg 的 结果 要 保存到 ini 文件 中 已备 下次 启动 程序 时 读入 config
m_DevCfg的定义是 CDeviceConfig m_DevCfg,定义在在父窗口中,在父窗口中m_DevCfg.domadal,可以打开子窗口,但是m_DevCfg.Devtype读取到的永远是0,但是将Devtype定义在CDeviceConfig中的protected 下public中就不会出现这个问题, m_DevCfg.Devtype读取的值就是子窗口设置的值。
zgl7903 2018-10-09
  • 打赏
  • 举报
回复
设置数据断点 调试运行

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧