2016-04-01 4 views
-4

Я хочу напечатать на экране индекс скорости. Я не автор кода.ошибка: «else» без предыдущей «if» с fprintf

Код здесь 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 line.Without что строка I c может скомпилировать код, и он отлично работает. Так что я должен изменить?

+1

Где 'fprintf' в вашем фрагменте кода? (Это в строке 205, а оскорбительное 'else' находится в строке 206. В вашем коде не так много строк.) –

+1

Возможный дубликат [Почему я получаю компиляционную ошибку, которая говорит об ошибке:« else »без предыдущей ' if?? (http://stackoverflow.com/questions/17587875/why-do-i-get-a-compiling-error-that-says-error-else-without-a-previous-if) – owacoder

+0

@MOehm - Он находится в пастебинской ссылке. Но проблема заключается в двух операциях после 'if' с' else' после него. Ничего из двух фигурных скобок не исправить. – owacoder

ответ

1

Вот код обижая в вопросе:

 if (xflg) 
       index = m * nxy + l*nx + k; 
       fprintf(stdout,"%.1f",index); 
     else 
      index = m * nxy + k*ny + l; 

«тогда» и «еще» разделы настоящего if заявления первоначально имели одну строку каждый, так что добавление скобок не было строго необходимо. Но когда вы добавили звонок в fprintf, это изменило ситуацию.

В связи с отсутствием брекетов после if, линия index = m * nxy + l*nx + k; состоит из всей части if. Следующий printf - это не часть 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.

+0

Как написать m, l, k в одной строке? Я попробовал fprintf (f, "% 2d% d% 2d \ n", m, l, k); но он пишет каждую в новой строке. – milenko