【发布时间】:2011-10-31 09:54:57
【问题描述】:
我有一个奇怪的问题。当我尝试编译下面的代码时,它按预期工作而没有失败:
#include <iostream>
#include <Windows.h>
int main(){
FILE *f = fopen("trystl.geo","w");
fprintf(f,"Merge \"trystl.stl\";");
fprintf(f,"\n");
fprintf(f,"Surface Loop(2) = {1};");
fprintf(f,"\n");
fprintf(f,"Volume(3) = {2};");
fclose(f);
return 0;
}
但是当我尝试将此程序连接到具有 FLTK 用户界面的按钮时,它给了我一个断言运行时错误。我的代码段:
void UserInterface::cb_m_BtnSTLToGEOConverter_i(Fl_Button*, void*){
//OnSTLToGEOConvert();
FILE *f = fopen("trystl.geo","w");
fprintf(f,"Merge \"trystl.stl\";");
fprintf(f,"\n");
fprintf(f,"Surface Loop(2) = {1};");
fprintf(f,"\n");
fprintf(f,"Volume(3) = {2};");
fclose(f);
}
void UserInterface::cb_m_BtnSTLToGEOConverter(Fl_Button* o, void* v){
((UserInterface*)(o->parent()->parent()->parent()->parent()->parent()->parent()->parent()->user_data()))->cb_m_BtnSTLToGEOConverter_i(o,v);
}
当用户按下按钮时,我希望程序创建一个名为 trystl.geo 的文件并执行所示操作。但是当编译打开程序并点击按钮时,它会说:
调试断言失败!
程序:*.......\src\fprintf.c 第 55 行:
表达式:(str!NULL)
中止重试或忽略...
我正在使用 Visual Studio 2010。
【问题讨论】:
-
您将第一个 sn-p 与第二个进行比较,就好像它们是等价的,但第二个包含一个单独的函数,其中包含非常可疑的函数结果取消引用序列。我会把你的精力集中在那里,然后用不那么疯狂的testcase 回到我们这里。
-
@Tomalak:仍然,
fprintf部分在两个 sn-ps 中是相同的,并且它不依赖于任何参数,也不依赖于this(实际上,只使用字符串文字),所以理论上它应该可以工作;对于这种故障,唯一想到的就是堆栈损坏。 -
@Matteo:是的,鉴于荒谬的取消引用堆栈/堆损坏(或简单地取消引用错误的东西)显然是问题所在。关键是,第二个 sn-p 的问题几乎可以肯定与第一个完全无关。如此盲目地忽视其中的差异,这几乎是令人反感的。
-
@Italia。这才是重点。所有“parent()”的函数都是正确的。问题应该出在不同的地方。
-
((UserInterface*)o->parent()->parent()->parent()->parent()->parent()->parent()->parent()->user_data()))->cb_m_BtnSTLToGEOConverter_i(o,v);这会让我做噩梦:/(显然会杀死 FF 下 SO 的格式:D)
标签: c++ visual-c++ user-interface button fltk