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

Вниз

Почему так?   Найти похожие ветки 

 
Dmitriy Polskoy ©   (2002-10-03 12:44) [0]

Почему следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
buf: pchar;
begin
GetMem(buf, 50);
label1.Caption := IntToStr (Sizeof(buf));
FreeMem(buf);
end;
выдает в Caption значение 4 ?


 
qube ©   (2002-10-03 12:47) [1]

SizeOf(buf) -- размер указателя.


 
Dmitriy Polskoy ©   (2002-10-03 13:06) [2]

А как получить длинну?


 
Dmitriy Polskoy ©   (2002-10-03 13:11) [3]

В этом коде на последней строке выскакивает ошибка, из-за чего не могу понять.
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var l: Integer;
buf: PChar;
src: TFileStream;
begin
l := Socket.ReceiveLength;
GetMem(buf,l+1);
Socket.ReceiveBuf(buf,l);
src := TFileStream.Create("aaa.txt",fmOpenReadWrite);
src.Seek(0,soFromEnd);
src.WriteBuffer(buf,l);
src.Free;
FreeMem(buf);
end;


 
qube ©   (2002-10-03 13:12) [4]

При выделении запомнить, сколько памяти выделяли


 
Kacnep   (2002-10-03 13:31) [5]

или Length(buf) или sizeof(buf^)
но последнее не точно - сорри


 
Dmitriy Polskoy ©   (2002-10-03 13:35) [6]

А по поводу Dmitriy Polskoy © (03.10.02 13:11)?


 
gek ©   (2002-10-03 13:37) [7]

Размер надо указывать


 
Dmitriy Polskoy ©   (2002-10-03 13:42) [8]

2 gek © (03.10.02 13:37)
Это не имеет значения.


 
qube ©   (2002-10-03 13:42) [9]

Socket.ReceiveBuf( buf^,l);


 
han_malign   (2002-10-03 13:45) [10]

в этом случае
procedure TForm1.Button1Click(Sender: TObject);
var
buf: pchar;
begin
GetMem(buf, 50);
label1.Caption := IntToStr (50);
FreeMem(buf);
end;

;^P
а если все же
procedure TForm1.LedPCharSize(buf: PChar);
begin
label1.Caption := IntToStr (Length(buf));//не явное преобразование PChar к String в Length()
//или
label1.Caption := IntToStr (lstrlen(buf));//явно через WinApi(uses Windows;)

end;

вот только будет не размер буфера, а позиция первого #0,
а если нуля до конца буфера не окажется - то О-О-Ой что буде-е-е-т.
З.Ы. Причем Delphi-йский GetMem память в отличии от Local/GlobalAlloc память не обнуляет, так что Access violation обеспечен.(НЕ УВЕРЕН НАДО ПРОВЕРЯТЬ)
З.З.Ы. в Delphi своя куча и стандартные Windows фукции с его памятью не работают, а в самом Delphi функии аллокрованного размера нет (что весьма обоснованно)
З.З.З.Ы. надеюсь чем PChar(ASCIIZ(zero ended)) от String отличается объяснять не надо.


 
han_malign   (2002-10-03 13:51) [11]

а если нужно все таки знать размер выделенного буфера то нужно пользоваться GlobalAlloc,GlobalLock,GlobalSize



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
1-45376
lety
2002-10-04 00:11
2002.10.14
таблица с заголовком в 2 уровня


1-45362
REA
2002-10-02 16:17
2002.10.14
Кнопочки


1-45431
DeMoN-777
2002-09-23 02:35
2002.10.14
Открыть в новом окне


1-45462
Nayfl
2002-10-01 19:13
2002.10.14
С имитировать нажатия на Enter


1-45282
Manulo
2002-10-04 14:54
2002.10.14
TMemo