Конференция "Начинающим" » Как правильно использовать указатели в данной задаче [D2005, XP]
 
  • bodun (04.10.09 17:48) [0]
    Я с указателями почти не работал, собственно не совсем понимаю нужны ли они в моем случае:

    На сервер отправляется пакет данных состоящий из обязательного заголовка и блока с данными. Заголовок представляет собой запись из нескольких полей, данные же создаются иной функцией и должны быть прибавлены к заголовку. А все это должно уже быть отправлено.

    Т.е. должны быть 3 функции:

    function CreatePacket(msg:DWORD; data:какой-то тип):какой-то тип;
    function CreateData(параметры:String/integer):какой-то тип;
    function SendPacket(какой-то тип):boolean;



    Вопросы:
    1) Как выделить память под данные в функции CreatePacket, вставить в него заголовок и прибавить Data;
    2) Какой тип должны принимать функции? И вообще уместно ли делать вывод данных в Result?
  • Sapersky (04.10.09 19:13) [1]
    Можно сделать на "чистых" указателях (GetMem/ReallocMem/Move/FreeMem), можно для большего удобства использовать разного рода "обёртки" - TMemoryStream, дин. массив (array of Byte) или даже строку (рекомендуется AnsiString для совместимости со старшими версиями).

    Со строкой, правда, я не вполне уверен, правильно ли будут обрабатываться 0-и в середине, но по идее, если не использовать ф-ии для работы с PChar, должны правильно. Во всяком случае, видел работающий проект, который использовал для формирования буферов данных строки.
  • bodun (04.10.09 20:00) [2]
    А где можно посмотреть пример работы с указателями?
    Я пытаюсь скопировать с помошью move данные из record в Массив, ниче не получается((
  • Kolan © (04.10.09 20:20) [3]
    Я бы советовал использовать простой динамический массив байт. Ошибок меньше будет.
  • Sapersky (04.10.09 21:39) [4]
    Ещё, если макс. размер данных известен и сравнительно невелик, то можно использовать статический массив.

    А где можно посмотреть пример работы с указателями?

    В справке стандартной должны быть, по теме Pointers and pointer types. В книжках по Delphi тож...

    Я пытаюсь скопировать с помошью move данные из record в Массив, ниче не получается


    procedure TForm1.Button1Click(Sender: TObject);
    type
     PMyRec = ^TMyRec;
     TMyRec = record
       a, b, c : Integer;
     end;
     TByteArr = array of Byte;
    Const
     MRSize = SizeOf(TMyRec);
    Var
     rec : TMyRec;
     arr : TByteArr;
    begin
    SetLength(arr, MRSize);

    Move(rec, arr[0], MRSize); // можно так...
    PMyRec(@arr[0])^ := rec;   // ...или так
    end;

  • qwer_qwer (04.10.09 22:05) [5]

    > TMyRec = record    a, b, c : Integer;

    TMyRec = packed record    a, b, c : Integer;

  • bodun (04.10.09 22:34) [6]
    Все удалось, но - байты не в том порядке. Т.е если было число $11223344 то в массиве будет $44332211, а нужно наоборот не в сетевом формате.
  • bodun (04.10.09 22:52) [7]
    хотя эту проблему решил
 
Конференция "Начинающим" » Как правильно использовать указатели в данной задаче [D2005, XP]
Есть новые Нет новых   [134439   +44][b:0][p:0.001]