Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-45254
stas_a
2002-10-04 10:15
2002.10.14
logon в w2k


1-45390
bbn
2002-10-02 20:58
2002.10.14
Как установить фокус на программно-созданном элементе ?


1-45394
Chandr
2002-09-30 11:45
2002.10.14
Узлы в TreeView


3-45224
Alex-69
2002-09-24 08:07
2002.10.14
Программно Net dir и Local Share


1-45436
Weare
2002-10-03 16:12
2002.10.14
Сохранение в форматах *.jpg, *.bmp.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский