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의 문법엔 익명구조체도, 구조체의 복사도 허용하지 않는 문법규칙이 있었습니다.
사용하시는 컴파일러가 그런 아주 오래된 컴파일러를 기반삼아 현대화한 물건이라면 가져오신 코드는 당연히 위법적인 문법사항을 포함하고 있거나 구조체의 비트를 거슬러 읽을때 충분히 문제를 일으킬수 있는 사항을 포함하고 있습니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |