안녕하십니까 잘생기고 멋진 프갤형들 구조체 포인터에 대해서 질문좀 할게요
일단 다음과 같은 구조체가 있습니다.
struct account{
int num;
char code;
int score;
};
그리고 메인함수 안에서
account acc;
이렇게 선언을 하고
함수의 인자로 이 구조체의 주소값을 넘겼어요
func1(&acc);
그리고 저 func1이라는 함수는
사용자한테 개수를 입력받고,
그 개수만큼 구조체에 내용들을 입력받는거에요 뭐 예를 들어 3을 입력하면
acc[0].num, acc[0].code, .............................acc[2].code, acc[2].score
이렇게 값들이 입력되겠죠?
그 다음에
func2(&acc)를 호출합니다.
이 func2이라는 함수는 저 구조체의 내용을 출력하는 함수입니다.
근데 이 때 이 함수 안에서는 입력이 완료된 구조체 배열(?)이 몇 개인지 몰라요.
그래서 저는 여기서 string을 한 글자씩 출력할 때 char 포인터를 하나씩 움직이면서 출력하다가
널문자를 만나면 출력을 끝내는(물론 string 길이를 구하는 함수가 있는건 알지만 그런것을 사용하지 않구요.)
원리를 동일하게 이용해서
func2(&acc)
{
int i=0;
while(1)
{
if(acc[i]==NULL)
break;
printf("%d %c %d ",acc[i].num,acc[i].code,acc[i].score);
i++;
}
}
이런 식의 접근 방법을 사용했거든요
아 그리고 리눅스 gcc 컴파일러를 이용해서 컴파일했습니다. 그러니까
error: no match for 'operator==' (operand types are 'const account' and 'long int') 이런 식으로 에러메시지가 시작해서
엄청 많이 나오더라구요 ㅠㅠ
음 그래서 정리를 하자면
구조체 변수를 선언할 때 구조체 배열이 아니라 하나만 선언한다음,
함수를 통해 그 구조체 포인터를 전달하고
포인터 접근을 통해서 구조체 변수들의 값을 입력한다.
그리고 다른 함수에도 구조체 포인터를 전달하고
입력된 구조체변수들을 모두 출력해야하는데
이 때 구조체 배열(?)의 크기를 모른다.
그럼 이 출력의 끝을 어떤 조건을 통해 알아낼 수 있는가?
가 제 질문의 요지입니다.
그럼 잘생긴 프갤러 형들의 조언 기다리고 있겠습니다.
c++이여 C여. 컴파일을 C++로 하고있구만..
그리고 함수원형이 어떻게되는데? 포인터로 넘어가지도 않고 레퍼런스가 넘어갔구만.
ㄴ아 makefile은 c++로 컴파일하네요 죄송해요! 근데 제가 지금까지 쓴 내용은 C로도 구현가능한거 맞죠? 아니면 C++컴파일시 문제가 되나요?
메인함수에서 account acc; 이거안된다 struct account acc; 이렇게 해줘야함
함수 원형은 void func1(account *acc)의 형태에요
void func2(account *acc)요
아 func2에는 const가 붙네요 void func2(const account *acc)
(operand types are 'const account' and 'long int') 라고 뜨는거 보니까 포인터로 안넘어갔나본데
func2 코드를 전부 봐야할듯. 저거 그대로 아니지?
탈출조건도 while( acc==NULL ) 이거 이상한데..
음 그러니까 사실 저거랑 완벽하게 같지는 않구요 어떤 부분을 제가 궁금한 부분만 추려서 예시를 든거에요
네 아니 그부분때문에 질문드린거에요
그 탈출조건을 어떻게 해야되느냐
아 저거 acc[i]==NULL이네요 ㅡㅡ 왜케 잘못친게 많지
어떻게하든 NULL로 비교할수가 없음.
아예 방법이 없는건가요? 개수를 모르면?
그냥 for문처럼 몇개인지 확인해서 i < max 처럼 갯수 정해놓고 반복하면됨
애초에 갯수는 카운팅 해야지 알아서. 전역변수를 만들든 static으로 하든 해서 입력이 들어오면 cnt++; 해놓고 i < cnt 까지 반복하면됨
배열크기는 알수있는 방법이 없음. 직접 카운팅을 해야됨
흐... 그렇군요 ㅠㅠ 이게 과제라 제약이 있어서... 구조체 변수를 하나로 선언한 것, 함수의 인자로 구조체 포인터를 넘긴 것, 다른 전역변수나 static 변수를 만들 수 없는 것, 출력하는 함수 내에서는 그 개수를 알지 못하는것..이..ㅠㅠㅠ
알겠습니다 ㅠㅠ 감사합니다!
전역을 안쓴다면 그냥 메인의 지역변수로 카운팅하고, 구조체 포인터랑, 배열크기를 함수인자로 넘기면 되잖아.
아뇨 그게 안돼요 ㅋㅋㅋㅋ 함수의 형태가 이미 다 정해져 있는거라 제가 마음대로 함수인자를 추가할 수 없어요
앞에서 말씀드렸듯이 제가 혼자 뭐 만드는게 아니라 과제여서 ㅠㅠ 제약이 많네요..
교수가 존내 이상하거나, 님이 오해하거나 하고있는듯,;;
순수하게 함수 안에서 모든 걸 해결해야 한다면 목록의 맨 마지막 항목 다음에 더미(쓰레기) 구조체를 포함시켜서 더미 구조체에는 num을 0이나 -1로 준다던가 하는 식으로 구분지어서 할 필요가 있을 듯. 그 방법 밖엔 없다.
글삭된다에 오백원검