Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.22;
Скачать: CL | DM;

Вниз

Как правильно использовать указатели в данной задаче   Найти похожие ветки 

 
bodun   (2009-10-04 17:48) [0]

Я с указателями почти не работал, собственно не совсем понимаю нужны ли они в моем случае:

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

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

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


Вопросы:
1) Как выделить память под данные в функции CreatePacket, вставить в него заголовок и прибавить Data;
2) Какой тип должны принимать функции? И вообще уместно ли делать вывод данных в Result?


 
Sapersky   (2009-10-04 19:13) [1]

Можно сделать на "чистых" указателях (GetMem/ReallocMem/Move/FreeMem), можно для большего удобства использовать разного рода "обёртки" - TMemoryStream, дин. массив (array of Byte) или даже строку (рекомендуется AnsiString для совместимости со старшими версиями).

Со строкой, правда, я не вполне уверен, правильно ли будут обрабатываться 0-и в середине, но по идее, если не использовать ф-ии для работы с PChar, должны правильно. Во всяком случае, видел работающий проект, который использовал для формирования буферов данных строки.


 
bodun   (2009-10-04 20:00) [2]

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


 
Kolan ©   (2009-10-04 20:20) [3]

Я бы советовал использовать простой динамический массив байт. Ошибок меньше будет.


 
Sapersky   (2009-10-04 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   (2009-10-04 22:05) [5]


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

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


 
bodun   (2009-10-04 22:34) [6]

Все удалось, но - байты не в том порядке. Т.е если было число $11223344 то в массиве будет $44332211, а нужно наоборот не в сетевом формате.


 
bodun   (2009-10-04 22:52) [7]

хотя эту проблему решил



Страницы: 1 вся ветка

Текущий архив: 2009.11.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
1-1225292591
Циркуль
2008-10-29 18:03
2009.11.22
Не печатаются изображения на принтере


2-1255069689
Xmen
2009-10-09 10:28
2009.11.22
Работа с дисками


15-1253746705
Германн
2009-09-24 02:58
2009.11.22
Цена на нефть и пр.


2-1254990753
palva
2009-10-08 12:32
2009.11.22
Ошибка при работе с ADODataSet Access тип DEC


9-1183718609
Dib@zol
2007-07-06 14:43
2009.11.22
Скринсейвер