Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно использовать указатели в данной задаче [D2005, XP]


bodun ©   (2009-10-04 17:48:00) 

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

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

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

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


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


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

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


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

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


qwer_qwer   (2009-10-04 22:05:00) [3]


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

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


Sapersky   (2009-10-04 21:39:00) [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;


Kolan   (2009-10-04 20:20:00) [5]

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


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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо