통신할때 쓸 application protocol을 설계하고 지금 packet building작업을
하는데 C에서 하던 방법이 통하질 않네요.
var
command,
line,
dest := PChar;
size := integer;
begin
dest := NIL;
command := NIL;
line := NIL;
size := sizeof(Trecord1) + sizeof(Trecord2) +1;
//Trecord1과 Trecord2는 각각 28,24byte의 packed record.
dest := AllocMem(size);
//dest는 아래의 command와 line이 연이어 들어갈 return data packet
command := AllocMem(sizeof(Trecord1));
line := AllocMem(sizeof(Trecord2));
with Precord1(command)^ do
begin
data1 := 1;
data2 := 2;
.....
end;
with Precord2(line)^ do
begin
data1 := 3;
data2 := 4;
......
end;
//이렇게 만든 command와 line의 구조체가 연이어 dest에 붙어서 통신상의
//상대방에게 전달됩니다. 그럼 상대방이 이걸 parsing해서 해석하겠죠.
//그런데 두개의 구조체를 붙이는데서부터 문제가...
StrCopy(dest, command);
StrCat(dest, line);
Showmessage(InttoStr(Precord1(dest)^.data1)); //????
Result := dest;
//메모리 프리 생략..
end;
위에 물음표 잔뜩 써놓은 부분 말이죠. dest 에다가 command와 line을 차례로
부쳐넣고 그것을 Precord1로 casting해서 data1의 내용을 보려고했는데 제가
넣어준 값 '1'이 나옵니다. 그런데 Precord1(dest1)^.data2의 내용은 '2'가
나와야하지만 '0'이 나옵니다. 생략하고 쓰진 않았지만 그뒤의 data3도 data4
도 '0'이 나오네요.
C로 packet 만들때는 줄곳 이런 식으로 했고 parsing도 이런 방법으로 casting을 해서 해결했는데 pascal로는 안되니까 난감하네요. 조언좀 해주세요.
> 하는데 C에서 하던 방법이 통하질 않네요.
>
> var
> command,
> line,
> dest := PChar;
> size := integer;
>
> begin
> dest := NIL;
> command := NIL;
> line := NIL;
> size := sizeof(Trecord1) + sizeof(Trecord2) +1;
> //Trecord1과 Trecord2는 각각 28,24byte의 packed record.
> dest := AllocMem(size);
> //dest는 아래의 command와 line이 연이어 들어갈 return data packet
> command := AllocMem(sizeof(Trecord1));
> line := AllocMem(sizeof(Trecord2));
>
> with Precord1(command)^ do
> begin
> data1 := 1;
> data2 := 2;
> .....
> end;
> with Precord2(line)^ do
> begin
> data1 := 3;
> data2 := 4;
> ......
> end;
> //이렇게 만든 command와 line의 구조체가 연이어 dest에 붙어서 통신상의
> //상대방에게 전달됩니다. 그럼 상대방이 이걸 parsing해서 해석하겠죠.
> //그런데 두개의 구조체를 붙이는데서부터 문제가...
>
> StrCopy(dest, command);
> StrCat(dest, line);
> Showmessage(InttoStr(Precord1(dest)^.data1)); //????
>
> Result := dest;
> //메모리 프리 생략..
> end;
>
> 위에 물음표 잔뜩 써놓은 부분 말이죠. dest 에다가 command와 line을 차례로
> 부쳐넣고 그것을 Precord1로 casting해서 data1의 내용을 보려고했는데 제가
> 넣어준 값 '1'이 나옵니다. 그런데 Precord1(dest1)^.data2의 내용은 '2'가
> 나와야하지만 '0'이 나옵니다. 생략하고 쓰진 않았지만 그뒤의 data3도 data4
> 도 '0'이 나오네요.
>
> C로 packet 만들때는 줄곳 이런 식으로 했고 parsing도 이런 방법으로 casting을 해서 해결했는데 pascal로는 안되니까 난감하네요. 조언좀 해주세요.
먼저 TRecord1이라는 구조체 마지막 즉 data3 := 0을 넣어서 문자의 끝임을 알리는 코드를 넣은 부분이 없는게 의심이 갑니다. 이는 Pascal뿐만 아니라 C라도 마찬가지일 텐데요...
그리고 Data1의 타입이 단바이트짜리인지 아니면 2바이트 이상(Word, Integer.. 같은..)인지요..
만일 2바이트 이상이면 이거 좀 심각해지겠는데요. 왜냐하면 Data1이 만약 Integer(4바이트)타입일때 실제로는 데이터가 01 00 00 00 이렇게 들어가겠죠. 그러면 01 바로뒤에 문자의 끝을 알리는 00을 만나니까 이상하게 작동을 할테고.. 따라서 Data1이라는 필드들도 타입이 단바이트 짜리인 Byte나 char인지를 알고싶네요.
하여간 Pascal도 C못쟎게 타입변환은 유연합니다.