2013-06-10 4 views
-1

Возможно, это не относится к делу, но я недавно переустановил Delphi XE2.Assigned (my_var) оценивает значение True, где var вычисляет значение Nil (!! ??)

У меня есть переменная path (типа TPath, карта TG Gogole, хотя я сомневаюсь, что это важно).

Я останавливаю в отладчике и оцениваю path, что оценивается как Nil.

Если я запускаю, я получаю исключение, Read of address 0, которое, как я подозреваю, из-за этого.

Когда я затем оценить Assigned(path) в то же самое время, что она path = Nil эволют к True (тот же результат, когда я остановить на ShowMessage линии - которая выполняется)).

Может кто-нибудь объяснить это мне?

Очистить & rebuild ничего не меняет. Может быть, лучше удалить & переустановить Delphi?

(извинения @mbratch, я использовал var для демонстрации, настоящее имя actully path)


[Обновление] Полный пример кода, как это предусмотрено TMS и работать на них (в другой зоне tiem , вот почему я прошу здесь тоже).

This was retested here with:

uses 
    uwebgmapspolylines; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    p: TPath; 
begin 
    p := TPath.Create; 

    if Assigned(p) then 
    ShowMessage('creation OK'); 
end; 

and this proves the correct creation of TPath returns a valid instance.

Когда я останавливаюсь на if Assigned(p) then и оценить p я получаю Nil, но когда я оцениваю Assigned(p) я True.

Когда я наведите курсор на объявление переменной в среде IDE, показывает, что тип объявлен в UWebGMapsPolyLines


[Futher обновление] Два голоса, чтобы закрыть? Шутки в сторону? Я думаю, от людей, которые думают, что этого просто не может быть - и все же это !!!

Странная вещь, что @j попробовал и получил p <> Nil. Тем не менее, я попробовал это на втором ПК и до сих пор получаю p = Nil с помощью кода, размещенного здесь, который был предоставлен TMS.

Я признаю, что это кажется странным, но я могу воспроизвести его на двух ПК. P - Nil, но все равно Assigned().

У меня нет кода Assigend() для входа. Кроме того, я немного изменил код до явно if System.Assigned(p) и получил тот же результат. Какие-либо предложения?

Assigned, or not?

+1

Эта переменная на самом деле называется 'var'? Разве это не 'var' ключевое слово Delphi (Pascal)? – lurker

+1

Итак, у вас есть какие-либо 'с' утверждениями, которые могут запутать отладчик? –

+1

Можете ли вы изменить свое сообщение, чтобы показать свой фактический код? С этим мы сможем выяснить, что происходит. –

ответ

2

Я использовал именно ваш код (с Delphi XE2) и нашел это:

TPath breakpoint

TPath watch

Вы, возможно, запутанным FOwner = nil для p = nil? TPath наследует от TPersistent, поэтому вы можете передать его владельцу (хотя это необязательно). Можно, например, сделать:

p := TPath.Create(self); 

EDIT

Попробуйте это:

var p:TPath 
    begin 
*1 if assigned(p) then ShowMessage('foo'); 
    p:=nil; 
    if assigned(p) then ShowMessage('bar'); 
    p:=TPath.Create; 
    if assigned (p) then ShowMessage('ok'); 
    end; 

Поместите точку останова на *1 - вы должны увидеть в часах или локальной переменной окна:

p  *Inaccessible Value* 

Местный переменный les для неосновных ссылочных типов не инициализируются нулем/ноль - они содержат любые случайные данные, находящиеся в выделенном им пространстве. «Недопустимое значение» означает, что независимо от того, что это за случайные данные, оно не указывает на читаемый адрес памяти в памяти вашей программы.

Шаг к следующей строке -> 'Foo' ->if assigned(p)...

Вы видите сообщение ... почему ?! Assigned проверяет только nil - поскольку локальная переменная не инициализирована, Assigned возвращает true (она не знает, что вы указали ей неинициализированную локальную переменную - она ​​знает только, что вы дали ей что-то не nil). Вот почему это плохая идея освободить неинициализированную локальную переменную.

Шаг к следующей строке -> р: = ноль ->if assigned(p)...

Когда вы перешагнете р: = NIL вы должны видеть, что Недоступный Значение изменения:

p  nil 

И вы не увидите сообщение «bar» (помните, что назначено (p) проверяет только nil). Обратите внимание, что nil голый в часах - нет круглых скобок! Пошаговое до конца вы видите p «s изменение значения снова в часы после того, как он был создан:

p  (nil)  

Как Sertaç объяснено в комментариях, когда объект был создан часы/местные окна показать вам свой член содержимое в круглых скобках. Выше показывает нам, что p не nil (без скобки), не инициализирована (т.е. не недоступного значения), и что он также содержит поле члена (расширение показывает, что он FOwner), который был инициализируется nil и не присвоено значение.

Короткий урок заключается в том, что Assigned действительно полезно только для полей или глобал и не для неопорного подсчета локальных переменного - бывший инициализируется nil при создании объекта, последняя не (когда вы вводите метод).

+0

+1 Вы можете быть здесь. Когда я использую ваше предложение, 'p: = TPath.Create (self);' p имеет значение, отличное от Nil. Я попрошу уточнить, так как они отправили мне образец кода без параметров. Спасибо, я полагаю, что я дам вам ответ после ответа. – Mawg

+0

@Mawg - Но что вы видите, когда говорите «Он оценивает ноль»? Вы видите все эти предметы, как я уже писал выше? «TPath» - это объект с множеством элементов в нем (здесь мы видим FItemPath, FItems, FUpdateCount, FNext и т. Д.). Здесь TPath создается просто отлично (т. Е. Не ноль) - только то, что его поле FOwner является 'nil'. 'p' сам может быть не ноль и по-прежнему иметь в нем поля, которые« nil »- это именно то, что' IfAssigned (p) 'говорит вам, когда оно возвращает true. Нет необходимости назначать FOwner для 'p', если он вам не нужен (FOwner = nil is OK) - это также не означает, что' p' сам является 'nil'. –

+1

@Mawg Я добавлю, что я понятия не имею, почему ваши часы показывают (ноль), а моя показывает больше объектов - возможно, у нас есть разные версии компонента TMS (я только что загрузил демо с их сайта). Я не знаю каких-либо параметров в delphi, чтобы изменить поведение того, что есть и не сообщается в окне locals (возможно, у вас нет всех обновлений XE2? Версия для начинающих?) –

Смежные вопросы