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);パラメーターです (ただし、より適切な名前付き変数を見てきました)。strFILE*

好奇心旺盛な (I was)_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

OK解決策を見つけました。唯一の問題は、プログラムにパス全体を入力しないと、ファイルが開かないことです。交換しました

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

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

できます!

ご協力ありがとうございました!

于 2011-08-21T22:59:18.250 に答える