आगे की सरणी के लिए एक सूचक सी में संरचनाओं घोषित

वोट
1

मैं सी में आगे घोषणाओं समस्या कोड है के बारे में एक सवाल है

typedef struct yhash_s t_yhash;                          // forward declaration
struct yhash_s {
               size_t  size_h; 
               t_yhash (*yhash)[]                        // pointer to array of structures
               };

एक बार कोड जीसीसी के साथ संकलित किया गया है, यह शिकायत:

त्रुटि: सरणी प्रकार अधूरा तत्व प्रकार 't_yhash' है {उर्फ 'struct yhash_s'}

मुझे लगता है कि t_yhash (अभी तक) पता नहीं है और सरणी के आकार नहीं की जा सकती समझते हैं, लेकिन मैं सूचक के बारे में अज्ञात अभी तक आकार की एक सरणी है, जो पूरी तरह से समाधान योग्य IMHO होना चाहिए करने के लिए पूछ रहा हूँ।

मुझे लगता है कि आगे घोषणा कैसे तय और खुद struct करते हैं?

13/01/2020 को 23:59
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
4

दिक्कत यह है कि सरणी declarators तत्व प्रकार (सी 11 6.7.6.2/1) के रूप में एक अधूरी प्रकार नहीं हो सकता है। और t_yash(यानी struct yhash_s) struct परिभाषा के समापन ब्रेस तक पूरा नहीं हुआ है।

इस नियम ने भी सामान्य ज्ञान का एक और टुकड़ा के लिए जिम्मेदार है; यह करने के लिए (से पहले struct परिभाषा पूरा हो गया है) कानूनी है:

void func( t_yhash *a );

लेकिन करने के लिए कानूनी नहीं:

void func( t_yhash a[] );

भले ही समायोजन नियम ठीक नहीं तो अधूरा तत्व प्रकार शासन के लिए काम करेगा।

शायद भाषा डिजाइन इस नियम को परिष्कृत समारोह प्रोटोटाइप की तरह कुछ मामलों अनुमति देने के लिए द्वारा थोड़ा सुधार किया जा सकता है, लेकिन यह स्पष्ट रूप से कुछ है कि भाषा डिजाइन समिति के साथ पैदा हुई नहीं थी।

लेकिन फिर भी इस नियम के बिना, आपके उपयोग के मामले में एक और समस्या हो सकती है; सूचक का आकार ज्ञात नहीं हो सकता है। यह "struct Y की सरणी के लिए सूचक" से एक अलग आकार के लिए कानूनी होगा (हालांकि व्यवहार में संभावना नहीं) "struct एक्स की सरणी के लिए सूचक" के लिए। वहाँ एक नियम है कि सभी संकेत struct करने के लिए एक ही आकार होना आवश्यक है, लेकिन सरणी की ओर इशारा करने के लिए इस तरह का कोई नियम नहीं है।

14/01/2020 को 00:24
का स्रोत उपयोगकर्ता

वोट
0

अपनी पोस्ट के इस भाग के जवाब में:

मुझे लगता है कि आगे घोषणा कैसे तय और खुद struct करते हैं?

आप उपयोग कर सकते हैं void *अपने सरणी छिपाया जा, और फिर इसे वापस कन्वर्ट बाद में।

typedef struct yhash_s t_yhash;
struct yhash_s {
               size_t  size_h;
               void *yhash;
               };

static inline t_yhash (*yhash(t_yhash y))[] {
    return y.yhash;
}

यदि समारोह वाक्य रचना भी कुंठित है:

typedef t_yhash t_yhash_array[];

static inline t_yhash_array *yhash(t_yhash y) {
    return y.yhash;
}

उदाहरण के लिए:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
14/01/2020 को 01:38
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more