C中与某些文件io冲突的类型错误
这是我的代码C中与某些文件io冲突的类型错误,c,compiler-warnings,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 {
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”的先前隐式声明在此
有人能帮忙吗。此外,我是一个全新的文件输入,并希望得到一些指导,我如何做
先前的隐式声明“readinputpofV”在这里
隐式声明使返回类型假定为int
(在C89/C90中,隐式声明已在C99中删除)。因此,假定类型和定义类型不兼容
因此,编译器会警告冲突类型
不过,这只是一个警告,而不是一个错误,而且由于实现的类型具有
void
返回类型,因此您不会使用返回值,因此代码工作的概率非零。但是,在使用函数之前,您当然应该使用正确的类型声明它。您必须在使用函数之前声明readinputpofV()
函数,否则编译器将假定它返回int
,而稍后它会遇到它确实返回void
您应该做的是添加
void readinputpofV(double pix[], double pofV[], char filname[]);
在定义
main()
之前,这与文件I/O无关
尝试放置void readinputpofV(双pix[],双pofV[],char filname[])代码>
以上main()
对函数的调用被视为它的声明,返回类型被假定为int
。因此会产生混淆。因为编译器在编译主函数时无法读取InputPofv,所以该函数假定该函数返回int
如果将函数的定义移到main之前。警告将消失。除了在main上面声明函数原型之外,还可以在main上面编写readinputpofV的整个定义。因此,无需声明函数原型即可避免错误
当我发现这种策略在视觉上很有帮助时,我经常使用它,但它也有缺点:当您使用多个相互交互的函数时,如果您不按正确的顺序放置函数,这种策略可能会导致编译器错误。C程序是串行编译的;调用的函数应该是已知的
因此,在C语言中,为了避免隐式声明编译器错误,任何被调用函数的定义或原型都应该放在任何可能调用它的函数之上。你可以从下到上写它们。谢谢,就是这样,我将readinputpofV改为返回int,现在它可以工作了。最好在使用之前声明它。@H2CO3我不太精通史前语言,但iirc,在C89中,只有在使用返回值时,使用非void返回类型终止函数才能到达}
。如果它被忽略,那是允许的。但是,我可能记错了。@Danielfisher我怀疑你记不太清楚:)但我不明白为什么C在这里是允许的,而在其他地方是逻辑上不允许的。例如,对无效指针执行算术运算也算作未定义,即使您没有取消引用它。根据这个逻辑,这应该是未定义的,即使您不使用返回值。@H2CO3我认为这是历史解释的。最初,没有
void,因此“过程”(在Pascal中称为,cue不是真正喜欢的模糊记忆)必须有一个返回类型。但当然,总是要写一个返回0是很烦人的大约在最后,编译器允许省略返回
(至少有官方保证的行为),人们使用该功能编写代码。因此,当语言被标准化时,一些可疑的实践被正式批准,以避免太多的实现和太多的遗留代码无效。“这与文件I/O无关”——确切地说。重新标记。