सी

2016-11-08 4 views
6

में पॉइंटर्स की सरणी को पॉइंटर घोषित करने के लिए पॉइंटर्स और सी के लिए नया और मेरे प्रोग्राम के लिए structs की सरणी के लिए एक सूचक की आवश्यकता है और इस पॉइंटर को फ़ंक्शन में पास करने में सक्षम हो।सी

संरचना सरणी प्रकार के सूचक को घोषित करने का सही तरीका क्या है और मेरा फ़ंक्शन पैरामीटर क्या होना चाहिए जो इस सूचक को ले सकता है?

यह मेरा प्रयास है:

#define HAND_SIZE 5 

struct Card { 
    char suit; 
    char face; 
}; 

void printHandResults(struct Card *hand[HAND_SIZE]); 

int main(void) 
{ 
    struct Card hand[HAND_SIZE]; 
    struct Card (*handPtr)[HAND_SIZE]; //Correct way to declare? 
    handPtr = &hand; 
    ... 
    printHandResults(handPtr); 

} 
void printHandResults(struct Card *hand[HAND_SIZE]) { 
... 
} 

और यह चेतावनी मैं मिलता है:

warning: incompatible pointer types passing 'struct Card (*)[5]' to parameter of type 'struct Card **' [-Wincompatible-pointer-types] 

मुझे समझ में संकेत दिए गए विभिन्न प्रकार हैं, लेकिन मैं नहीं कर सकते यह पता लगाने की इसे सही ढंग से स्थापित करने के लिए कैसे लग रहे हैं ।

अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं सराहना करूंगा।

void printHandResults(struct Card (*hand)[]); 

और इस:

+0

Arrays स्वचालित रूप से पॉइंटर्स बन जाते हैं जब वे किसी फ़ंक्शन पर जाते हैं, तो आपको इसके लिए एक अलग चर की आवश्यकता नहीं होती है। – Barmar

+1

'स्ट्रक्चर कार्ड * हाथ [HAND_SIZE] 'पॉइंटर्स की एक सरणी है, एक सरणी के लिए सूचक नहीं है। – Barmar

+0

आपके रास्ते में हैंडपीआरआर पॉइंटर की सरणी है। क्यों आप प्रिंट करने के लिए पास नहीं करेंगे और हैंडसेट्स? –

उत्तर

5

हो सकता है कि क्या आप चाहते हैं यह करने के लिए है

void printHandResults(struct Card (*hand)[]) { 

} 

आप मुख्य में struct चर की एक सरणी के लिए सूचक गुजर रहा था क्या कर रहे थे, लेकिन, फ़ंक्शन को संरचना चर के लिए पॉइंटर्स की एक सरणी और संरचना चर के एक सरणी के लिए सूचक नहीं प्राप्त करने के लिए सेट किया गया था! अब टाइप मिस्चैच नहीं होगा और इस प्रकार, कोई चेतावनी नहीं होगी।

कि

नोट [], (वर्ग) कोष्ठक, (एकल) अपसंदर्भन ऑपरेटर * की तुलना में अधिक पूर्वता है तो हम कोष्ठकों () सरणी नाम और * ऑपरेटर enclosing का एक सेट की जरूरत है सुनिश्चित करने के लिए हम क्या यहाँ के बारे में बात कर रहे हैं होता!

+0

धन्यवाद। मैं अपने कार्यक्रम में इसका प्रयोग करूंगा। – user2300867

+0

@Angew: आप इसे ऑनलाइन आईडीई पर सी ++ में कर रहे हैं। सवाल सी – skrtbhtngr

+0

@skrtbhtngr में समान कार्यक्षमता के बारे में है क्षमा करें, मुझे 'g ++' में 'gcc' को बदलने का एहसास नहीं था जब फ़ाइल '.cpp' में समाप्त होती है। – Angew

4

एक सरणी पहले सरणी तत्व में कच्चे सूचक में गिरावट आई है। वैकल्पिक रूप से

#define HAND_SIZE 5 

struct Card { 
    char suit; 
    char face; 
}; 

void printHandResults(struct Card *hand, int numInHand); 

int main(void) 
{ 
    struct Card hand[HAND_SIZE]; 
    ... 
    printHandResults(hand, HAND_SIZE); 
} 

void printHandResults(struct Card *hand, int numInHand) 
{ 
    for (int i = 0; i < numInHand; ++i) 
    { 
     // print hand[i].suit and hand[i].face as needed... 
    } 
} 

, कार्ड सरणी के लिए एक नया typedef बनाते हैं और फिर आप चर और उस प्रकार के संकेत दिए गए बना सकते हैं:: तो आप अधिक इस के बजाय की तरह कुछ कर सकते हैं:

#define HAND_SIZE 5 

struct Card { 
    char suit; 
    char face; 
}; 

void printHandResults(struct Card *hand); 

int main(void) 
{ 
    struct Card hand[HAND_SIZE]; 
    ... 
    printHandResults(hand); 
} 

void printHandResults(struct Card *hand) 
{ 
    for (int i = 0; i < HAND_SIZE; ++i) 
    { 
     // print hand[i].suit and hand[i].face as needed... 
    } 
} 

वैकल्पिक रूप से

#define HAND_SIZE 5 

struct Card { 
    char suit; 
    char face; 
}; 

typedef struct Card Hand[HAND_SIZE]; 

void printHandResults(Hand *hand); 

int main(void) 
{ 
    Hand hand; 
    ... 
    printHandResults(&hand); 
} 

void printHandResults(Hand *hand) 
{ 
    for (int i = 0; i < HAND_SIZE; ++i) 
    { 
     // print hand[i].suit and hand[i].face as needed... 
    } 
} 
+0

धन्यवाद यह समझ में आता है। दूसरा अंतर पैरामीटर क्यों? – user2300867

+0

दूसरा पैरामीटर कॉल किए गए फ़ंक्शन में वास्तविक सरणी के आकार को जानना है। – skrtbhtngr

+0

मैं देखता हूं। लेकिन दिया गया है कि मेरे पास पहले से ही एक स्थिर HAND_SIZE के रूप में है और इसे फ़ंक्शन बॉडी से उपयोग कर सकता है क्या मुझे अभी भी फ़ंक्शन में पैरामीटर के रूप में इसकी आवश्यकता है? कृपया समझाएँ। – user2300867

0

अधिक आसान तरीका:

#define HAND_SIZE 5 

typedef struct Cards{ 
    char suit; 
    char face; 
}card_t; 

void printHandResults(card_t*); 

int main(void) 
{ 
    card_t hand[HAND_SIZE]; 
    card_t* p_hand = hand; 
... 
    printHandResults(p_hand); 

} 
void printHandResults(card_t *hand) 
{ 
// Here you must play with pointer's arithmetic 
... 
}