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

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

Почему так? [D6, Win2k]


Dmitriy Polskoy ©   (2002-10-03 12:44:00) 

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


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

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


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

в этом случае
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 отличается объяснять не надо.


Dmitriy Polskoy   (2002-10-03 13:42:00) [3]

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


qube   (2002-10-03 13:42:00) [4]

Socket.ReceiveBuf( buf^,l);


gek   (2002-10-03 13:37:00) [5]

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


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

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


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

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


qube   (2002-10-03 13:12:00) [8]

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


Dmitriy Polskoy   (2002-10-03 13:11:00) [9]

В этом коде на последней строке выскакивает ошибка, из-за чего не могу понять.
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;


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

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


qube   (2002-10-03 12:47:00) [11]

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


Наверх

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