- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
u: Pointer;
begin
String(u) := Edit2.Text; /// Тут написано Строка по адресу [b]u [/b]должна получить значение равное edit2.text, однако область памяти [b]u [/b]не назначена.
Edit1.Text:= IntToStr(Length(String(u))); // если u=nil будет ошибка, если хоть чему то равен, даже случайно, то выдаст длину того куда нацелен.
end;
так понятней, но в зависимости от способа выдачи свойства Text будет по разному работать(напрямую или через функцию). Как и предыдущий вариант.
- Код: Выделить всё
u := addr(Edit2.Text)
С integer аналогично. В то ли в delphi, то ли еще где то видел галочку, чтобы компилятор переменным функций по умолчанию присваивал значение nil. Т.е. инициализировал. В нашем же случае они негде не инициализированы и рандомны.
Добавлено спустя 16 минут 35 секунд:VirtUX писал(а):ок. Но почему срабатывает без ошибок этот код?
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
u: Pointer;
begin
u := nil;
Integer(u) := 5789;
Edit1.Text:= IntToStr(Integer(u));
end;
Получается не нужно делать
New(Integer(u));
Pointer это числовое значение адреса переменной, т.е. это уже инициализированная ячейка памяти, которая размечена под хранение числа указывающего на другую область памяти. Мы банально меняем значение в переменной, и считываем его из одного и того же места.
Во всех примерах ошибка в том, что надо говорить программе, что работать нужно не с данными в переменной, а с данными по адресу, указанному в переменной.