Q&A

  • 포인터 관련...
도움좀 부탁합니다. ^^;

type
TSocketData = record
   SocketID : TSocket;           // 소켓
   ReceivePacket : TIGW_Packet;  // 데이터받을 버퍼
   pHeader, pData : pointer;     // 헤더와 데이터의 포인터
   iDataLen : integer;           // 받을 데이터의 길이
   ExistData : boolean;          // 다음 데이터 존재 여부
end;

var
FSockDataList : TList;
i : integer;

밑의 문장에서 i 에는 FSockDataList 의 현재 Index 값이 들어 가는건가요.

i := FSockDataList.Add(AllocMem(SizeOf(TSocketData)));
TSocketData(FSockDataList.Items[i]^).SocketID := SocketID;


----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
type
TPackLen = array[1..4] of char;  // 전문 Data 길이

TIGW_Header = packed record
   cLength : TPackLen; // Header 제외 Data Packet 길이
   cType   : TPackNo;  // Message Type (구분)
   cDate   : TPackDt;
   cTime   : TPackTm;
   cErrCd  : TErrCd;
end;

var
pSock : pointer;

TSocketData(pSock^).pHeader := @TSocketData(pSock^).ReceivePacket;
TSocketData(pSock^).iDataLen:=StrToIntDef(TIGW_Header(TSocketData(pSock^).pHeader^).cLength, 0);

TSocketData(pSock^).ReceivePacket; 에 들어있는 값
('0', '0', '0', '0', '1', '0', '0', '0', '2', '0', '0', '2', '0', '8', '2', '7', '1', '6', '1', '6', '2', '5', '0', '0', '0')


TSocketData(pSock^).iDataLen:=StrToIntDef(TIGW_Header(TSocketData(pSock^).pHeader^).cLength, 0);
위 문장에서 TSocketData(pSock^).pHeader^ 이부분은 이해가 가는데...

----------------------------------------------------------------------------------
아래 문장도 이해가 안갑니다.
----------------------------------------------------------------------------------
TIGW_Header(TSocketData(pSock^).pHeader^).cLength 이렇게 하면 여기에는 ('0', '0', '0', '0') 값이 들어가더라고요.
이게 어떻게 들어가는지 궁금합니다.
1  COMMENTS
  • Profile
    정형준 2002.08.28 13:06
    첫번째 i 는 새로 추가된 오브젝트의 인덱스가 맞습니다.

    그리고 TSocketData(pSock^).pHeader 는 TIGW_Header를 가르키는데
    TIGW_Header는 다음처럼 정의되어있으니까...

    TIGW_Header = packed record
       cLength : TPackLen; // Header 제외 Data Packet 길이
       cType   : TPackNo;  // Message Type (구분)
       cDate   : TPackDt;
       cTime   : TPackTm;
       cErrCd  : TErrCd;
    end;

    cLength 는 TPackLen이고 TPackLen은 char 4byte이니까
    TSocketData(pSock^).ReceivePacket 에 들어있는 값의 맨처음 4byte의 자료가 들어가겠죠.

    TPackNo, TPackDt, TPackTm, TErrCd 에 대한 자료가 없어 정확히는 모르겠지만..
    추측을 하면

       cLength : '0000'       /* 처음 4자리 */
       cType   : '1000        /* 5번째 부터 4자리로 추정됨*/
       cDate    : '20020827' /* 9번째 부터 8자리로 추정됨 */
       cTime   : '16162500' /* 17번째 부터 8자리로 추정됨 */
       cErrCd   : '0'           /* 마지막 1자리 */

    중요한것은 Record는 메모리의 연속된 공간을 차지하므로
    define된 순서대로 자료가 들어가게 됩니다.

    도움이 되셨기를....