Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизПочему так? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c