'구조나 조합이 아닌 조합원 요청'은 무슨 뜻입니까?
이 에러의 의미에 대해 알기 쉬운 설명이 있습니까?
request for member '*******' in something not a structure or union
C를 배우는 동안 여러 번 접했지만 무슨 뜻인지 감을 못 잡았습니다.
포인터가 있을 때 인스턴스에 액세스하려고 할 때도, 그 반대의 경우도 발생합니다.
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
s 포인터, 즉,*
다음과 같이 typedef로 입력합니다.
typedef struct foo* Foo;
예를 들어 예를 들어 포인터를 다루고 있는 것처럼 보입니다.
Foo a_foo = get_a_brand_new_foo();
a_foo->field = FANTASTIC_VALUE;
위 내용이 작성되어야 할 것처럼 보이는지 주의해 주십시오.a_foo.field
하지만 그 이후로는 실패한다.Foo
는 구조에 대한 포인터입니다.에 대해 강력히 추천합니다. typedef
:ed 포인터를 C로 지정합니다.포인트는 중요합니다.별표를 숨기지 마세요.그들을 빛나게 하라.
이 에러가 발생할 가능성이 있는 모든 케이스를 코드와 코멘트에 기재했습니다.또 다른 사례가 생기면 추가해 주세요.
#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)
구조체의 구성원에 액세스하려고 하지만 구조체가 아닌 다른 구성원에 액세스하려고 합니다.예를 들어 다음과 같습니다.
struct {
int a;
int b;
} foo;
int fum;
fum.d = 5;
다음과 같은 경우에도 발생할 수 있습니다.
예: 스택의 푸시 기능을 고려할 경우:
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]));
이 구조/연합을 정의하는 헤더 파일을 포함시키지 않았음을 의미할 수 있습니다.예를 들어 다음과 같습니다.
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" */
.
.
.
는 다음 경우에도 표시됩니다.
struct foo { int x, int y, int z }foo;
foo.x=12
대신
struct foo { int x; int y; int z; }foo;
foo.x=12
제가 멤버들한테 접근하다가 이걸 봤어요.
제 구조는 이렇습니다.
struct test {
int a;
int b;
};
struct test testvar;
통상, 구조 멤버에 액세스 합니다.
testvar.a;
testvar.b;
제가 testvar를 포인터로 착각해서 이렇게 했어요.
testvar->a;
그때 이 오류를 발견했어요.
구조나 조합이 아닌 무언가의 멤버 'a'에 대한 요구
언급URL : https://stackoverflow.com/questions/2184419/what-does-request-for-member-in-something-not-a-structure-or-union-m
'IT이야기' 카테고리의 다른 글
사물의 깊은 복사는 어떻게 합니까? (0) | 2022.06.02 |
---|---|
Java JIT는 JDK 코드를 실행할 때 부정행위를 합니까? (0) | 2022.06.02 |
JPA hashCode() / equals() 딜레마 (0) | 2022.06.02 |
라우터 링크로 vue-multicelect를 채우다 (0) | 2022.06.02 |
Vue에서 향후 소품 데이터 또는 소품 디폴트 전달 방법에 따라 결정 (0) | 2022.06.02 |