-
Я с указателями почти не работал, собственно не совсем понимаю нужны ли они в моем случае: На сервер отправляется пакет данных состоящий из обязательного заголовка и блока с данными. Заголовок представляет собой запись из нескольких полей, данные же создаются иной функцией и должны быть прибавлены к заголовку. А все это должно уже быть отправлено. Т.е. должны быть 3 функции:
function CreatePacket(msg:DWORD; data:какой-то тип):какой-то тип;
function CreateData(параметры:String/integer):какой-то тип;
function SendPacket(какой-то тип):boolean;
Вопросы: 1) Как выделить память под данные в функции CreatePacket, вставить в него заголовок и прибавить Data; 2) Какой тип должны принимать функции? И вообще уместно ли делать вывод данных в Result?
-
Можно сделать на "чистых" указателях (GetMem/ReallocMem/Move/FreeMem), можно для большего удобства использовать разного рода "обёртки" - TMemoryStream, дин. массив (array of Byte) или даже строку (рекомендуется AnsiString для совместимости со старшими версиями).
Со строкой, правда, я не вполне уверен, правильно ли будут обрабатываться 0-и в середине, но по идее, если не использовать ф-ии для работы с PChar, должны правильно. Во всяком случае, видел работающий проект, который использовал для формирования буферов данных строки.
-
А где можно посмотреть пример работы с указателями? Я пытаюсь скопировать с помошью move данные из record в Массив, ниче не получается((
-
Я бы советовал использовать простой динамический массив байт. Ошибок меньше будет.
-
Ещё, если макс. размер данных известен и сравнительно невелик, то можно использовать статический массив. А где можно посмотреть пример работы с указателями?В справке стандартной должны быть, по теме 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;
-
> TMyRec = record a, b, c : Integer;
TMyRec = packed record a, b, c : Integer;
-
Все удалось, но - байты не в том порядке. Т.е если было число $11223344 то в массиве будет $44332211, а нужно наоборот не в сетевом формате.
-
хотя эту проблему решил
|