2015-01-28 4 views
5

अरे, मैं प्रोग्रामिंग (सी में सीएस 50x के माध्यम से सीखना) के लिए नया हूं और जब उन्होंने संरचनाओं का उल्लेख किया तो मैंने चारों ओर बेवकूफ बनाने का प्रयास करने का फैसला किया और बस एक त्वरित प्रोग्राम लिखना जो कुछ मूल्यों को स्वैप करेगा एक समारोह का उपयोग कर एक संरचना। मैं कई त्रुटि संदेशों तक चल रहा हूं, जिनमें से पहला "स्ट्रक्चर नंबर * 'प्रकार के पैरामीटर के लिए" असंगत पॉइंटर प्रकार' पास हो रहा है। एक अन्य समस्या फ़ंक्शन परिभाषा में आती है जहां संकलक कहते हैं "अपूर्ण प्रकार के 'struct संख्या' "मैं सिर्फ कुछ मदद क्योंकि मैं स्टंप्डया हूँ के लिए उम्मीद कर रही थी परिभाषा।प्रोग्रामिंग के लिए नया, संरचनाओं और कार्यों के साथ समस्या

यहाँ कोड (मैं अपने किसी न किसी तरह जानता हूँ, लेकिन मैं सीख रहा हूँ lol)

#include <stdio.h> 
struct numbers; 
void swap(struct numbers* s); 

int main(void) 
{ 
    struct numbers 
    { 
     int a; 
     int b; 
     int c; 
    }; 
    struct numbers x = {1, 5 , 9}; 
    swap(&x); 
    printf("%i, %i, %i\n", x.a, x.b, x.c); 
    return 0; 
} 

void swap(struct numbers* s) 
{ 
    int temp = s -> a; 
    int temp2 = s -> b; 
    s -> a = s -> c; 
    s -> b = temp; 
    s -> c = temp2; 
} 
+1

"मुख्य अंदर परिभाषित संरचना संख्या" और "किसी भी फ़ंक्शन के बाहर संरचना संख्या" को विभिन्न प्रकार माना जाता है। 'मुख्य' के बाहर परिभाषा को ले जाएं। – immibis

+1

एसओ में आपका स्वागत है। हालांकि सवाल आम तौर पर ठीक है, अगली बार जब आप एक प्रश्न पोस्ट करते हैं तो यह हर किसी के लिए आसान होगा, आप निर्दिष्ट करते हैं कि कौन सी रेखा प्रत्येक त्रुटि को उठाती है। समाधान के रूप में अपनी समस्या को हल करने वाले उत्तरों में से एक को चिह्नित करना न भूलें (यदि कोई है तो)। – SJuan76

+0

जैसा कि पहले कहा गया था, 'संरचना' परिभाषा वैश्विक बनाएं। साथ ही, विभिन्न चीजों से निपटने वाली लाइनों के बीच अतिरिक्त जगह डालें (जैसे कि आपके '# शामिल' के बाद, सी इंडेंटेशन के बारे में परवाह नहीं करता है। आप 'printf' में'% d' का भी उपयोग करना चाह सकते हैं, यह अधिक आम है। – Gophyr

उत्तर

6

समस्या है कि struct numbersघोषणा वैश्विक है, लेकिन परिभाषाmain में स्थानीय है, एम का उपयोग करने के लिए संरचना के एम्बर, swap फ़ंक्शन को पता होना चाहिए कि संरचना के सदस्यों के पास क्या है, और क्योंकि यह परिभाषा को नहीं देख पाती है, यह उसे नहीं जानता है। घोषणा हटाएं और परिभाषा को वैश्विक दायरे में रखें।

8

आप swap() में कोड की उम्मीद कर रहे struct numbers के क्षेत्र तक पहुँचने के लिए सक्षम होने के लिए है, लेकिन उस प्रकार से भरा घोषणा main() अंदर है, इसलिए यह नहीं दिखाई देता है।

घोषणा को तोड़ दें, यह उन सभी के लिए दृश्यमान होना चाहिए जिन्हें इसकी आवश्यकता है। इसे पहले रखना संरचना को पूर्व-घोषित करने की आवश्यकता को भी हटा देगा।

swap() के साथ ही main() से पहले इसे उसी फ़ाइल में प्रोटोटाइप रखने की आवश्यकता को हटा देगा।

यह होना चाहिए:

struct numbers 
{ 
. 
. 
. 
} 

static void swap(struct numbers *s) 
{ 
. 
. 
. 
} 

int main(void) 
{ 
. 
. 
. 
} 
+0

धन्यवाद, इस मुद्दे को ठीक किया गया। – ashissl

+0

यह 'typedef' का उपयोग करने के लायक भी हो सकता है ताकि संरचना के कई उदाहरण बनाए जा सकें:' typedef struct {int a; int बी; int सी; } NUMBERS; 'आपको 'int *' या 'float *' का उपयोग करने के समान ही' स्थिर शून्य स्वैप (NUMBERS * s) लिखने की अनुमति देता है। – GoBusto

+0

निश्चित रूप से, यह सुविधाजनक है, लेकिन मुझे समझ में नहीं आता कि "एकाधिक उदाहरण" से आपका क्या मतलब है। इसका 'टाइपपीफ' से कोई लेना देना नहीं है, और ओपी के कोड में कोई समस्या नहीं है। 'मुख्य()' में पंक्ति को नोट करें जो 'struct संख्या x =' से शुरू होता है, जो एक उदाहरण बना रहा है और इसमें कोई भी संख्या हो सकती है। – unwind

4

समारोह swapstruct numbers की परिभाषा नहीं देख सकता। main के बाहर इसे वैश्विक स्तर पर रखें।

अतिरिक्त टिप - structs के साथ उपयोग typedef, यह आप घोषणा में लचीलापन प्रदान करता है:

typedef struct typeNumbers 
{ 
    int a; 
    int b; 
    int c; 
} numbers; 

ध्यान दें कि typeNumbers वैकल्पिक है। इसे घोषित करें:

numbers x = {1, 2, 3}; 
1

समस्या यह थी कि संरचना मुख्य थी, मैंने कोड को कुछ फिक्स भी किया और टिप्पणी की।

#include <stdio.h> 

//By defining the struct at the beginning you can avoid the forward declaration 
//and it make more sense to know what "numbers" is before continuing reading the code. 
struct numbers { 
    int a; 
    int b; 
    int c; 
}; 

void swap(struct numbers* s) 
{ 
    //Small change to use only one temp variable... 
    int temp2 = s -> b; 
    s -> b = s -> a; 
    s -> a = s -> c; 
    s -> c = temp2; 
} 

int main(void) 
{ 
    struct numbers x = {1, 5 , 9}; 
    swap(&x); 
    printf("%i, %i, %i\n", x.a, x.b, x.c); 
    return 0; 
} 
संबंधित मुद्दे