具有挑战性的高手问题!

时间:2022-02-02 19:55:59
程序运行时,显示”非法操作,即将中断“
调试时运行到m_list.AddString(string);这出错,并弹出对话框显示       “Unhandled exception in CSpring.exe:0xC0000005:Access violation"
然后单击”确定“跳到
                 // delegate to object's WindowProc
lResult = pWnd->WindowProc(nMsg, wParam, lParam);
这是什么意思?
声明;m_list.AddString(string);中的string调试时已经有值"实际值为:2.1"

18 个解决方案

#1


m_list create了吗?
你在什么地方调用的
如果是在create函数中调用的,
把它换到响应WM_CREATE的OnCreate()中

#2


code?

#3


m_list你如何初始化的,比如Create等

#4


你用的代码必须在init...函数中不能用在create函数中

#5


m_list
显然是没有值的

#6


while(n>0)
{...
 m_list.AddString(string);
 ....
 n__;
}
我是在循环中用的,调试时并不是一开始就出错,而是运行了几十次才出错的
所以我觉得不是m_list的错
谁能解释一下“Unhandled exception in CSpring.exe:0xC0000005:Access violation"是什么意思,为什么会跳到lResult = pWnd->WindowProc(nMsg, wParam, lParam);

#7


是不是m_list的问题?
捕捉一下异常

#8


多给一点code

#9


是不是每次循环中string都分配了内存?

#10


比较乱,谢谢各位了
for(int j=0;j<select_number_f;j++)
  for(int i=0;i<select_number_k;i++)
   if((UpStr[select_k[i].i1][select_f[j].j1].n>0)&&(DownStr[select_k[i].i2][select_f[j].j2].n>0)&&(m_num>0))

   string.Format("<第%d组>",++group_number);
  m_list.AddString(string);
string.Format("上片:K值:%f g/mm",UpStr[select_k[i].i1][select_f[j].j1].k);
 m_list.AddString(string);
 string.Format("      F值:%f gf",UpStr[select_k[i].i1][select_f[j].j1].f);
m_list.AddString(string);
string.Format("下片  K值:%f g/mm",DownStr[select_k[i].i2][select_f[j].j2].k);
m_list.AddString(string);
string.Format("      F值:%f gf",DownStr[select_k[i].i2][select_f[j].j2].f);
m_list.AddString(string);
////计算实际达到的频率 ////
caculated_f=UpStr[select_k[i].i1][select_f[j].j1].k+DownStr[select_k[i].i2][select_f[j].j2].k;
caculated_f=sqrt(caculated_f/m_weight* 9806.65)/(2*3.1415926);
////计算实际达到的支撑率////
f1_add_f2=UpStr[select_k[i].i1][select_f[j].j1].f + DownStr[select_k[i].i2][select_f[j].j2].f;
min_number=min(UpStr[select_k[i].i1][select_f[j].j1].n,DownStr[select_k[i].i2][select_f[j].j2].n);
if((select_k[i].i1==select_k[i].i2)&&(select_f[j].j1==select_f[j].j2)) min_number=min_number/2;
if(m_num>=min_number)
{
UpStr[select_k[i].i1][select_f[j].j1].n-=min_number;
DownStr[select_k[i].i2][select_f[j].j2].n-=min_number;
m_num-=min_number;
PairInfo[group_number].n=min_number;
}
else
{
UpStr[select_k[i].i1][select_f[j].j1].n-=m_num;
 DownStr[select_k[i].i2][select_f[j].j2].n-=m_num;
min_number=m_num;
m_num-=min_number;
PairInfo[group_number].n=m_num;
}
///保存配对数据信息///
PairInfo[group_number].f=caculated_f;
PairInfo[group_number].UpK=UpStr[select_k[i].i1][select_f[j].j1].k;
PairInfo[group_number].DownK=DownStr[select_k[i].i2][select_f[j].j2].k;
PairInfo[group_number].UpF=UpStr[select_k[i].i1][select_f[j].j1].f;
PairInfo[group_number].DownF=DownStr[select_k[i].i2][select_f[j].j2].f;

actual_take_number+=min_number;

string.Format("实际频率:%f",caculated_f);
m_list.AddString(string);////////////在这出错////大概循环了100多次后
string.Format("实际支撑力:%f",f1_add_f2);
m_list.AddString(string);
string.Format("第%d组实际取出%d对",group_number,min_number);
m_list.AddString(string);
}
 string="----------成功配对----------";
m_list.AddString(string);
string.Format("一共有%d组,实际配对%d对",group_number,actual_take_number);
m_list.AddString(string);
iResultNum=group_number;
if(actual_take_number==oldNum)
MessageBox( "您已成功配对!", "配对结果",MB_ICONWARNING);
else
{
string.Format("您只成功配了%d对!\r\n是否只配这么多对,并把数据存入库中?",actual_take_number);
MessageBox(string, "配对结果",MB_ICONWARNING);
}
                
}

#11


我知道有两种可能
1.如果是在debug版本下出错,请检查是否是多线程,是否采用了线程同步机制
2.如果是在release版本下,请检查是否在消息处理中又嵌套发送了消息,即使是异步发送也不行

#12


数组越界了吗?

#13


应该没有

#14


谁能解释一下“Unhandled exception in CSpring.exe:0xC0000005:Access violation"是什么意思,为什么会跳到lResult = pWnd->WindowProc(nMsg, wParam, lParam);

#15



How Can I Debug an Access Violation?
Full Problem Description: My program produces an access violation. How can I debug this?

Use the Call Stack window to work your way back up the call stack, looking for corrupted data being passed as a parameter to a function. If that fails, try setting a breakpoint at a point before the location where the access violation occurs. Check to see if data is good at that point. If so, try stepping your way toward the location where the access violation occurred. 

If you can identify a single action, such as a menu command, that led to the access violation, you can try another technique: setting a breakpoint between the action (in this example, the menu command) and the access violation. You can then look at the state of your program during the moments leading up to the access violation. 

You can use a combination of these techniques to work forward and backward until you have isolated the location where the access violation occurred. For more information, see Viewing the Call Stack for a Function.

#16


Get more yourself via MSDN

#17


有可能是
string.Format("实际频率:%f",caculated_f);
出错。
有时我也CString的Format方法出错的问题。

#18


m_list没有正常的初始化,检查一下

#1


m_list create了吗?
你在什么地方调用的
如果是在create函数中调用的,
把它换到响应WM_CREATE的OnCreate()中

#2


code?

#3


m_list你如何初始化的,比如Create等

#4


你用的代码必须在init...函数中不能用在create函数中

#5


m_list
显然是没有值的

#6


while(n>0)
{...
 m_list.AddString(string);
 ....
 n__;
}
我是在循环中用的,调试时并不是一开始就出错,而是运行了几十次才出错的
所以我觉得不是m_list的错
谁能解释一下“Unhandled exception in CSpring.exe:0xC0000005:Access violation"是什么意思,为什么会跳到lResult = pWnd->WindowProc(nMsg, wParam, lParam);

#7


是不是m_list的问题?
捕捉一下异常

#8


多给一点code

#9


是不是每次循环中string都分配了内存?

#10


比较乱,谢谢各位了
for(int j=0;j<select_number_f;j++)
  for(int i=0;i<select_number_k;i++)
   if((UpStr[select_k[i].i1][select_f[j].j1].n>0)&&(DownStr[select_k[i].i2][select_f[j].j2].n>0)&&(m_num>0))

   string.Format("<第%d组>",++group_number);
  m_list.AddString(string);
string.Format("上片:K值:%f g/mm",UpStr[select_k[i].i1][select_f[j].j1].k);
 m_list.AddString(string);
 string.Format("      F值:%f gf",UpStr[select_k[i].i1][select_f[j].j1].f);
m_list.AddString(string);
string.Format("下片  K值:%f g/mm",DownStr[select_k[i].i2][select_f[j].j2].k);
m_list.AddString(string);
string.Format("      F值:%f gf",DownStr[select_k[i].i2][select_f[j].j2].f);
m_list.AddString(string);
////计算实际达到的频率 ////
caculated_f=UpStr[select_k[i].i1][select_f[j].j1].k+DownStr[select_k[i].i2][select_f[j].j2].k;
caculated_f=sqrt(caculated_f/m_weight* 9806.65)/(2*3.1415926);
////计算实际达到的支撑率////
f1_add_f2=UpStr[select_k[i].i1][select_f[j].j1].f + DownStr[select_k[i].i2][select_f[j].j2].f;
min_number=min(UpStr[select_k[i].i1][select_f[j].j1].n,DownStr[select_k[i].i2][select_f[j].j2].n);
if((select_k[i].i1==select_k[i].i2)&&(select_f[j].j1==select_f[j].j2)) min_number=min_number/2;
if(m_num>=min_number)
{
UpStr[select_k[i].i1][select_f[j].j1].n-=min_number;
DownStr[select_k[i].i2][select_f[j].j2].n-=min_number;
m_num-=min_number;
PairInfo[group_number].n=min_number;
}
else
{
UpStr[select_k[i].i1][select_f[j].j1].n-=m_num;
 DownStr[select_k[i].i2][select_f[j].j2].n-=m_num;
min_number=m_num;
m_num-=min_number;
PairInfo[group_number].n=m_num;
}
///保存配对数据信息///
PairInfo[group_number].f=caculated_f;
PairInfo[group_number].UpK=UpStr[select_k[i].i1][select_f[j].j1].k;
PairInfo[group_number].DownK=DownStr[select_k[i].i2][select_f[j].j2].k;
PairInfo[group_number].UpF=UpStr[select_k[i].i1][select_f[j].j1].f;
PairInfo[group_number].DownF=DownStr[select_k[i].i2][select_f[j].j2].f;

actual_take_number+=min_number;

string.Format("实际频率:%f",caculated_f);
m_list.AddString(string);////////////在这出错////大概循环了100多次后
string.Format("实际支撑力:%f",f1_add_f2);
m_list.AddString(string);
string.Format("第%d组实际取出%d对",group_number,min_number);
m_list.AddString(string);
}
 string="----------成功配对----------";
m_list.AddString(string);
string.Format("一共有%d组,实际配对%d对",group_number,actual_take_number);
m_list.AddString(string);
iResultNum=group_number;
if(actual_take_number==oldNum)
MessageBox( "您已成功配对!", "配对结果",MB_ICONWARNING);
else
{
string.Format("您只成功配了%d对!\r\n是否只配这么多对,并把数据存入库中?",actual_take_number);
MessageBox(string, "配对结果",MB_ICONWARNING);
}
                
}

#11


我知道有两种可能
1.如果是在debug版本下出错,请检查是否是多线程,是否采用了线程同步机制
2.如果是在release版本下,请检查是否在消息处理中又嵌套发送了消息,即使是异步发送也不行

#12


数组越界了吗?

#13


应该没有

#14


谁能解释一下“Unhandled exception in CSpring.exe:0xC0000005:Access violation"是什么意思,为什么会跳到lResult = pWnd->WindowProc(nMsg, wParam, lParam);

#15



How Can I Debug an Access Violation?
Full Problem Description: My program produces an access violation. How can I debug this?

Use the Call Stack window to work your way back up the call stack, looking for corrupted data being passed as a parameter to a function. If that fails, try setting a breakpoint at a point before the location where the access violation occurs. Check to see if data is good at that point. If so, try stepping your way toward the location where the access violation occurred. 

If you can identify a single action, such as a menu command, that led to the access violation, you can try another technique: setting a breakpoint between the action (in this example, the menu command) and the access violation. You can then look at the state of your program during the moments leading up to the access violation. 

You can use a combination of these techniques to work forward and backward until you have isolated the location where the access violation occurred. For more information, see Viewing the Call Stack for a Function.

#16


Get more yourself via MSDN

#17


有可能是
string.Format("实际频率:%f",caculated_f);
出错。
有时我也CString的Format方法出错的问题。

#18


m_list没有正常的初始化,检查一下