Pelles C 컴파일러 특성 문제(구조체)
찬솔나라
질문 제목 : pelles c 컴파일러 특성 문제(구조체)문법 문제일 경우 지적 부탁드립니다.질문 내용 :
// 24. 23에서 학생 hong과 kim의 정보를 heap에 넣고 국어점수를 합산하는
// 다음과 같은 함수들을 작성하고 정상적인 결과가 나오도록 프로그램을
// 수정하시오. 또한 두 함수의 장단점을 찾아내시오.
//
// int badd_kor(student a, student b);
// int add_kor(student *a, student *b);
#include stdio.h
#include stdlib.h
#include string.h
typedef struct{
char id[4];
char name[5];
int kor;
int eng;
int math;
}student;
int badd_kor(student a, student b);
int add_kor(student *a, student *b);
int main(void)
{
student ba;
student bb;
student *a;
student *b;
int kor_sum;
a=(student*)malloc(sizeof(student));
b=(student*)malloc(sizeof(student));
strcpy(ba.id,001);
strcpy(ba.name,kim);
ba.kor=90;
ba.eng=80;
ba.math=70;
strcpy(bb.id,002);
strcpy(bb.name,hong);
bb.kor=60;
bb.eng=70;
bb.math=90;
strcpy(a-id,001);
strcpy(a-name,kim);
a-kor=90;
a-eng=80;
a-math=70;
strcpy(b-id,002);
strcpy(b-name,hong);
b-kor=60;
b-eng=70;
b-math=90;
kor_sum=badd_kor(ba,bb);
printf(%d\n, kor_sum);
kor_sum=add_kor(a,b);
printf(%d\n, kor_sum);
return 0;
}
int badd_kor(student a, student b)
{
return a.kor+b.kor;
}
int add_kor(student *a, student *b)
{
return a-kor+b-kor;
}
안녕하세요.
일단 상단은 소스코드입니다.
badd_kor()함수는매개변수에 구조체 통째로받아 국어점수의 합을 구하는 것이고, add_kor()함수는 구조체의 포인터에 동적메모리 할당 후 그 포인터에 대한 매개변수를 받아서 국어점수의 합을 구하는 것입니다. 효율성을 보자면 add_kor()함수를 사용해야하지만, 그렇다고 해서 앞의 함수가 올바르게 작동을 안 해서는 안 될 거 같은데요.
main() 함수 내에서는 둘 다 올바르게 처리가 되었지만, badd_kor() 함수로 넘어갈 때 필요한 매개변수를 취할 때 그에 따른 문제가 발생합니다.
visual c++, dev-cpp에서는 두 값이 150으로 올바르게 출력되는데요. 유독 pelles c에서는 badd_kor() 함수에 대한 결과만 쓰레기값이 나옵니다. 왜 그럴까요? 혹시나 문법 상 문제가 없는 거라면 pelles c 제작사에게 오피니언 건의할 계획입니다.
c99 문법때문에 위의 코드가 에러 날 것 같지는 않을텐데 말입니다.
gcc도 테스트 해보는 걸 깜빡 잊었네요. 해 보고 다시 수정하겠습니다.
= 결과: gcc 4.4.5에서는 정상적으로 출력됩니다. pelles c는 6.50 rc 3입니다.
-
피라
어찌보면 컴파일러가 프로그래머를 조련하는 셈이네요. 효율적으로 짜게 만들게끔 암묵적으로 압박을 주는 모양입니다. 암튼, 이번이 과제라 평소에는 구조체 전체를 매개변수로 전달하지는 않을 거지만, 좋은 경험 했네요^^
-
미투리
방금 디버거로 살짝 디벼보니까....
속도최적화에선 bb, ba를 아예 생성하지 않는듯 싶습니다. 아예 사용하지 않는다고 가정하고 쌩까는듯 싶네요.. -
든솔
수다님, 진짜 고맙습니다. 최적화 옵션 때문에 이런 문제가 생긴 거였네요^^ pelles c에서 정상적으로 작동합니다.
-
지니
방금 테스트해본 결과 제 예상이 맞네요, 이 개발환경에 포함된 컴파일러가 상당히 오래된 컴파일러를 기반으로 했거나, 그런 물건을 기반으로 포크된 컴파일러를 사용하는 개발환경인듯 싶네요.(아니면 단순히 개발자들의 실수거나...c99를 지원하는데도 이런거면 실수같은데...)
구조체끼리의 복사에서 문자열을 복사하는데에 문제가 있습니다.
기본 최적화가 속도 최적인데, 이게 간간히 문제를 불러올수 있으니 최적화 정도를 최저로 맞춰보세요.
최저에선 또 잘 되는군요 -
MinA
수다님, 답변 고맙습니다. pelles c 컴파일러는 lcc 컴파일러를 기반으로 합니다. 혹시 이에 대해 아시는 게 있으신지요? 일단 lcc라는 거부터 다운로드 받아서 컴파일 해봐야할 거 같습니다. 게다가 pelles c라는 게 현존하는 유일한 windows용 c99 무료 컴파일러라는 것 때문에, 그리고 컴파일러 중에 인터페이스가 편하고 가벼운 편이라 제가 좀 많이 사용하는 편입니다.
-
봄여울
해당 컴파일러가 어떤 컴파일러를 기반삼고 있는지는 잘 모르겟지만, 아주 아주 오래전 c표준이 존제하기 이전의 c의 문법엔 익명구조체도, 구조체의 복사도 허용하지 않는 문법규칙이 있었습니다.
사용하시는 컴파일러가 그런 아주 오래된 컴파일러를 기반삼아 현대화한 물건이라면 가져오신 코드는 당연히 위법적인 문법사항을 포함하고 있거나 구조체의 비트를 거슬러 읽을때 충분히 문제를 일으킬수 있는 사항을 포함하고 있습니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |
2691592 | 동적할당 이용 배열선언 질문입니다.ㅠㅠ (3) | 허리달 | 2025-04-15 |
2691542 | /=의 용도를 알려주세요 ㅠㅠ! (2) | 아라 | 2025-04-14 |