Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про warning [D6]


Суслик ©   (2005-11-10 17:06:00) 

Как вы думаете, почему delphi выдает в случае этого кода warning "items might not have been initialized".

type
  TMyDynArray =  array of integer;

function AnotherSomeMethod(): TMyDynArray;
begin
  SetLength(Result, 2);
  Result[0] := 0;
  Result[1] := 1;
end;

function SomeFlag(): Boolean;
begin
  Result := True;
end;

procedure Some();
var
  Items: TMyDynArray;
begin
  if SomeFlag() then
  begin
     Items := AnotherSomeMethod();
     ShowMessage(inttostr(items[0]));
  end;
end;


GuAV   (2005-11-10 20:04:00) [1]

Код [0] можно упростить с сохранением варнинга:

type
 TMyDynArray =  array of integer;

procedure Some();
var
 Items: TMyDynArray;
begin
end;


Anatoly Podgoretsky   (2005-11-10 19:53:00) [2]

Ты может и не догадался, но сумел всех запутать динамическим массивом :-)


Суслик   (2005-11-10 19:47:00) [3]

гениально!
как же я не догадался!


Anatoly Podgoretsky   (2005-11-10 19:46:00) [4]

Не из-за того, что динамический массив, а из-за SomeFlag
Если результат будет false, то Items действительно будет не проинициализирован

 if SomeFlag() then
 begin
    Items := AnotherSomeMethod();
    ShowMessage(inttostr(items[0]));
 end;


Суслик   (2005-11-10 19:19:00) [5]


> [12] Плохиш ©   (10.11.05 19:15)

Ты компилятор прямо-таки человеческими качествами наделяешь :)
Умный очень по твоему..


Суслик   (2005-11-10 19:18:00) [6]

ну и что?
усе равно если SomeFlag = false, то items в SOme2 так и останется неиницилизированным.

Кстати в delphi2005 никаких warningoв (как и должно быть).

Мое мнение - глючок delphi6.


Плохиш   (2005-11-10 19:15:00) [7]


> Суслик ©   (10.11.05 18:47) [11]
> Приведу еще раз вопрос (в несколько другой форме)
>
> Может ли кто-то объяснить почему в Some есть warning, а
> в Some2 - нет?

Потому что в Some ничто явно не говорит компилятору, что будет создан элемент с индексом 0 у items.


Суслик   (2005-11-10 18:47:00) [8]

Приведу еще раз вопрос (в несколько другой форме)

Может ли кто-то объяснить почему в Some есть warning, а в Some2 - нет?

procedure Some();
var
  Items: TMyDynArray;
begin
  if SomeFlag() then
  begin
     Items := AnotherSomeMethod();
     ShowMessage(inttostr(items[0]));
  end;
end;

procedure Some2();
var
  Items: TMyDynArray;
begin
  if SomeFlag() then
  begin
     SetLength(Items, 2);
     Items[0] := 0;
     Items[1] := 1;
     ShowMessage(inttostr(items[0]));
  end;
end;


Суслик   (2005-11-10 18:10:00) [9]

Блин, Олег, извини!!!


Суслик   (2005-11-10 17:54:00) [10]

Скажу тебе больше, Женя, что

procedure Some2();
var
  Items: TMyDynArray;
begin
  if SomeFlag() then
  begin
     SetLength(Items, 2);
     Items[0] := 0;
     Items[1] := 1;
     ShowMessage(inttostr(items[0]));
  end;
end;


Тоже не вызывает warning


Ega23   (2005-11-10 17:47:00) [11]


> Суслик ©   (10.11.05 17:30) [4]
>
> Компилятор не ругается же есть я напишу так


Могу ошибаться, но мне кажется, что здесь дело как раз в дин.массиве. Причём в том, что ты выше по тексту привёл его типизацию.
Такой код у тебя удивления вызывает?

procedure Some();
var
 Items: array of integer;
begin
 if SomeFlag() then
 begin
   SetLength(Items, 2);
   Items[0] := 0;
   Items[1] := 1;

    ShowMessage(inttostr(items[0]));
 end;
end;


Суслик   (2005-11-10 17:43:00) [12]

а у строк нет файнализации?


Игорь Шевченко   (2005-11-10 17:41:00) [13]

Все дело в волшебных пузырьках. А именно, в данном случае, в том, что в коде, где есть Warning, вызывается финализация динамического массива.


Джо   (2005-11-10 17:35:00) [14]

Ну, компилятор же не Нострадамус предсказывать - выполнятся твои if'ы или нет.


Суслик   (2005-11-10 17:30:00) [15]

Компилятор не ругается же есть я напишу так

procedure Some();
var
 Items: integer;
begin
 if SomeFlag() then
 begin
    Items := AnotherSomeMethod();
    ShowMessage(inttostr(items));
 end;
end;


или так

procedure Some();
var
 Items: String;
begin
 if SomeFlag() then
 begin
    Items := AnotherSomeMethod();
    ShowMessage(items);
 end;
end;


Суслик   (2005-11-10 17:28:00) [16]


> Items в результате окажется не инициализированным

И?  Кому какое дело.
ну вообще-то items всегда nil.

ты можешь привести хоть один конкретныйсценарий, когда в данном коденезаданность items может на что-то негативно повлиять?


Ega23   (2005-11-10 17:22:00) [17]


> if SomeFlag() then
>   begin
>      Items := AnotherSomeMethod();
>      ShowMessage(inttostr(items[0]));
>   end;


Добавь else, и всё нормально будет...
Или перед if явно проинициализируй Items


Digitman   (2005-11-10 17:11:00) [18]


> почему


да потому что компилятору по барабану. что в ран-тайм у тебя происходит в теле ф-ции SomeFlag() - он, компилятор, всего лишь предупреждает тебя, что if-условие в ран-тайм может быть и не истинным, посему тело begin..end-блока не выполнится и посему Items в результате окажется не инициализированным


Наверх

Титульная страница Поиск, карта сайта Написать письмо