我想在屏幕的速度索引上打印。我不是代码的作者。
代码在这里http://pastebin.com/47CbB1vb
获取行也是编译所必需的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* get_line:
* Reads a line into string, returns length.
* Kernighan & Ritchie p.69
*
*/
int
get_line(fp, line, lim)
FILE *fp;
char *line;
int lim;
{
int c, i;
i = 0;
while (--lim > 0 && (c = getc(fp)) != EOF && c != '\n')
line[i++] = c;
if (c == '\n')
{
line[i++] = c;
}
line[i] = '\0';
if (c == EOF)
return (-1);
else
return (i);
}
/*
* ignore_line:
* Gets the next line (up to and including the newline
* character) from the file pointed to by fptr and
* promptly loses it. Taken from asc2ah.c.
*
* Siggi 29.06.1990
*/
int
ignore_line(dat_fp)
FILE *dat_fp;
{
char string[256];
char *fgets();
if (fgets(string, 250, dat_fp) == NULL) /* nothing there */
return (-1);
return (0); /* there was something */
我尝试使用gcc编译
gcc gi_line.c vel2d.c -lm -o vel2d
vel2d.c: In function ‘main’:
vel2d.c:205:19: warning: format ‘%f’ expects argument of type ‘double’, but argument 3 has type ‘int’ [-Wformat=]
fprintf(stdout,"%.1f",index);
^
vel2d.c:206:9: error: ‘else’ without a previous ‘if’
else
^
我只包含了fprintf行。没有那行,我可以编译代码,它可以很好地工作。那么我应该改变什么呢?
答案 0 :(得分:1)
以下是有问题的违规代码:
if (xflg)
index = m * nxy + l*nx + k;
fprintf(stdout,"%.1f",index);
else
index = m * nxy + k*ny + l;
此if
语句的“if”和“else”部分最初各有一行,因此添加大括号并非绝对必要。但是,当您将调用添加到fprintf
时,这改变了一切。
由于if
之后没有大括号,index = m * nxy + l*nx + k;
行包含整个if
部分。后面的printf
是{em>不 if
的一部分,是一个单独的声明。然后,当编译器看到else
时,没有对应的if
,因为之前的if
已完成。
这可以通过添加大括号来修复:
if (xflg) {
index = m * nxy + l*nx + k;
fprintf(stdout,"%.1f",index);
} else {
index = m * nxy + k*ny + l;
}
您应该始终为任何if
,else
,for
,while
或do
块添加大括号,即使正文只有一行。这可以防止这样的错误发生。
在这种情况下你很幸运,无法添加大括号导致编译器错误。如果您在此示例中没有else
部分,则代码将进行编译,printf
将始终运行。然后你会摸不着头脑,弄明白为什么。
对于printf
警告,index
属于int
类型,因此您需要使用正确的格式说明符打印%d
。