![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
что содержит строка после SetLength? [D7]
umbra © (2007-04-26 12:33:00)если объявить строковую переменную
var
s: String;
а затем, не присаивая ей значения, выделить для нее память
SetLength(s, MAX_PATH)
то будет ли эта память инициализирована нулями?
Leonid Troyanovsky (2007-04-26 19:09:00) [1]
> umbra © (26.04.07 12:33)
s:= StringOfChar(#0, MAX_PATH)
--
Regards, LVT.
Джо (2007-04-26 18:12:00) [2]> [11] Loginov Dmitry © (26.04.07 18:04)
> Несколько неожиданный результат :)
Почему «неожиданный»? Ожидать чего-то конкретного можно только тогда, когда тебе что-то обещают, а когда прямо обещают, что результат будет неожиданный, то и «маємо те, що маємо» :)
Loginov Dmitry (2007-04-26 18:04:00) [3]Зацените:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
SetLength(S, 100);
Caption := S;
end;
end.
Несколько неожиданный результат :)
Но точно строка не обнуляется!
umbra (2007-04-26 13:45:00) [4]спасибо всем за разъяснения.
Reindeer Moss Eater (2007-04-26 13:04:00) [5]Я всегда думал, что результат приведения строки к PChar - адрес певого символа строки. Чего ж компилятор ругается?
Нет не адрес, а типизированный указатель.
begin...end (2007-04-26 13:04:00) [6]> umbra © (26.04.07 12:56) [4]
> Я всегда думал, что результат приведения строки к PChar
> - адрес певого символа строки.
Так и есть.
> Чего ж компилятор ругается?
Первым параметром FillChar должен быть не адрес, а переменная, начиная с адреса которой требуется заполнить память нужным значением.
FillChar(PChar(S) ^, Length(s), 0)илиFillChar(S[1], Length(s), 0).
Reindeer Moss Eater (2007-04-26 13:03:00) [7]>Жаль.
Да нет, не жаль, а как раз зашибись.
А если я длинную строку использую как буфер для передачи в winapi функцию?
var s : string; p : PChar;
begin
s := 'мама';
SetLength(s,10);
p := PChar(s) + 4;
ZeroMemory(p,6);
ShowMessage(IntToStr(StrLen(PChar(s))));
umbra (2007-04-26 13:01:00) [8]
> а че такое buf
строка
Правильный Вася (2007-04-26 13:00:00) [9]а че такое buf
umbra (2007-04-26 12:56:00) [10]
> FillChar может исцелить твою печаль
>
ага.
На этой строчке
FillChar(PChar(buf), Length(buf), 0);
компилятор гворит
Constant object cannot be passed as var parameter
А при нажатии на волшебную кнопку F1 можно узнать, что
This error message is reserved.
Я всегда думал, что результат приведения строки к PChar - адрес певого символа строки. Чего ж компилятор ругается?
DrPass (2007-04-26 12:45:00) [11]FillChar может исцелить твою печаль
umbra (2007-04-26 12:44:00) [12]судя по
the content of newly allocated space is undefined
инициализирована не будет. Жаль.
Reindeer Moss Eater (2007-04-26 12:38:00) [13]Это совершенно секретные сведения. Их можно найти только нажав на секретную кнопку F1.