2012-03-26 15 views
3

아래의 변형 레코드로 작업하고 있습니다. 변수 인스턴스는 Kro_Combi입니다. SizeOf (Kro_Combi)는 7812 바이트를보고합니다. SizeOf (Kro_Combi.data)는 7810 바이트를보고합니다. 변형 레코드의 "비 직접 모드"대/소문자를 구성하는 다른 모든 데이터 구조의 SizeOf 합계도 7810 바이트가 추가됩니다.변형 레코드에 추가 공간이 할당 되었습니까?

왜 2 바이트 차이가 있습니까? 나는이 두 변종을 서로 정확하게 겹치게하고 싶습니다.

TKro_Combi = record 
    case directmode:boolean of 
    true : (
     data : array[0..7809] of byte 
      ); 
    false : (
     Combi_Name   : array[0..23] of char;    //24 
     Gap1     : array[0..63] of byte;    // 24-87 (64) 
     Ins_Effect_Group  : array[1..12] of TIns_Effect_Params; //74 each, (Ins_Effect_Data=9 bytes) 74*12 = 888 
     Mast_Effect_Params : array[0..229] of byte;    // 976-1205 : 230 bytes 
     Vect_Aud__Drum_Params : array[0..97] of byte;    //1206-1303 : 98 bytes 
     Karma_Common   : array[0..509] of byte;    //1304-1813 : 510 bytes 
     Karma_Module   : array[0..3] of TKarma_Module;  //1814-2557 : 744 bytes each Total span 1814 - 4789 = 2976 bytes total 
     Common_Params   : array[0..11] of byte;    //4790-4801 = 12 bytes 
     Timbre_Group   : array[1..16] of TTimbre_Params; ) // 4802 -4989 = 188 bytes each, 16 Timbres, 4802-7809 = 3008 bytes total for all 
    end; 

답변

7

우선 directmode 필드의 공간이 필요합니다. 레코드의 크기가 7810 바이트가되도록하려면 해당 필드를 제거해야합니다. 다른 바이트는 변형 레코드의 false 부분의 내부 맞춤 및 패딩으로 인해 발생합니다. 나는 그것이 어디에서 왔는지 아직 잘 이해할 수 없다. 아무리해도 패딩 바이트를 피하기 위해 팩 된 레코드를 사용하기 만하면됩니다.

TKro_Combi = packed record 
case boolean of 
true : (
    data : array[0..7809] of byte 
     ); 
false : (
    Combi_Name   : array[0..23] of char;    //24 
    Gap1     : array[0..63] of byte;    // 24-87 (64) 
    Ins_Effect_Group  : array[1..12] of TIns_Effect_Params; //74 each, (Ins_Effect_Data=9 bytes) 74*12 = 888 
    Mast_Effect_Params : array[0..229] of byte;    // 976-1205 : 230 bytes 
    Vect_Aud__Drum_Params : array[0..97] of byte;    //1206-1303 : 98 bytes 
    Karma_Common   : array[0..509] of byte;    //1304-1813 : 510 bytes 
    Karma_Module   : array[0..3] of TKarma_Module;  //1814-2557 : 744 bytes each Total span 1814 - 4789 = 2976 bytes total 
    Common_Params   : array[0..11] of byte;    //4790-4801 = 12 bytes 
    Timbre_Group   : array[1..16] of TTimbre_Params; ) // 4802 -4989 = 188 bytes each, 16 Timbres, 4802-7809 = 3008 bytes total for all 
end; 
+0

정확히 맞습니까? 고마워요! 나는 directmode 변수가 필요 없다. 선언문의 필수 부분이라고 생각했다. 이제는 오래된 "압축 된 레코드"구문을 기억합니다. – tim11g

관련 문제