C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[645] 빌더6. 바이트 정렬 관련 버그.
김태선 [cppbuilder] 7024 읽음    2007-05-16 15:23
이것은 팁이 아닌데, 어디 적당히 리포트할 곳이 없어서 여기에 씁니다.

보통 통신 쪽 작업을 하게 되면 프로토콜을 1바이트 정렬을 사용하는 경우가 많습니다.
그러면 당연히 해당 구조체나 클래스는 1바이트 정렬로 만듭니다.
#pragma pack(1)
이렇게 하면 1바이트 메모리 경계 정렬이 되죠.

그리고 원상 복구는
#pragma pack()
이는 디폴트 값으로 돌리는데 보통 4바이트 정렬이 기본값입니다.

그런데, 이렇게 만들어진 구조체나 클래스는
다른 클래스내에 멤버로 선언한 경우,
당연히 아무런 문제가 없어야 합니다.
다른 클래스가 메모리 경계 정렬이 어떻게 되어 있던 상관없이 아무 이상없어야 합니다.

하지만 빌더6에서는
1바이트 정렬로 만든 구조체를
다른 클래스의 멤버로 몇개 넣었는데
두 구조체간의 데이타를 복사하기 위해
class_a->struct_instance1 = class_a->struct_instance2;
식으로 처리하니
2바이트가 밀려서 값이 들어가는 것이 이상해서 추적해보니
컴파일러 버그 더군요.

그래서 해당 클래스도 1바이트 정렬로 맞추니 괜잖아 지더군요.

이 현상은
빌더 6외에 다른 버전은 확인을 못했습니다.

참고하세요.
장성호 [nasilso]   2007-05-16 18:16 X
예전에 이거 몰라서 한참 해멨었죠

c로된 장비의 펌웨어와  BCB의 코드에   구조체를 선언한 같은 Header 파일을 쓰는데

그런데 이상하게 동작하더라구요

8bit cpu 로 돌아가는 장비에서는 아무 신경쓰지 않아도 되지만

32bit cpu를 쓰는 pc에서는 신경써서 정렬을 해줘야는데....

+ -

관련 글 리스트
645 빌더6. 바이트 정렬 관련 버그. 김태선 7024 2007/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.