declarația anterioară a ‘function’ a fost aici în C [duplicat] (Programare, C)

alittleboy a intrebat.

Posibil duplicat:
Învățarea C de către K&R, eroare atunci când încercați să compilați programe din carte cu array-uri și apeluri de funcții

În timp ce învățam Limbajul de programare C de Brian W. Kernighan și Dennis M. Ritchie, am încercat exemplul din secțiunea 1.9 Character Arrays. Iată care sunt codurile:

/* read a set of text lines and print the longest */

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */

/* declare functions: getline() and copy() */
int getline(char line[], int maxline); 
void copy(char to[], char from[]);

/* getline: read a line into array "s", return length */ 
int getline(char s[], int lim)
{
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='
'; ++i)
        s[i] = c;
    if (c == "
"){
        s[i] = c;
        ++i;
    }
    s[i] = '';  /* the null character whose value is 0 */
    return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */ 
/* the return type of copy is "void" -- no value is returned */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '')  /* terminated with a  */
        ++i; 
}

/* print the longest input line */
int main()
{
    int len;  /* current line length */ 
    int max;  /* maximum length seen so far */
    char line[MAXLINE];  /* current input line */
    char longest[MAXLINE];  /* longest line saved here */

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
    if (len > max) { 
        max = len;
        copy(longest, line); 
    }
    if (max>0) /* there was a line */ 
        printf("%s", longest);
    return 0; 
}

Există două erori principale:

  1. eroare: tipuri contradictorii pentru ‘getline’
  2. eroare: declarația anterioară a „getline” a fost aici

Lista completă a erorilor este aici:

/Users/C/Codes/Ritchie/array_char.c:8: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c:13: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c: In function ‘getline’:
/Users//C/Codes/Ritchie/array_char.c:17: warning: comparison between pointer and integer
/Users/C/Codes/Ritchie/array_char.c:17: warning: comparison with string literal results in unspecified behavior

Nu sunt sigur ce a mers prost, deoarece este exact același cod din carte. Poate că declarația funcțiilor de la început:

int getline(char line[], int maxline); 
void copy(char to[], char from[]);

este problematică? Vă mulțumesc!

Comentarii

  • Vă rugăm să postați mesajul de eroare real (nu parafrazați) –  > Por CrazyCasta.
  • Există vreun motiv pentru a face totul în mod greșit aici, sau ai putea folosi fgets și strcpy în schimb? –  > Por Jerry Coffin.
4 răspunsuri
Neo

http://www.kernel.org/doc/man-pages/online/pages/man3/getline.3.html

getline există deja în stdio.h. De aceea primești eroarea. Schimbați numele funcției cu altceva, cum ar fi getline_my.

De asemenea, în linia 16 compari un caracter cu un șir de caractere. Ar trebui să fie

if(c == '
')

NOT


if(c == "
")

Comentarii

  • Bună observație! Cred că OP a tastat codul. –  > Por j_random_hacker.
  • Ei bine, ofc OP a tastat codul în. El citește o carte 😛 –  > Por CrazyCasta.
  • @Neo: mulțumesc pentru că ai semnalat acest lucru! –  > Por alittleboy.
CrazyCasta

Problema este că există probabil o definiție a lui getline în stdio.h. Pe versiunea mea de linux există o funcție getline furnizată de biblioteca C (cred că face parte din standardul POSIX). Nu poți avea două funcții cu același nume în C, iar aceasta este problema ta. Încercați să redenumiți versiunea dvs. de getline în my_getline (atât acolo unde o declarați/definiți, cât și acolo unde o utilizați).

Karl Knechtel
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here

Este exact așa cum scrie: getline este declarat în stdio.h (pentru că biblioteca standard oferă o funcție cu acest nume). Nu puteți furniza propria funcție cu acest nume, deoarece atunci când apelați getline, compilatorul nu ar ști pe care să o folosească.

alinsoar

De la data la care a fost scrisă acea carte și până în zilele noastre biblioteca Standard C s-a modificat puțin, și nu mai sunt consistente cea veche și cea nouă.

Trebuie să eliminați declarațiile, și să lăsați declarațiile din stdio.h actual.

Comentarii

  • Aceasta nu provine din modificarea standard. Este de la faptul că gcc nu se conformează cu standardul. –  > Por Jerry Coffin.
  • Este posibil să citească a doua ediție, care a fost actualizată la ANSI C, care ar trebui să compileze pe orice compilator C. (De asemenea, codul pe care l-a scris ar trebui să ruleze pe orice compilator C, în afară de faptul că numele funcției este deja folosit, așa că trebuie să-l schimbe). –  > Por CrazyCasta.
  • da, gcc-ul actual este c89 în mod implicit, dacă nu introduceți -c99. a apărut și c11. –  > Por alinsoar.

Tags: