0

これは、以前投稿した大きな問題のサブ問題です。以下は、私が使用しようとしている C++ パッケージのコード スニペットです。その意図は、float 配列 prob_estimates の値を出力ファイルに書き込むことです。ランダムに見えるいくつかの行では、配列の値の一部のみが書き込まれます。それはいつ起こりますか?どのようにデバッグすればよいですか?

    int j;
    predict_label = predict_probability(model_,x,prob_estimates);
    fprintf(output,"%g",predict_label);
    for(j=0;j<model_->nr_class;j++) {
        fprintf(output," %g",prob_estimates[j]);
        fflush(output);
    }
    fprintf(output,"\n");

また、これは入力サイズがかなり大きい場合にのみ発生するように見えることも指摘したいと思います。これは、入力ファイル (約 200,000 行) の行ごとに実行される、より大きなループの一部です。prob_estimates 配列には、1 行あたり 500 個の値があります。出力ファイルは、出力ファイルの約 20 奇数行に対して 500 未満の値を書き込みます。これをサブセット (20,000 行) で数回実行したところ、すべて問題ないように見えました。

更新: 書き込みを試行するたびに fprintf の戻り値を確認しようとしましたが、出力に書き込もうとすると、多くの行に対して -1 が返されることがわかりました。

fprintf encountered error at 19th value of line 2109359. Returned -1
fprintf encountered error at 373th value of line 2109359. Returned -1
fprintf encountered error at 229th value of line 2109360. Returned -1
fprintf encountered error at 87th value of line 2109361. Returned -1
fprintf encountered error at 439th value of line 2109361. Returned -1

これは、上記のコードを次のように変更したときです。

 for(j=0;j<model_->nr_class;j++) {
            int e = fprintf(output," %g",prob_estimates[j]);
            if (e < 0) {
            printf("fprintf encountered error at %dth value of line %d. Returned %d",j ,count ,e); }
        }

count数をカウントする変数です。外側のループの先頭でインクリメントされます (ここには示されていません)。fprintf が -1 を返す理由を理解するにはどうすればよいですか?

4

2 に答える 2

1

あなたができるいくつかのこと:

  1. 問題がファイル出力にあるのか別の場所にあるのかを確認するために、すべてをコンソールにも印刷します

  2. model_->nr_class値の数が期待どおりであることを確認するために印刷します

  3. 出力ファイルは、閉じた後でのみ確認してください。出力をフラッシュしますが、他の場所でファイルが更新され、フラッシュされない可能性があります。fcloseだろう。ファイルを各行でフラッシュする代わりに、関数の最初で追加モードで開き、最後で閉じることをお勧めします。

お役に立てれば

于 2012-06-18T15:50:10.270 に答える