Q&A

  • record 와 packed record 의 차이점이 뭔가요. ^^;;
안녕 하세요. 즐코하고자 하는 초보좀 도와 주세요... ^^

type 선언에서 record 와 packed record 로 선언하는데...
그에 대한 차이점을 가르켜 주세요.
1  COMMENTS
  • Profile
    고지범 2002.09.25 06:13
    메모리를 접근할 때, Alignment라는 것이 있습다.
    packed keyword는 Alignment를 무시할껀지 적용할 껀지를 결정합니다.
    가령 윈도우 같은 경우는 4바이트 얼라인먼트를 사용합니다.
    무슨 소린가 하믄... 만일 아래와 같이 선언한다면...
    type
       RTest = record
                      byFirst :Byte;
                      nSecond :SmallInt;
                      nThird :Integer;
                   end;
    SizeOf(RTest) = SizeOf(Byte) + SizeOf(SmallInt) + SizeOf(Integer) 겠죠?
             7                  1                    2                         4
    그런데, 메모리에 할당되는 것은 총 12바이트가 됩니다.
    무신 소린가 하믄, 처음 byFirst에서 사용되는 것은 1바이트 지만 얼라인먼트가
    적용되므로 4바이트, 두번째 nSecond도 2바이트지만 4바이트 이렇게
    적용된다는 거죠.
    packed가 적용되면 정확히 7바이트만 할당되죠... 얼라인먼트를 무시하니깐..
    좀더 정확히 말하자믄 8바이트가 할당됩니다. 7에 가장 가까운 4의 배수가
    8이니깐요...
    이기종간의 통신에서 서로의 얼라인먼트가 다를 경우 쓰레기 데이터를 받을
    수도 있기 때문에 packed를 사용해야 합니다.
    (예전에 어떤 시스템은 packed가 안된다고 하던데 까먹었군요...ㆀ)
    C++ 과 비교해서 야그하면 #pragma의 packlength와 비슷합니다.

    예제.
    type
       RTest = record
                      byFirst :Byte;
                      nSecond :SmallInt;
                      nThird :Integer;
                   end;

       RTest2 = packed record
                      byFirst :Byte;
                      nSecond :SmallInt;
                      nThird :Integer;
                   end;
    var
       arTest :array [0..1] of RTest;
       arTest2 :array [0..1] of RTest2;
    begin
       ShowMessage('packed가 없을 때 메모리 차이 ' +
                              IntToStr( Integer(@arTest[1]) - Integer(@arTest[0])) );
       ShowMessage('packed가 있을 때 메모리 차이 ' +
                              IntToStr( Integer(@arTest2[1]) - Integer(@arTest2[0])) );
    end;
    헉헉헉.. 즐입다.

    • 전형식
      2002.09.24 22:34
      받는쪽이 서버라고요? 그럼 여러 써버한테 보낸달 말씀입니까? (개그 패러디 임다) ^^; 받는쪽이 다중서...
    • 최병철
      2002.09.25 01:37
      델파이5에서는 아래와 같은 순서로 하였읍니다 먼저 델파이 메뉴바에서 - Componet 메뉴를 선택하면 하...
    • 최용일
      2002.09.25 00:23
      안녕하세요. 최용일입니다. 데이터 받는것을 쓰레드에서 돌려보세요... 잘 될거 같은데... ^^ 항상 ...
    • 초짜
    • 2002.09.24 21:03
    • 3 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2002.09.24 21:16
      procedure TForm1.Button1Click(Sender: TObject); var   buffer : String; begin  &nb...
    • 초짜
      2002.09.24 21:35
      정말 감사합니다.. 많은도움이 됬습니다. 한가지 더 질문을 해도 될가여? 한글을 쓸대 공백을 줄...
    • KDDG_ZZOM
      2002.09.24 22:27
      format이라는 함수를 이용해보시고요... 아니면 생노가다 함수하나 만들어 사용해도 될것같네요...^^ ...
    • 나옹이
    • 2002.09.24 20:55
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.09.25 01:21
      안녕하세요. 최용일입니다. Range나 Selection객체의 InsertBreak메소드를 이용하세요... uses &nbs...
    • 나옹이
      2002.09.25 01:48
      흠냐...이런게 있었네요.....ㅡㅜ 정말 감사합니다.... 근데.... 이런 걸 찾으려면 어디서 찾아야 하...
    • 최용일
      2002.09.25 01:59
      MSDN에도 다 나와 있습니다. within result를 이용해서 근접검색을 여러번하시면 검색될건데... 간단히 ...
    • 신강섭
      2002.09.24 20:51
      TFlat... 을 이용하세요... 플랫컴포넌트.. 잘쓰면 이쁘더라구여.... 자료실에 가서 검색해보면 있을꺼에...
    • 김종화
      2002.09.24 23:12
      답변 감사드리구여.. 자료실에서 컴포넌트는 찾았는데요.. 설치가 안되네요..ㅠㅠ 거기 Txt 파일에 ...
    • 조성필
      2002.09.24 23:59
      팁란이나 강의실에 보시면 해결 방법이 나와있습니다. 저두 처음에 그것때문에 여러가지 컴포넌트를 설치...
    • 신강섭
      2002.09.25 02:51
      그거는 델파이가 설치한 컴포넌트의 위치를 찾지 못해서 그런거거덩여 그러니까... 델파이의 Tools->En...
    • 김종화
      2002.09.25 05:02
      오늘도 하나 배웠습니당. 감사합니당.. 알려주신대로 하니깐 설치는 잘 됬는데요... 제가 원하...
    • KDDG_ZZOM
      2002.09.24 22:42
      안타깝게도 스트링그리드에서 표현하기가 힘들것같네요... 델파이가 업되면서 이기능이 업좀되길 바라는데...
    • 최병철
      2002.09.24 21:16
      제가 여러가 테트스한 결과 저의 실수 였읍니다. 혹시 몰라서 [Tip]에 예제 소스를 올렸읍니다. 참...
    • 김대훈
    • 2002.09.24 19:55
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 고지범
      2002.09.25 06:18
      보통 .dpr 파일은 이렇게 구성되죠... 1)   Application.Initialize; 2)   Applicat...
    • 김형환
      2002.09.24 20:19
      ============================================================== ===================
    • KDDG_ZZOM
      2002.09.24 20:00
      PostMessage(Handle, WM_CLOSE, 0, 0); 이케 해보세요... 즐프하세요...
    • 박동호
    • 2002.09.24 19:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.09.24 19:52
      MS_ACCESS의 Model Deigner에서 추가 삭제 모두 가능합니다. 당연히 기존의 데이타모두 보존되구요.. MS_...
    • 이정용
    • 2002.09.24 19:36
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이승근
    • 2002.09.24 19:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정경철
      2002.09.24 23:38
      1. 외부 프로그램을 실행 할 듯 한데.. 외부 프로그램 실행 하는법은    여기 한텔의 팁에서 "...
    • 허진규
    • 2002.09.24 19:31
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 신강섭
      2002.09.24 19:43
      MaskEdit의 OnEnter()에다가 아래와 같이 써넣으시면 되네요... 자세한 사항은 EM_SETSEL 을 도움말에...
    • KDDG_ZZOM
      2002.09.24 19:40
      검색하시면 나올것같은데...   MaskEdit1.SetFocus;   MaskEdit1.SelStart := 8; &...
    • 한원희
      2002.09.24 19:34
      안녕하세요. 한원희입니다. form2 그러니까, frmMnuF1_5P의 TEdit 의 값들을 가져오기 오려고 하시는 건...
    • 왕초보
    • 2002.09.24 09:02
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 고지범
      2002.09.25 05:54
      날짜에 관련된 것은 자료형 구조만 파악하면 딴거 안쓰고 걍... 됩니다.. 먼저 TDateTime, TDate 찾아 보...
    • 이준해
      2002.09.24 19:04
      DateUtils.pas 파일을 찾아보세요. 필요하신건 다 있을 겁니다.
    • 임형호
      2002.09.24 17:39
      화면옆에 '팁' 메뉴를 누르고.. 검색란에 '날짜' 라고 입력해보세요. 관련 내용들이 나옵니다. 아마..님...
    • 신강섭
      2002.09.24 19:31
      일단 님의 소스를 보니까... 그리드에서 한줄을 읽어서 파일에다가 한줄씩 저장을 하네요... 일단 이렇게...
    • 하일수
      2002.09.25 02:49
      지적해 주신 내용 잘 보았습니다. 하지만 제 실력이 워낙 초보라서 비교인자를 어떻게 응용해야 할 지 모...
    • 장재형
    • 2002.09.24 03:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 고지범
      2002.09.25 06:13
      메모리를 접근할 때, Alignment라는 것이 있습다. packed keyword는 Alignment를 무시할껀지 적용할 껀지...
    • sunny
    • 2002.09.24 03:58
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.09.24 18:22
      고생이 많으십니다. 인덱스의 일방적인 값으로 데이타를 나열하는것은 권장하고 싶지 않은 방법입니다. ...
    • 최수림
      2002.09.24 06:35
      ^^ 프로젝트 --> 랭귀지에 대한 내용은 저도 잘모르구요..!! TEdit 글짜가 깨져서 나오시면 &n...
    • 이경문
      2002.09.24 03:14
      TrayIcon과 관련된 컴포넌트를 사용했을 경우에 그런 경우가 종종 발생하곤 합니다. 메인 폼에서 WM_QUERY...
    • 최명관
      2002.09.24 03:50
      이미 WM_QUERYENDSESSION을 잡아서 해봤거든요. 근데 종료가 안되네요.. RX 라이브러리에 있는 트...