2

だからここに私のコードがあります

int main(int argc, char *argv[] )
{
    double mass1, mass2, tof, pixcm;
    char pofVfilename[50];
    double pix[50];
    double pofV[50];
    if(argc != 2)
    {
        printf("usage: %s filename", argv[0]); 
   }
else
    {
        FILE *file = fopen(argv[1], "r");
        if(file == 0){
            printf("could not open file\n");
        }
        else{
            fscanf(file, "%lf %lf", &mass1, &mass2);
            fscanf(file, "%lf", &tof);
            fscanf(file, "%s", pofVfilename);
            fscanf(file, "%lf", &pixcm);
            fclose(file);
            printf("%lf%lf%lf%lf", mass1, mass2, tof, pixcm);  
            readinputpofV(pix, pofV, pofVfilename);
            printf("%f %f", pix[10], pofV[10]);
        }
            
    }
    return 0;
}


void readinputpofV(double pix[], double pofV[], char filname[]){
    FILE *file = fopen(filname, "r");
    if(file == 0){
        printf("could not open pofV file\n");
    }
    else{
        int result = 2;
        int i = 0;
        while(result == 2){
            result = fscanf(file, "%lf %lf", &pix[i], &pofV[i]);
            i++;
        }
    }
    fclose(file);
}

私が得るエラーは

警告: 'readinputpofV' のタイプが競合しています</p>

警告: 'readinputpofV' の以前の暗黙の宣言がここにありました

誰か助けてくれませんか。また、私はファイル入力にまったく慣れていないので、自分のやり方についてのガイダンスを期待していました.

4

5 に答える 5

5

これはファイル I/O と は関係ありません。

void readinputpofV(double pix[], double pofV[], char filname[]); に置いてみてくださいmain()

関数の呼び出しは宣言と見なされ、戻り値の型は と見なされintます。したがって、混乱。

于 2012-11-29T19:49:57.193 に答える
1

「readinputpofV」の以前の暗黙の宣言はここにありました

暗黙的な宣言により、戻り値の型が想定されますint(C89/C90 では、暗黙的な宣言は C99 で削除されました)。したがって、想定される型と定義の型は互換性がありません。

したがって、コンパイラは競合する型について警告します。

ただし、これは単なる警告であり、エラーではありません。実装された型にはvoid戻り値の型があるため、戻り値を使用しないため、コードが機能する可能性はゼロではありません。ただし、もちろん、関数を使用する前に、正しい型で関数を宣言する必要があります。

于 2012-11-29T19:49:00.247 に答える
1

関数を使用する前に宣言する必要があります。そうreadinputpofV()しないと、コンパイラはそれが を返すと想定しますがint、後で実際に を返すことに遭遇しますvoid

あなたがすべきことは追加することです

void readinputpofV(double pix[], double pofV[], char filname[]);

の定義の前にmain().

于 2012-11-29T19:49:20.497 に答える
0

コンパイラは main 関数のコンパイル中に inputpofV を読み取ることができなかったので、関数の定義を main の前に移動すると、この関数は int を返すと想定されます。警告が消えます。

于 2012-11-29T19:51:27.473 に答える
0

main の上に関数プロトタイプを宣言するだけでなく、main の上に readinputpofV の定義全体を書くことができます。したがって、関数プロトタイプを宣言する必要なく、エラーを回避できます。


私は視覚的に役立つと思うときにその戦術をよく使用しますが、それには欠点があります。相互に作用する複数の関数を使用する場合、関数を正しい順序で配置しないと、その戦術によってコンパイラ エラーが発生する可能性があります。C プログラムは逐次的にコンパイルされます。呼び出された関数を知る必要があります。

したがって、C では、暗黙的な宣言のコンパイラ エラーを回避するために、呼び出された関数の定義またはそのプロトタイプを、それを呼び出す可能性のある関数の上に配置する必要があります。下から上に書くだけです。

于 2014-07-15T19:27:43.927 に答える