Q&A

  • 구조체 데이터 합치기.
통신할때 쓸 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로는 안되니까 난감하네요. 조언좀 해주세요.

2  COMMENTS
  • Profile
    이상국 1999.08.23 23:35
    > 통신할때 쓸 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로는 안되니까 난감하네요. 조언좀 해주세요.



    먼저 TRecord1이라는 구조체 마지막 즉 data3 := 0을 넣어서 문자의 끝임을 알리는 코드를 넣은 부분이 없는게 의심이 갑니다. 이는 Pascal뿐만 아니라 C라도 마찬가지일 텐데요...



    그리고 Data1의 타입이 단바이트짜리인지 아니면 2바이트 이상(Word, Integer.. 같은..)인지요..

    만일 2바이트 이상이면 이거 좀 심각해지겠는데요. 왜냐하면 Data1이 만약 Integer(4바이트)타입일때 실제로는 데이터가 01 00 00 00 이렇게 들어가겠죠. 그러면 01 바로뒤에 문자의 끝을 알리는 00을 만나니까 이상하게 작동을 할테고.. 따라서 Data1이라는 필드들도 타입이 단바이트 짜리인 Byte나 char인지를 알고싶네요.



    하여간 Pascal도 C못쟎게 타입변환은 유연합니다.





  • Profile
    Lyle 1999.08.24 04:13
    이상국 께서 말씀하시기를...

    > 먼저 TRecord1이라는 구조체 마지막 즉 data3 := 0을 넣어서 문자의 끝임을 알리는 코드를 넣은 부분이 없는게 의심이 갑니다. 이는 Pascal뿐만 아니라 C라도 마찬가지일 텐데요...

    >

    > 그리고 Data1의 타입이 단바이트짜리인지 아니면 2바이트 이상(Word, Integer.. 같은..)인지요..

    > 만일 2바이트 이상이면 이거 좀 심각해지겠는데요. 왜냐하면 Data1이 만약 Integer(4바이트)타입일때 실제로는 데이터가 01 00 00 00 이렇게 들어가겠죠. 그러면 01 바로뒤에 문자의 끝을 알리는 00을 만나니까 이상하게 작동을 할테고.. 따라서 Data1이라는 필드들도 타입이 단바이트 짜리인 Byte나 char인지를 알고싶네요.

    >

    > 하여간 Pascal도 C못쟎게 타입변환은 유연합니다.

    >

    일단 packet을 만드는데 null-terminated string function을 사용한 것이

    잘못되었다고 생각했습니다. 여러 곳에서 조언을 주셨고 결국 Move로 해결을

    봤습니다.

    record는 code에서 충분히 필요한만큼 알아낼 수 있을 것같아서 적지 않았습니다. 그런데 주석으로 packed record로 정의하였다고 썼죠? 게다가 type이

    unsigned long 이었답니다.