2012-11-04 15 views
5

Possible Duplicate:
Learning C by K&R, error when trying to compile programs from book with arrays and function callsपिछले घोषणा सी

ब्रायन डब्ल्यू Kernighan और डेनिस एम रिची द्वारा सी प्रोग्रामिंग भाषा सीखने जबकि में यहाँ था, मैं में खंड 1.9 चरित्र सरणी उदाहरण की कोशिश की। गया था यहाँ 'getline' के पिछले घोषणा: यहाँ कोड हैं:

  1. त्रुटि: परस्पर विरोधी 'getline'
  2. त्रुटि के लिए प्रकार

    /* 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!='\n'; ++i) 
         s[i] = c; 
        if (c == "\n"){ 
         s[i] = c; 
         ++i; 
        } 
        s[i] = '\0'; /* 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]) != '\0') /* terminated with a \0 */ 
         ++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; 
    } 
    

    दो मुख्य त्रुटियां नहीं हैं

    पूर्ण त्रुटि सूची यहां है:

    /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 
    

    मुझे यकीन नहीं है कि क्या गलत हुआ, क्योंकि यह पुस्तक से बिल्कुल वही कोड है। शायद शुरुआत में कार्यों की घोषणा:

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

    समस्याग्रस्त है? धन्यवाद!

+1

कृपया वास्तविक त्रुटि संदेश पोस्ट करें (पैराफ्रेश नहीं करें) – CrazyCasta

+0

क्या यहां सबकुछ कठिन तरीके से करने का कोई कारण है, या आप इसके बजाय 'fgets' और' strcpy' का उपयोग कर सकते हैं? –

उत्तर

8

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

getline पहले से ही stdio.h में मौजूद है। यही कारण है कि आपको त्रुटि मिल रही है। फ़ंक्शन नाम को getline_my जैसे किसी अन्य चीज़ में बदलें।

इसके अलावा, आप लाइन 16 में एक तार के साथ एक चरित्र की तुलना कर रहे यह
if(c == '\n')

नहीं

if(c == "\n")

+0

अच्छा स्पॉटिंग! मुझे लगता है कि ओपी ने कोड टाइप किया है। –

+0

ठीक है ओपी ने ओपी टाइप किया है। वह एक पुस्तक पढ़ रहा है: पी – CrazyCasta

+0

@ नीओ: इसे इंगित करने के लिए धन्यवाद! – alittleboy

4

समस्या यह है कि की stdio.h में एक परिभाषा की संभावना है। लिनक्स के मेरे संस्करण पर सी लाइब्रेरी द्वारा प्रदान की गई एक गेटलाइन फ़ंक्शन है (पॉज़िक्स मानक मुझे लगता है) का हिस्सा है। आपके पास सी में समान नाम के साथ दो कार्य नहीं हो सकते हैं, और यह आपकी समस्या है। getline पर my_getline (जहां आप इसे घोषित/परिभाषित करते हैं और जहां आप इसका उपयोग करते हैं) के अपने संस्करण का नाम बदलने का प्रयास करें।

1

तारीख से किया जाना चाहिए जब उस किताब आजकल अप करने के लिए लिखा गया था मानक सी लाइब्रेरी थोड़ा संशोधित है, और वे अब और पुराने और नए नहीं हैं।

आपको घोषणाओं को हटाना होगा, और मौजूदा stdio.h से घोषणाएं छोड़नी होंगी।

+0

यह मानक परिवर्तन से नहीं है।यह जीसीसी से मानक के अनुरूप होने में असफल रहा है। –

+0

वह दूसरा संस्करण पढ़ रहा है, जिसे एएनएसआई सी में अपडेट किया गया था, जिसे किसी भी सी कंपाइलर पर संकलित करना चाहिए। (साथ ही, जिस कोड को उन्होंने लिखा था उसे किसी भी सी कंपाइलर पर चलाना चाहिए, इस तथ्य के अलावा कि फ़ंक्शन का नाम पहले ही उपयोग किया जा चुका है, इसलिए उसे इसे बदलने की जरूरत है)। – CrazyCasta

+0

हां, वर्तमान जीसीसी डिफ़ॉल्ट रूप से c89 है, जब तक आप -c99 डालें। सी 11 भी दिखाई दिया। – alinsoar

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

यह बिल्कुल है के रूप में यह कहते हैं: getlinestdio.h में घोषित किया जाता है (क्योंकि मानक पुस्तकालय उस नाम का कोई समारोह प्रदान करता है)। आप उस नाम के साथ अपना स्वयं का फ़ंक्शन प्रदान नहीं कर सकते हैं, क्योंकि जब आप getline पर कॉल करते हैं, तो संकलक नहीं जानता कि किस का उपयोग करना है।

संबंधित मुद्दे