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

Вниз

РАбота с указателями   Найти похожие ветки 

 
arhis   (2004-02-02 16:47) [0]

Есть

var buffer : pointer;
...
GetMem(buffer,Socket.recieveLength);
Socket.Receivebuf(buffer,Socket.recieveLength);

вопрос как прочитать 2,3,4,5 байты и сделать из этого Longint;

Заранее спасибо.


 
Юрий Зотов ©   (2004-02-02 16:53) [1]

var
P: ^LongInt;
...
P := Pointer(Integer(Buffer) + 3);
ShowMessage(IntToStr(P^));


 
MBo ©   (2004-02-02 16:53) [2]

I:=PInteger(PByteArray(buffer)[1])^;
и подозреваю, что
Receivebuf(buffer ^,...


 
Digitman ©   (2004-02-02 16:54) [3]

var buffer : pointer;
MyVar: Longint;

GetMem(buffer,Socket.recieveLength);
if Socket.Receivebuf(buffer^,Socket.recieveLength) >= 6 then
MyVar := PInteger(Integer(buffer) + 2)^;


 
arhis   (2004-02-02 16:57) [4]

Большое спасибо


 
arhis   (2004-02-03 16:07) [5]

Еще вопрос

var buffer : pointer;
mysize : integer;
strarr : array of string[50];

size:=500*51
SetLength(StrArr,500);
GetMem(buffer,5+Size);
pBytearray(buffer)^[0]:=3;
plongint(integer(buffer)+1)^:=Size;
move(StrArr,pointer(integer(buffer)+5)^,Size);

на команде move дает косяк. Взгляните пожалуйста свежим взглядом, а то я уже ничего не вижу.


 
Тимохов ©   (2004-02-03 16:12) [6]

move( StrArr,pointer(integer(buffer)+5)^,Size);

жирненький, это указатель, т.е. ты мувишь укзатель, а не то, на что он указывает (т.е. на миссив).

ИМХО.
Может и ошибаюсь.


 
arhis   (2004-02-03 16:17) [7]

то есть надо писать такую ботву:

type tstrarr : array of string[50];
pStrArr : ^Tstrarr;
var buffer : pointer;
mysize : integer;
strarr : TStrArr;

size:=500*51
SetLength(StrArr,500);
GetMem(buffer,5+Size);
pBytearray(buffer)^[0]:=3;
plongint(integer(buffer)+1)^:=Size;
move(pStrArr(StrArr)^,pointer(integer(buffer)+5)^,Size);

но ведь так я получу указатель на указатель на данные массива


 
Dedushka_Mazai ©   (2004-02-03 16:21) [8]

move(StrArr, pointer(integer(buffer)+5)^,Size);
скорее всего, ботва у тебя здесь. указатель неизвестно куда


 
arhis   (2004-02-03 16:22) [9]

строчка

plongint(integer(buffer)+1)^:=Size;

работает прекрасно.


 
Fay ©   (2004-02-03 16:23) [10]

>> size:=500*51
Серьёзно?


 
arhis   (2004-02-03 16:26) [11]

to Fay

а как мне еще узнать размер дин. массива?

500 элементов string[50].


 
Тимохов ©   (2004-02-03 16:42) [12]

Автору

напиши так
move( pointer(StrArr)^,pointer(integer(buffer)+5)^,Size);

Так работает - проверил.


 
Fay ©   (2004-02-03 16:43) [13]

А точно все дин. массивы packed?


 
Тимохов ©   (2004-02-03 16:44) [14]

С узнаванием размера - все верно.
В данном случае 500 на 51.


 
Тимохов ©   (2004-02-03 16:45) [15]


> Fay © (03.02.04 16:43) [13]

Я тоже озабачивался этим вопросом.
Не особо искал, поэтому в хелпе не нашел явного упоминания об этом.
Но похоже, что packed.
По карайней мере судя по асм коду.


 
Fay ©   (2004-02-03 16:52) [16]

5 1 - это что. Длина или #0?


 
Тимохов ©   (2004-02-03 16:53) [17]

50 под символы, 0 под байт длины.
Помните старые добрые пасклевские строки? Вот это они и есть...


 
Fay ©   (2004-02-03 17:00) [18]

Я знаю, что это за строки 8).


 
Тимохов ©   (2004-02-03 17:01) [19]

Тогда, полагаю, ясно почему 51.
offtop: Блин, как я не навижу в дельфи эти var Buffer; без типа. Сколько лет пишу, всегда в таких местах думать приходится.
Это я к тому, что часто вопросы с такой конструкцией возникают.



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
1-38807
Layner
2004-02-03 08:36
2004.02.13
Подскажите, как


1-38820
Merlot
2004-02-03 08:35
2004.02.13
Закрывание программы.


14-39009
NewD
2004-01-27 07:04
2004.02.13
Подскажите пож-та ссылrи на статьи про Tlistview .


3-38701
Vuk
2004-01-21 14:38
2004.02.13
KEY VIOLATION при выполнении процедуры.


6-38990
Zilog_
2003-12-10 18:40
2004.02.13
Проблема с WebBrowser~ом