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

Но я бы написал так
if Assigned(variable) then...
...
Рейтинг: 0 / 0
Как проверить что переменная инициализирована?
    #32250679
Oleg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо работает вроде... я и сам так думал... но правильно ли так проверять
...
Рейтинг: 0 / 0
Как проверить что переменная инициализирована?
    #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
Как проверить что переменная инициализирована?
    #32250691
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно так проверять. Никто и ничто не гарантирует, что указатель во всех случаях на несозданный объект - nil. Следовательно, Access Violation может появиться, причем в самый неприятный момент.

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

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

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

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

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

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

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

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


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