Главная страница
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.013 c
7-45595
snoup
2002-08-02 20:18
2002.10.14
Подскажите плиз какой ф-ей можно узнать о системном железе, напри


1-45306
DaTak
2002-10-02 17:00
2002.10.14
Вычисления???Как правильно вычислять??


14-45557
SBProgrammer
2002-09-20 08:37
2002.10.14
Просят выполнить работу, сколько это может стоит? (опис. внутри)!


7-45610
YDV
2002-08-01 08:00
2002.10.14
Как средствами DELPHIпроверить отвечает ли программа на системные


1-45397
vitnt2000
2002-10-03 09:29
2002.10.14
№ бригады