0

サブプログラム内で自分のファイルに書き込もうとすると、スタックします。

void new_page(float *a, float *b, float *c, int *d){
    fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d);
}

という警告が表示されます

Warning: incompatible implicit declaration of built-in function 'fprinf' [enabled by default]

「エラー: 'results' が宣言されていません (この関数で最初に使用)」

メインの fprintf では正常に動作しますが、サブプログラム/関数に関しては動作しません。私の理解では、結果は宣言されていないと考えているので、ファイルの名前または場所を渡して機能させる必要がありますか?

4

3 に答える 3

1

resultsグローバルでない限り、未定義です。

results見たところ、 mainと同じようにファイル (ストリーム) を開いています。その場合、それは main のスコープにのみ存在します。

それを関数に渡します。グローバルにすることはお勧めしません。


次のようになります。

void new_page(FILE *results,  float *a, float *b, float *c, int *d){
    fprintf(results,"\nPage Totals: %f\t%f\t%f\t%d", *a,*b,*c,*d);
}

また; この関数が別のファイルにある場合main()、ここで、あなたが言うように、そのファイルにもfprintf含める必要があります。stdio.h


編集:その関数の署名やプロトタイプなどで何か間違ったことをしているように聞こえます.

簡単な例として (fopen などのチェックは必要ありません):

#include <stdio.h>

void foo(FILE * fp)
{
    fprintf(fp, "HELLO\n");
}

int main(void)
{
    FILE *fp;

    fp = fopen("blabla", "w");
    foo(fp);
    fclose(fp);

    return 0;
}

また; あなたのコンパイラは文句を言っていないと言います。広範な警告を使用していますか? そうでない場合は、する必要があります。すなわち GCC:

$ gcc -Wall -Wextra -pedantic -o my_prog my_source.c

-std=c89通常、または必要に応じても追加し-std=c99ます。

次に、valgrind で実行します。

$ valgrind ./my_prog

これらの 2 つの手順により、問題の原因を突き止めるための多くのヒントと手がかりが得られます。

于 2012-04-12T23:25:44.253 に答える
1

警告を解決するにはfprintf、追加する必要があります

#include <stdio.h>

ソースファイルの上部付近。

resultsエラーは異なります。グローバルにするか、new_page関数に引数として渡すことができます。

変数をグローバルにする (つまり、 を含む任意の関数の外側で定義するmain) のは、一般的に不適切なスタイルですが、 をプログラム全体で使用する場合resultsは、FILE*それをグローバルにすることは不合理ではありません。

于 2012-04-12T23:27:56.387 に答える