C中的冲突类型错误与某些文件io

时间:2012-11-29 19:47:00

标签: c compiler-warnings

所以这是我的代码

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'的冲突类型

     

警告:先前隐含的'readinputpofV'声明在这里

有人可以提供帮助。此外,我对文件输入是全新的,并希望对我的工作有一些指导。

5 个答案:

答案 0 :(得分:5)

这与文件I / O有

尝试放void readinputpofV(double pix[], double pofV[], char filname[]); 上方 main()

对函数的调用正在作为声明,并且返回类型被假定为int。因此混乱。

答案 1 :(得分:1)

  

以前的隐含声明'readinputpofV'就在这里

隐式声明使返回类型假定为int(在C89 / C90中,隐式声明已在C99中删除)。因此假定的类型和定义的类型不兼容。

因此,编译器会警告冲突的类型。

这只是一个警告,而不是错误,并且由于实现的类型具有void返回类型,因此您不会使用返回值,因此代码具有非零的工作概率。但是,在使用它之前,您当然应该使用正确的类型声明该函数。

答案 2 :(得分:1)

你必须在使用它之前声明readinputpofV()函数,否则编译器将假定它返回int,而后来遇到它确实返回void

你应该做的是添加

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

在定义main()之前。

答案 3 :(得分:0)

由于编译器在编译main函数时无法readinputpofV,因此假设此函数返回int 如果在main之前移动函数的定义。警告将消失。

答案 4 :(得分:0)

除了将函数原型声明为main之外,您还可以在main上面编写readinputpofV的完整定义。因此,您将避免错误,而无需声明函数原型。


当我发现它在视觉上有用时,我经常使用这种策略,但它有它的缺点:当你使用多个相互作用的函数时,如果你没有将函数放在正确的位置,这种策略可能会导致编译器错误订购。 C程序是连续编译的;调用函数应该是已知的。

因此,在C中,为了避免隐式声明编译器错误,任何调用函数的定义或它的原型都应放在可能调用它的任何函数之上。你可以从下到上编写它们。