为什么单步调试可以得到数据,直接运行却提示错误呢?

水瓶座雨夕 2009-06-05 11:14:43
UINT thread(LPVOID p)
{

CBytHTDlg *byt1 = (CBytHTDlg*)AfxGetApp()->GetMainWnd();
while(1){

byt1->GetData_Class();
::Sleep(1000);
}
// AfxEndThread(0);

return 0;
}

BOOL CBytHTDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
int comport = GetPrivateProfileInt("COM","comport",0,"d:\\byt.ini");
m_com1.SetCommPort(1);
m_com1.SetSettings("9600,n,8,1");
meter.ReleaseBuffer();
m_com1.SetInputMode(1);
m_com1.SetRThreshold(1);
m_com1.SetInBufferSize(2000);
m_com1.SetOutBufferSize(2000);
m_com1.SetInputLen(0);

m_com1.SetPortOpen(TRUE);
m_com1.GetInput();
// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

void CBytHTDlg::OnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[4096]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;

variant_inp=m_com1.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
}
BYTE btWenHi1, btWenLo1, btShiHi1, btShiLo1;
for(k = 0; k < len; k++) //将数组转换为Cstring型变量
{
BYTE bt = *(char*)(rxdata + k); //字符型
// strtemp.Format("%02X ", bt);
::Sleep(100);//将字符送入临时变量strtemp存放
if(len > 6)
{
if(k == 3)
btShiHi1 = bt;
else if(k == 4)
btShiLo1 = bt;
else if(k == 5)
btWenHi1 = bt;
else if(k == 6)
btWenLo1 = bt;
}
}
if(len > 6)
{
m_fShiDu1 = //(float)
(btShiHi1 * 256 + btShiLo1)/10.0;
m_fWenDu1 = //(float)
(btWenHi1 * 256 + btWenLo1)/10.0;
}
::Sleep(300);
m_fS1 = (m_fS1)/10;
m_fW1 = (m_fW1)/10-273.15;
sS1.Format("%.2f", m_fS1);
sW1.Format("%.2f", m_fW1);
}


void CBytHTDlg::GetData_Class()
{
send();
GetDlgItem(IDC_STATIC_TH1)->SetWindowText(sWe1+" "+sSh1);
}

void CBytHTDlg::send()
{

sendData1 = "01 03 00 00 00 02 C4 0B";

if(m_com1.GetPortOpen())
{
if (!sendData1.IsEmpty())
{
CByteArray hexdata;
int len = String2Hex(sendData1, hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_com1.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}

else
{
::AfxMessageBox("没有可以发送的数据");
}
}
else
{
::AfxMessageBox("请先打开串行口");
}
OnCommMscomm1();
}

void CBytHTDlg::OnOK()
{
AfxBeginThread(&thread,0);
}


为什么我F5单步调试的时候一切正常,数据也都有,但是我按ctrl+F5的时候就提示错误
0x7c809793 指令引用的 0x5f588119 内存 该内存不能为written

请教下这是什么原因?????
...全文
440 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
清钟沁桐 2009-07-20
  • 打赏
  • 举报
回复
应该 是没有初始化之类的
Kevin_Perkins 2009-06-05
  • 打赏
  • 举报
回复
线程的调试就是这样,线程执行必然涉及到同步问题。你单步调试是人为地为线程同步,按照你的思路保证了数据的正确传递,但一旦全速运行,结果是不可预料的,往往不会按照你的思路运行。做好线程同步,是多线程编程的核心。
oyljerry 2009-06-05
  • 打赏
  • 举报
回复
把你的单步调试目录改到你的Debug运行目录,这样就跟直接运行环境是一样了,然后再调试...
scsnsjsl_cs_dn 2009-06-05
  • 打赏
  • 举报
回复
supeng411 2009-06-05
  • 打赏
  • 举报
回复
rebuid 一下
vandersar1203 2009-06-05
  • 打赏
  • 举报
回复
单步正确,运行出错往往是多线程并发的问题
Ryanwen 2009-06-05
  • 打赏
  • 举报
回复
你单步调式的速度能快过直接运行? 输出跟踪信息,看看具体在那个位置哪个步骤出错,看错好象是越界了
Allen_zhang 2009-06-05
  • 打赏
  • 举报
回复
int len = String2Hex(sendData1, hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_com1.SetOutput(COleVariant(hexdata)); //发送十六进制数据

看你这两个函数,第一个转换应该问题不大
主要是发送的函数,你这个函数是阻塞的还是非阻塞的?

这样不停的用线程往里面写不小心都会出问题的
1. 发现错误并改错。给出一个实现插入排序的程序,文件名为InsertionSort.java,该文件中有代码错误,请单步调试,发现错误, 并改正错误提示:只有一行程序有错误,所以只能修改代码中的某一行程序。要求演示在eclipse开发环境下 单步调试程序,如果没有eclipse开发环境,也可以使用其它集成开发环境,但是必须演示调试能力。 2. 请编写程序输出13/17小数点后第100位的数字是几?考察循环和除法运算以及模运算(求余数运算)。 请补齐FractionalDigit.java文件中的代码 3. 请编写程序,分别使用循环和递归两种方法计算斐波那契数列第项是几? 斐波那契数列的第1项为1,第2项为1,后续任意项的值为其前两项的和。 请补齐Fibo.java文件中的代码 4. 实现Array类中的indexOf函数; 阅读Node.java和SingleLinkedList.java两个关于单链表的类, 实现SingleLinkedList类中的indexOf函数; 5. 阅读Node.java和SingleLinkedList.java类,利用它们来实现栈和双向队列功能,请阅读Stack.java 和Deque.java(双向队列),请实现Stack类中的pop函数,请实现Deque.java中的removeLast函数。 6. 利用前面的Stack.java和Deque.java类,实现下面问题的求解: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少? 如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少?(百度查询 卡特兰数) 请补齐Catalan.java文件中的代码 7. 八皇后问题。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法。该程序代码在EightQueens.java文件中,请将void place(int n)函数 中未完成的代码补齐,并写出运行结果。 禁止修改其他代码。 8. 学生排序。给出4名同学,请按照学生的年龄排序,然后输出学生的学号和姓名。具体代码见Student.java文件, 请实现sort函数。并运行该程序。 9. 二叉排序树检索。BstNode.java和BinarySortTree.java是关于二叉排序树的程序文件,请阅读这两个程序 文件,请实现contains函数,并运行该程序。 10. BASE64编码转换问题。请百度百科查询base64编码,实现将二进制字节数据编码转换为base64的字符串数据,以及 将base64字符串转换回二进制字节数据。禁止使用JDK自带的Base64转换程序以及Apache开源网站上的程序, 必须自己编写代码来实现BASE64编码和解码函数。可以为该类添加其他数据成员和函数成员。
1. 发现错误并改错。给出一个实现插入排序的程序,文件名为InsertionSort.java,该文件中有代码错误,请单步调试,发现错误, 并改正错误提示:只有一行程序有错误,所以只能修改代码中的某一行程序。要求演示在eclipse开发环境下 单步调试程序,如果没有eclipse开发环境,也可以使用其它集成开发环境,但是必须演示调试能力。 2. 请编写程序输出13/17小数点后第100位的数字是几?考察循环和除法运算以及模运算(求余数运算)。 请补齐FractionalDigit.java文件中的代码 3. 请编写程序,分别使用循环和递归两种方法计算斐波那契数列第9项是几? 斐波那契数列的第1项为1,第2项为1,后续任意项的值为其前两项的和。 请补齐Fibo.java文件中的代码 4. 实现Array类中的indexOf函数; 阅读Node.java和SingleLinkedList.java两个关于单链表的类, 实现SingleLinkedList类中的indexOf函数; 5. 阅读Node.java和SingleLinkedList.java类,利用它们来实现栈和双向队列功能,请阅读Stack.java 和Deque.java(双向队列),请实现Stack类中的pop函数,请实现Deque.java中的removeLast函数。 6. 利用前面的Stack.java和Deque.java类,实现下面问题的求解: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少? 如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少?(百度查询 卡特兰数) 请补齐Catalan.java文件中的代码 7. 八皇后问题。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法。该程序代码在EightQueens.java文件中,请将void place(int n)函数 中未完成的代码补齐,并写出运行结果。 禁止修改其他代码。 8. 学生排序。给出4名同学,请按照学生的年龄排序,然后输出学生的学号和姓名。具体代码见Student.java文件, 请实现sort函数。并运行该程序。 9. 二叉排序树检索。BstNode.java和BinarySortTree.java是关于二叉排序树的程序文件,请阅读这两个程序 文件,请实现contains函数,并运行该程序。 10. BASE64编码转换问题。请百度百科查询base64编码,实现将二进制字节数据编码转换为base64的字符串数据,以及 将base64字符串转换回二进制字节数据。禁止使用JDK自带的Base64转换程序以及Apache开源网站上的程序, 必须自己编写代码来实现BASE64编码和解码函数。可以为该类添加其他数据成员和函数成员。
目录 1.浅谈测试与调试 2.函数 2020/3/17 xidian Prof. wangjunping 1 高瞻远瞩造就先发优势,让优秀称为一种习惯 浅谈测试与调试 2020/3/17 2 学习了C语言的数据类型、运算符、表达式和各种控制语句后, 可以编程解决一些简单的问题。 那么在编好程序后,如何进行测试用例的设计,如何在集成 环境下调试程序呢? 关于测试,需要学习有关方法(黑盒 白盒)。 关于调试(纠错),需要学习调试的途径。 浅谈测试与调试 2020/3/17 3 分析 设计 实现 测试 Tools:flowchart['fləʊˌtʃɑ:t] Pseudocode ['sju:dəʊˌkəʊd] Coding 编码 测试的目标是为了发现错误 测试方法 2020/3/17 xidian Prof. wangjunping 4 测试 白 (programmer) 基本路径 控制结构 黑(User) System test engineer 穷尽 随机 边界值 语句覆盖 条件测试 数据流测试 循环测试 软件测试(白盒测试) 2020/3/17 5 举例 2020/3/17 xidian Prof. wangjunping 6 #define N 2 main() { int largest, a, count=N-1; scanf("%d",&largest); while(count>0) { scanf("%d",&a); if (largest错误的原因并改正。 1、蛮干法 (printf()…) 2、回溯法 (有错误处向上..) 3、原因排除法 (假定正确…) 2020/3/17 xidian Prof. wangjunping 7 2020/3/17 xidian Prof. wangjunping 8 VS 2010调试(在连接成功后) 1)设置断点。点击代码所在行的左边边框或通过鼠 标右击,执行"Breakpoint" "Insert Breakpoint"( 即 "断点" "插入断点")按快捷键【F9】,该行前面 出现一个红色的圆点,如下图所示。 断点设置举例 2020/3/17 xidian Prof. wangjunping 9 断点设置举例 2020/3/17 xidian Prof. wangjunping 10 点击代码所在行的左边边框或通过鼠标右击,执行"Breakpoint" "Insert Breakpoint"( 即"断点" "插入断点") 2)设置watch窗口 右击变量并选择"Add to Watch",则变量的 名称和值会出现在程序下方调试框中 2020/3/17 xidian Prof. wangjunping 11 错误提示 2020/3/17 xidian Prof. wangjunping 12 3)单步调试程序 执行"Debug" "Start Debugging" (即"调试 " "开始调试")或按快捷键【F5】,开始 调试模式。 调试程序开始并运行到断点处暂停下了,此时 执行"Debug" "Step Over" (即"调试 " "单步调试")或按快捷键【F10】来进 行单步调试。 2020/3/17 xidian Prof. wangjunping 13 变量初始化 2020/3/17 xidian Prof. wangjunping 14 1到5相加的程序实现 2020/3/17 xidian Prof. wangjunping 15 习题 3.输入两个数m和n,求其最大公约数和 最小公倍数。 1)明确问题基本概念编辑 若干个互质数的最小公倍数为它们 的乘积的绝对值。 2020/3/17 xidian Prof. wangjunping 16 预备知识 倍数和约数 如果数a能被数b整除,a就叫做b的倍数 ,b就叫做a的约数。 2020/3/17 xidian Prof. wangjunping 17 约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。 if ( a/b==0) 则a为b的倍数,b为a的约数 预备知识 最大公约数:几个整数中公有的约数, 叫做这几个数的公约数;其中最大的一 个,叫做这几个数的最大公约数。 例如:12、16的公约数有1、2、4,其中最大 的一个是4,一般记为(12,16)=4。 12、15、18的最大公约数是3,记为(1

16,472

社区成员

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

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

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