C언어 중 구조체 포인터가 불완전하다는 오류가 뜹니다.
#include <stdio.h>
struct item {
char name[20];
int price;
};//구조체 선언
int equal(struct item A, struct itme B);//함수 선언
int main() {
struct item a = { "노트북",20000 };//구조체 변수 선언
struct item b = { "스마트폰",10000 };//구조체 변수 선언
printf("* 구조체 포인터를 함수의 인수로 전달하는 프로그램\n");
if (equal(&a, &b) == 1)
printf("\"%s\"과 \"%s\"은 같은 품목입니다",a.name,b.name);
else if(equal(&a,&b)==0)
printf("\"%s\"과 \"%s\"은 다른 품목입니다", a.name, b.name);//if문을 통해 프린트
return 0;
}
int equal(struct item A, struct itme B)
{
if (strcmp(A->name,B->name) == 0)
return 1;
else
return 0;
}
밑줄 친 부분에서 "불완전한 클래스 형식에 대한 포인터는 사용할 수 없습니다."라고 뜨고 또한 "'name'의 왼쪽은 정의되지 않은 구조체/공용 구조체 'item'을(를) 지정합니다." 뜹니다. 정의를 한 것같은데 무슨 문제인지 잘 모르겠습니다
안녕하세요~ 해당 코드를 보니 두 구조체 이름이 같은지에 대한 코드로 보이는데요.
구조체 포인터를 매개변수로 넘기려고 하시려면 equal 함수에 변수를 구조체 포인터로 넘기셔야 합니다.
int equal(struct item A, struct itme B) -> int equal(struct item *A, struct item *B)으로 변경 // item 오타도 수정해야 합니다^^
다른 방법으로는 함수 내에서 값을 변경하는 코드가 없는걸로 보여서 구조체 포인터가 아닌 구조체로 넘기시는 방법도 가능합니다^^
if (equal(&a, &b) == 1) -> (a,b)로 변경
if (strcmp(A->name,B->name) == 0) -> A.name, B.name으로 변경
int equal(struct item A, struct itme B)을
int equal(struct item* A, struct item* B)으로 고쳐보세요. 그리고 현재 코드에 item이 아닌 itme으로 오타가 있습니다.
변수를 포인터가 아니라 그대로 했기 때문에 stack에 복사가 됩니다.
즉 현재 equal에 있는 구조체는 포인터가 아니기 때문에 -> 를 쓰시면 안됩니다.
비쥬얼 스튜디오를 보시면 .을 찍어야 name이 나옵니다.
변수를 포인터로 넘겨 받게 하면 -> 연산자를 쓰실 수 있고
비쥬얼 스튜디오에서도 ->로 했을 때 구조체 변수가 나오는 것을 확인할 수 있습니다.
안녕하세요.
int equal(struct item A, struct itme B)에서 오타가 있습니다.
struct itme B => struct item B
이렇게 바꾸고 나서 실행해 보시기 바랍니다.
그리고 위 코드는 심각한 위험요소를 내포하고 있습니다.
아래 code와 비교해 보시기 바랍니다.
#define NAME_LEN 20
struct item {
char name[NAME_LEN];
int price;
};//구조체 선언
int equal(struct item A, struct item B)
{
if (strncmp(A->name,B->name,NAME_LEN) == 0)
return 1;
else
return 0;
}
안녕하세요.
"불완전한 클래스 형식에 대한 포인터는 사용할 수 없습니다." 에러에 대한 질문을 주셨는데요~
해당 에러는 주로 클래스나 구조체 심볼(이름)의 정의 를 현재 파일 내에서 찾을수 없어서 발생합니다.
질문주신 코드를 살펴보니,
equal 함수 파라미터에 오타가 있습니다.
struct itme B 를
itme -> item 으로 고쳐주시면 될것 같습니다~