1

我有一个奇怪的问题。当我尝试编译下面的代码时,它按预期工作而没有失败:

#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。

4

2 回答 2

3

错误很简单:VC++ 中 fprintf.c 中的第 55 行_VALIDATE_RETURN( (str != NULL), EINVAL, -1);str参数FILE*(虽然我见过更好的命名变量)。

对于好奇的(我是)_VALIDATE_RETURN定义如下:

#define _VALIDATE_RETURN( expr, errorcode, retexpr )                           \
    {                                                                          \
        int _Expr_val=!!(expr);                                                \
        _ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) );                       \
        if ( !( _Expr_val ) )                                                  \
        {                                                                      \
            errno = errorcode;                                                 \
            _INVALID_PARAMETER(_CRT_WIDE(#expr) );                             \
            return ( retexpr );                                                \
        }                                                                      \
    }

所以最好在尝试写入不存在的文件描述符之前检查您的 fopen() 调用是否成功。

于 2011-08-21T01:30:11.220 回答
0

好的,我找到了解决方案。唯一的问题是,如果您不在程序中输入整个路径,则文件不会被打开。我换了

FILE *f = fopen("trystl.geo","w");

FILE *f = fopen("c:/Users/anypath/trystl.geo","w");

有用!

谢谢你的帮助!

于 2011-08-21T22:59:18.250 回答