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 上面声明函数原型之外,您还可以在 main 上面编写 readinputpofV 的整个定义。因此,您无需声明函数原型即可避免错误。


当我发现它在视觉上很有帮助时,我经常使用该策略,但它有它的缺点:当您使用多个相互交互的函数时,如果您没有按正确的顺序放置函数,该策略可能会导致编译器错误。C程序是串行编译的;调用的函数应该是已知的。

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

于 2014-07-15T19:27:43.927 回答
0

由于编译器在编译 main 函数时无法读取inputpofV,因此假设该函数返回一个 int 如果您将函数的定义移到 main 之前。警告将消失。

于 2012-11-29T19:51:27.473 回答