2012-01-06 47 views
30

यहां एक प्रोग्राम है जिसे मैं सीधे "सी प्रोग्रामिंग भाषा" की धारा 1.9 से चलाने की कोशिश कर रहा हूं।के एंड आर 2 के अध्याय 1 में सबसे लंबी लाइन उदाहरण संकलित करते समय मुझे "गेटलाइन के लिए विरोधाभासी प्रकार" त्रुटि क्यों मिलती है?

#include <stdio.h> 
#define MAXLINE 1000 

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

main() 
{ 
    int len; 
    int max; 
    char line[MAXLINE]; 
    char longest[MAXLINE]; 

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


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'; 
    return i; 
} 


void copy(char to[], char from[]) 
{ 
    int i; 

    i = 0; 
    while ((to[i] = from[i]) != '\0') 
     ++i; 
} 

यहाँ त्रुटि मैं मिलता है जब मैं उबंटू 11.10 का उपयोग कर कार्यक्रम को संकलित करने का प्रयास करें:

cc  word.c -o word 
word.c:4:5: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here 
word.c:26:5: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here 
make: *** [word] Error 1 

बस यकीन है कि यह पुस्तक में प्रिंट के साथ एक समस्या नहीं था बनाने के लिए, मैं संदर्भित पुस्तक (http://users.powernet.co.uk/eton/kandr2/krx1.html) से अध्याय अभ्यास के पीछे जवाबों का यह सेट और जब मैं व्यायाम 18, 1 9, 20 चलाने की कोशिश करता हूं तो मुझे एक ही त्रुटि मिलती है , 21, आदि, उस लिंक से। यह सीखना वाकई मुश्किल है जब मैं प्रोग्राम को चलाने के लिए नहीं चला सकता कि वे आउटपुट कैसे करते हैं। यह समस्या एक प्रोग्राम में वर्ण सरणी और फ़ंक्शन कॉल पेश करते समय शुरू हुई। मैं इस मुद्दे पर किसी भी सलाह की सराहना करता हूं।

उत्तर

28

समस्या यह है कि getline() एक मानक पुस्तकालय समारोह है। (stdio.h में परिभाषित) आपके फ़ंक्शन का एक ही नाम है और इस प्रकार इसके साथ संघर्ष कर रहा है।

समाधान बस नाम बदलने के लिए है।

+4

इस पर 20 मिनट बर्बाद हो गया। हो सकता है कि –

+0

हाहाहा मुझे भी @ dmtri.com – samrap

+1

** getline() ** ** ** ** मानक लाइब्रेरी फ़ंक्शन ** नहीं है, यह एक एक्सटेंशन है, क्योंकि @Moooeeeep ने गहराई से और यहां भी http: //stackoverflow.com/questions/7376566/can-an-ansi-c-compliant-implementation-include-additional-functions-in-its-stand @Dietrich एपीपी द्वारा। इसलिए, यदि आप आज कोडिंग कर रहे हैं, तो आपको 'getline() 'का उपयोग नहीं करना चाहिए, लेकिन यदि आप उस लाइब्रेरी पर निर्भर करते हैं जो पहले से ही अपने स्वयं-लागू' getline() 'फ़ंक्शन का उपयोग करता है? मुझे लगता है, व्यापक रूप से, @ moooeeeep का जवाब अधिक उपयुक्त है। –

2

आपको गेटलाइन का नाम बदलना है क्योंकि यह पहले से मौजूद है।

+0

@downvoter: कारण? – BlackBear

+0

मुझे प्रश्न में वर्णित एक ही समस्या थी। मैंने कुछ सी संदर्भों को देखा कि क्या 'गेटलाइन()' वास्तव में मानक पुस्तकालय में परिभाषित किया गया था, लेकिन मुझे यह नहीं मिला, मुझे और भी भ्रमित कर रहा था। जिन उत्तरों को मैंने यहां उपयोगी पाया वे थे जो निर्दिष्ट करते हैं कि 'getline() 'को _POSIX_ मानक सी लाइब्रेरी में परिभाषित किया गया है। बस कह रहा है कि 'यह पहले से मौजूद है' भ्रमित और शायद गलत है। –

+0

@IsaacKleinman हालांकि मैं मानता हूं कि मेरा जवाब सटीक विचार नहीं है, लेकिन फिर भी यह सही है: स्वीकृत उत्तर से उद्धरण "समस्या यह है कि getline() एक मानक लाइब्रेरी फ़ंक्शन है। (Stdio.h में परिभाषित)" – BlackBear

3

/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here

है कि आप एक संकेत देना चाहिए। किसी अन्य चीज़ पर कोड में getline() फ़ंक्शन का प्रयास करें और उसका नाम बदलें।

इसके अलावा, main() घोषित करना इस तरह पुरानी शैली है। डिफ़ॉल्ट रूप से घोषित रिटर्न प्रकार और तर्क के साथ कोई फ़ंक्शन, तर्कों की अनिर्दिष्ट संख्या स्वीकार करता है और एक int देता है। यह main() के लिए लगभग मामला है: यह एक int वापस करता है, लेकिन दो तर्क हैं।

int main(int argc, char **argv) 

या: बेहतर होगा कि तुम के रूप में यह घोषित किया था

int main(int argc, char *argv[]) 
+1

इसे केवल सी 99 में हटा दिया गया है। पुरानी स्टाइल फ़ंक्शन परिभाषा अभी भी के एंड आर (संस्करण 2) के अंतिम संस्करण में 'मुख्य' फ़ंक्शन के लिए उपयोग की जाती है। – ouah

+0

वास्तव में? मैंने सोचा था कि इसे पहले एएनएसआई सी विनिर्देश के रूप में तब तक हटा दिया गया था ... – fge

+0

वैसे भी - टिप्पणी संपादित की गई – fge

7

इसका कारण यह है stdio.h एक getline() समारोह है।

तो यह काम करने के लिए एक सरल बात my_getline()

दोनों getline() और getdelim() करने के लिए अपने समारोह का नाम बदलने का होगा मूल रूप से GNU एक्सटेंशन थे। उन्हें POSIX.1-2008 में मानकीकृत किया गया था।

+0

यह प्रश्न का सही उत्तर है। इसे ठीक करने का तरीका नहीं है, लेकिन यदि पुस्तक विशेषज्ञों द्वारा लिखी जाती है तो यह क्यों विफल हो जाती है? "क्योंकि किताब लिखी गई थी जब गेटलाइन अभी तक मानकीकृत नहीं थी।" आह, धन्यवाद। – mimoralea

+0

@ मिकीमोरालेस पुस्तक को एक और मानक के अनुपालन में लिखा गया था। मेरा उत्तर देखें: http://stackoverflow.com/a/17378451/1025391 – moooeeeep

2

getline अब एक और नाम के लिए आप का नाम बदलें getline समारोह और यह संकलन होगा एक POSIX समारोह stdio.h

में घोषित है।

1

पहले से ही "stdio.h" फ़ाइल में परिभाषित गेटलाइन नामक एक फ़ंक्शन है। इस प्रकार प्रोटोटाइप में एक संघर्ष! अपने फ़ंक्शन को "my_getline" या किसी अन्य नाम पर पुनर्नामित करें और सभी ठीक होना चाहिए!

27

विरोधाभासी फ़ंक्शन getline() एक जीएनयू/पॉज़िक्स एक्सटेंशन है।

के & आर बताता है कि वे विशेष रूप से एएनएसआई सी को अपनी पुस्तक (c.f.) में संबोधित करते हैं, जो यह फ़ंक्शन प्रदान नहीं करता है।

लेखक एएनएसआई मानक सी भाषा प्रोग्रामिंग के लिए पूरी मार्गदर्शिका प्रस्तुत करते हैं।

"के & आर संगतता मोड" में जीसीसी सेट करने के क्रम में आप संकलन के लिए एएनएसआई या आईएसओ मोड निर्दिष्ट कर सकते हैं। ये एक्सटेंशन अक्षम करने के लिए हैं, उदाहरण के लिए, फ़ंक्शन getline()। यह अंततः के & आर द्वारा प्रदान किए गए अन्य उदाहरणों को संपादित करने की आवश्यकता को समाप्त कर सकता है।

उदाहरण के लिए, निम्नलिखित संकलन ठीक:

$ gcc test.c -ansi 
$ gcc test.c -std=c89 

(। सिवाय कि वे -Wall साथ main() की अंतर्निहित डिफ़ॉल्ट वापसी प्रकार के बारे में शिकायत)

कुछ सिस्टम पर जाहिरा

, इन मोड नहीं हो सकता यहां प्रस्तुत किए गए कार्य (apparantly some version(s) of Mac OS fail to correctly disable all extensions)। मैंने अपनी मशीन पर सफलतापूर्वक इसका परीक्षण किया:

$ gcc --version 
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

मैंने 'gcc test.c -ansi' की कोशिश की है। ऐसा लगता है कि यह काम नहीं करता है। – Jack

+0

@ जैक क्या ओएस/- संस्करण आपने कोशिश की? – moooeeeep

+0

मै मैकोज़ सिएरा संस्करण 10.12.5 का उपयोग करता हूं। इस ओएस में 'gcc test.c -ansi' के लिए कोई प्रतिस्थापन? – Jack