2010-02-02 13 views
59

क्या इस त्रुटि का अर्थ है के लिए कोई आसान व्याख्या है?किसी चीज में "सदस्य के लिए अनुरोध '*******' क्या कोई संरचना या संघ नहीं है" मतलब है?

request for member '*******' in something not a structure or union 

मैं इसे समय है कि मैं सी सीखने किया गया है में कई बार सामना किया है, लेकिन मैं इसका क्या मतलब है के रूप में एक सुराग नहीं मिला है।

+0

बेहतर उत्तर शीर्ष पर स्वीकार किया जाना चाहिए। –

उत्तर

95

यह भी आप आप एक सूचक है जब एक उदाहरण का उपयोग करने की कोशिश कर रहे हैं होता है, और इसके विपरीत:

struct foo 
{ 
    int x, y, z; 
}; 

struct foo a, *b = &a; 

b.x = 12; /* This will generate the error, should be b->x or (*b).x */ 

के रूप में एक टिप्पणी में कहा, इस कोई चला जाता है और typedef अगर कष्टदायी बनाया जा सकता है सा सूचक, यानी एक typedef में * भी शामिल है, की तरह तो:

typedef struct foo* Foo; 

क्योंकि तो आप लग रहा है कोड है कि यह की तरह, उदाहरणों के साथ काम कर रहा है जबकि वास्तव में इस बिंदु के साथ काम कर रहा है मिल ईआरएस:

Foo a_foo = get_a_brand_new_foo(); 
a_foo->field = FANTASTIC_VALUE; 

नोट कैसे के रूप में यदि ऊपर दिखता है यह a_foo.field लिखा जाना चाहिए, लेकिन वह विफल हो जाएगा के बाद से Foo struct के लिए सूचक है। मैं दृढ़ता से typedef के खिलाफ अनुशंसा करता हूं: सी पॉइंटर्स में एड पॉइंटर्स महत्वपूर्ण हैं, अपने तारों को छिपाएं। उन्हें चमकने दो।

+8

मैं शर्त लगाऊंगा कि यह वास्तविक समस्या है। यह अभी भी मुझे अवसर पर काटता है, * विशेष रूप से * अगर किसी ने पॉइंटर प्रकार टाइप किया है। –

+1

मैं बस यह जोड़ूंगा कि यह त्रुटि तब दिखाई देगी जब कोई सरणी आवंटित नहीं की गई है (malloc) और इसका उपयोग किया जाता है। – max

16

आप किसी संरचना के सदस्य तक पहुंचने का प्रयास कर रहे हैं, लेकिन ऐसी किसी चीज में जो संरचना नहीं है। उदाहरण के लिए:

struct foo { int x, int y, int z }foo; 

foo.x=12 

बजाय

struct foo { int x; int y; int z; }foo; 

foo.x=12 
0

भी यदि दिखाई दे सकता है। अगर हम एक स्टैक के पुश फ़ंक्शन पर विचार करते हैं:

typedef struct stack 
{ 
    int a[20]; 
    int head; 
}stack; 

void push(stack **s) 
{ 
    int data; 
    printf("Enter data:"); 
    scanf("%d",&(*s->a[++*s->head])); /* this is where the error is*/ 
} 

main() 
{ 
    stack *s; 
    s=(stack *)calloc(1,sizeof(stack)); 
    s->head=-1; 
    push(&s); 
    return 0; 
} 

त्रुटि पुश फ़ंक्शन और टिप्पणी पंक्ति में है। सूचक s कोष्ठक के भीतर शामिल किया जाना है। सही कोड:

scanf("%d",&((*s)->a[++(*s)->head])); 
+0

इन दो बयानों के बीच कोई अंतर नहीं है? –

+0

@NickPredey मुझे 3 मतभेद दिखाई देते हैं ... –

+1

@AlaaM। महीनों बाद इसे वापस देखकर, मैंने सेमीकॉलन को याद किया! –

4

यह भी निम्नलिखित मामले में हो सकता है:

जैसे

struct { 
    int a; 
    int b; 
} foo; 
int fum; 
fum.d = 5; 
+2

पॉइंटर पॉइंट (भाषा पर कोई भयानक खेल) स्पष्ट करने के लिए धन्यवाद। अन्य उत्तरों ने इसका उल्लेख किया (उदाहरण के लिए "अपने पॉइंटर्स चमकते हैं") लेकिन जीडीबी और वालग्रिंड के साथ महाकाव्य युद्ध में 2 बजे संघर्ष करने पर, मेरे जैसे लोग इस बात की सराहना करते हैं कि आपका जवाब स्पष्ट रूप से दिखाता है कि पॉइंटर कैसे एक मुद्दा हो सकता है और यह समस्या कैसे सुधार की जा सकती है । –

1

इसका मतलब यह हो सकता है कि आप एक हेडर फ़ाइल शामिल करना भूल गए जो इस संरचना/संघ को परिभाषित करता है। उदाहरण के लिए:

foo.h फ़ाइल:

typedef union 
{ 
    struct 
    { 
     uint8_t FIFO_BYTES_AVAILABLE : 4; 
     uint8_t STATE     : 3; 
     uint8_t CHIP_RDY    : 1; 
    }; 
    uint8_t status; 
} RF_CHIP_STATUS_t; 

RF_CHIP_STATUS_t getStatus(); 

main.c फ़ाइल:

. 
. 
. 
if (getStatus().CHIP_RDY) /* This will generate the error, you must add the #include "foo.h" */ 
. 
. 
. 
1

मैं संभवतः सभी मामलों में जहां इस त्रुटि अपनी टिप्पणी नीचे दिए गए कोड में होते हैं और हो सकता है प्रगणित है। यदि आप अधिक मामलों में आते हैं, तो कृपया इसे जोड़ें।

#include<stdio.h> 
#include<malloc.h> 

typedef struct AStruct TypedefedStruct; 

struct AStruct 
{ 
    int member; 
}; 

void main() 
{ 
    /* Case 1 
     ============================================================================ 
     Use (->) operator to access structure member with structure pointer, instead 
     of dot (.) operator. 
    */ 
    struct AStruct *aStructObjPtr = (struct AStruct *)malloc(sizeof(struct AStruct)); 
    //aStructObjPtr.member = 1;  //Error: request for member ‘member’ in something not 
             //a structure or union. 
             //It should be as below. 
    aStructObjPtr->member = 1; 
    printf("%d",aStructObjPtr->member); //1 


    /* Case 2 
     ============================================================================ 
     We can use dot (.) operator with struct variable to access its members, but 
     not with with struct pointer. But we have to ensure we dont forget to wrap 
     pointer variable inside brackets. 
    */ 
    //*aStructObjPtr.member = 2;  //Error, should be as below. 
    (*aStructObjPtr).member = 2; 
    printf("%d",(*aStructObjPtr).member); //2 


    /* Case 3 
     ============================================================================= 
     Use (->) operator to access structure member with typedefed structure pointer, 
     instead of dot (.) operator. 
    */ 
    TypedefedStruct *typedefStructObjPtr = (TypedefedStruct *)malloc(sizeof(TypedefedStruct)); 
    //typedefStructObjPtr.member=3; //Error, should be as below. 
    typedefStructObjPtr->member=3; 
    printf("%d",typedefStructObjPtr->member); //3 


    /* Case 4 
     ============================================================================ 
     We can use dot (.) operator with struct variable to access its members, but 
     not with with struct pointer. But we have to ensure we dont forget to wrap 
     pointer variable inside brackets. 
    */ 
    //*typedefStructObjPtr.member = 4; //Error, should be as below.  
    (*typedefStructObjPtr).member=4; 
    printf("%d",(*typedefStructObjPtr).member); //4 


    /* Case 5 
     ============================================================================ 
     We have to be extra carefull when dealing with pointer to pointers to 
     ensure that we follow all above rules. 
     We need to be double carefull while putting brackets around pointers. 
    */ 

    //5.1. Access via struct_ptrptr and -> 
    struct AStruct **aStructObjPtrPtr = &aStructObjPtr; 
    //*aStructObjPtrPtr->member = 5; //Error, should be as below. 
    (*aStructObjPtrPtr)->member = 5; 
    printf("%d",(*aStructObjPtrPtr)->member); //5 

    //5.2. Access via struct_ptrptr and . 
    //**aStructObjPtrPtr.member = 6; //Error, should be as below. 
    (**aStructObjPtrPtr).member = 6; 
    printf("%d",(**aStructObjPtrPtr).member); //6 

    //5.3. Access via typedefed_strct_ptrptr and -> 
    TypedefedStruct **typedefStructObjPtrPtr = &typedefStructObjPtr; 
    //*typedefStructObjPtrPtr->member = 7; //Error, should be as below. 
    (*typedefStructObjPtrPtr)->member = 7; 
    printf("%d",(*typedefStructObjPtrPtr)->member); //7 

    //5.4. Access via typedefed_strct_ptrptr and . 
    //**typedefStructObjPtrPtr->member = 8; //Error, should be as below. 
    (**typedefStructObjPtrPtr).member = 8; 
    printf("%d",(**typedefStructObjPtrPtr).member); //8 

    //5.5. All cases 5.1 to 5.4 will fail if you include incorrect number of * 
    //  Below are examples of such usage of incorrect number *, correspnding 
    //  to int values assigned to them 

    //(aStructObjPtrPtr)->member = 5; //Error 
    //(*aStructObjPtrPtr).member = 6; //Error 
    //(typedefStructObjPtrPtr)->member = 7; //Error 
    //(*typedefStructObjPtrPtr).member = 8; //Error 
} 

निहित विचारों सीधे हैं:

  • संरचना चर के साथ प्रयोग करें .। (मामले 2 और 4)
  • संरचना के सूचक के साथ -> का उपयोग करें। (मामले 1 और 3)
  • आप संरचना चर या सूचक सूचक का पालन करते हुए चर संरचना करने पहुंच जाते हैं तो फिर ब्रैकेट अंदर सूचक लपेट: (*ptr). और (*ptr)-> बनाम *ptr. और *ptr-> (मामले 1 को छोड़कर सभी मामले)
  • आप कर रहे हैं निम्नलिखित पॉइंटर्स तक पहुंचने के लिए, सुनिश्चित करें कि आप जो भी वांछित हैं, संरचना या संरचना के लिए सही ढंग से पॉइंटर पहुंचे हैं। (केस 5, विशेष रूप से 5.5)
संबंधित मुद्दे