Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить что переменная инициализирована? / 13 сообщений из 13, страница 1 из 1
28.08.2003, 19:38
    #32250668
Oleg_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Есть переменная класса TStringList, нужно программно проверить что она инициализирована. Как это сделать?
...
Рейтинг: 0 / 0
28.08.2003, 19:42
    #32250672
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Не очень понятно....

Но я бы написал так
if Assigned(variable) then...
...
Рейтинг: 0 / 0
28.08.2003, 19:51
    #32250679
Oleg_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Спасибо работает вроде... я и сам так думал... но правильно ли так проверять
...
Рейтинг: 0 / 0
28.08.2003, 19:59
    #32250687
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Delphi syntax:

function Assigned(const P): Boolean;

Description

Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.

Assigned returns false if P is nil, true otherwise.

Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.
...
Рейтинг: 0 / 0
28.08.2003, 20:01
    #32250691
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Неправильно так проверять. Никто и ничто не гарантирует, что указатель во всех случаях на несозданный объект - nil. Следовательно, Access Violation может появиться, причем в самый неприятный момент.

Нет стопроцентного способа убедиться, создан объект или не создан. Можно только в некоторых частных случаях или по косвенным признакам.

Поэтому, не надо писать такой код, где требуются подобные проверки.
...
Рейтинг: 0 / 0
28.08.2003, 20:03
    #32250692
Oleg_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Если переменная неинициализирована вылезает access violation, что вобщем и понятно, остается ставить try except? как-то не очень красиво
...
Рейтинг: 0 / 0
28.08.2003, 20:12
    #32250699
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
>>Неправильно так проверять.
Я не согласен. В исходных кодах VCL часто встречаются такие проверки.
Просто при освобождении объектов необходимо обнулять ссылки на них.
Для этого можно воспользоваться procedure FreeAndNil(var Obj);
...
Рейтинг: 0 / 0
29.08.2003, 02:06
    #32250778
WO
WO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
sv:

На заборе тоже написано...., а там дрова. Просто в Борланде требовали от кодеров делать через Assigned...

По-моему, действительно, корректного способа определить нет. Остается только быть аккуратным и делать =nil после каждого Destroy (ну или freeandnil).
...
Рейтинг: 0 / 0
29.08.2003, 11:25
    #32251065
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Ага!
И вобще хуже Borland'а, только Microsoft пишет!
...
Рейтинг: 0 / 0
29.08.2003, 12:18
    #32251174
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Я не согласен. В исходных кодах VCL часто встречаются такие проверки.

Это только там, где есть уверенность что указатель на несозданный объект - nil. Таких случаев только 3:
1. Указатель - поле класса и используется первый раз. При создании экземпляра класса поля инициализируются. Поля-указатели, в частности, выстаставляются в nil.
2. Указатель - глобальная переменная и используется первый раз. Глобальные переменные тоже инициализируются в nil.
3. Если есть уверенность, что после уничтожения объекта указатель был выставлен в nil.

Но боже вас упаси использовать такие проверки для локальных переменных.
...
Рейтинг: 0 / 0
29.08.2003, 13:20
    #32251310
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
>> Но боже вас упаси использовать такие проверки для локальных переменных.

System.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
procedure FinalizeUnits;
var
  Count: Integer;
  Table: PUnitEntryTable;
  P: Pointer;
begin
  if InitContext.InitTable = nil then
    exit;
  Count := InitContext.InitCount;
  Table := InitContext.InitTable^.UnitInfo;
{$IFDEF LINUX}
  Inc(Cardinal(Table), InitContext.Module^.GOT);
{$ENDIF}
  try
    while Count >  0  do
    begin
      Dec(Count);
      InitContext.InitCount := Count;

      P := Table^[Count].FInit;
      
    if Assigned(P) then  {< -------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
 

      begin
{$IFDEF LINUX}
        CallProc(P, InitContext.Module^.GOT);
{$ENDIF}
{$IFDEF MSWINDOWS}
        TProc(P)();
{$ENDIF}
      end;
    end;
  except
    FinalizeUnits;  { try to finalize the others }
    raise;
  end;
end;

end;


P -локальная

По-моему надо просто аккуратно следить за всеми указателями и тогда проблем не возникнет
...
Рейтинг: 0 / 0
29.08.2003, 15:52
    #32251678
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
> P := Table^[Count].FInit;
> if Assigned(P) then {<-------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}

Обрати внимание на предыдущую строчку. Там в P заносится значение из поля класса, соответственно, либо nil, либо инициализировано. Поэтому Assigned в данном случае можно использовать, ибо укладывается в случай (1) и случай (3) из тех, что я описал.
...
Рейтинг: 0 / 0
29.08.2003, 15:59
    #32251698
sv
sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить что переменная инициализирована?
Согласен.

Просто меня сравнение с забором позабавило. (WO)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить что переменная инициализирована? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]