Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Вопрос про warning   Найти похожие ветки 

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

Как вы думаете, почему 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;


 
Digitman ©   (2005-11-10 17:11) [1]


> почему


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


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


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


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


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


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

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

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


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

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

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:35) [5]

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


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

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


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

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


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


> Суслик ©   (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:54) [9]

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

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


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

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


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

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

Может ли кто-то объяснить почему в 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 19:15) [12]


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

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


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

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

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

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


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


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

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


 
Anatoly Podgoretsky ©   (2005-11-10 19:46) [15]

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

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


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

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


 
Anatoly Podgoretsky ©   (2005-11-10 19:53) [17]

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


 
GuAV ©   (2005-11-10 20:04) [18]

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

type
 TMyDynArray =  array of integer;

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
3-1130058026
darklord
2005-10-23 13:00
2005.12.11
update тока одной записи


3-1130236727
syte_ser78
2005-10-25 14:38
2005.12.11
Какой компонент правильно использывать?


8-1115787018
carmen
2005-05-11 08:50
2005.12.11
информация о видео файле


1-1131449717
Lera
2005-11-08 14:35
2005.12.11
Закрытие формы.


6-1125481501
Nikolay Kislov
2005-08-31 13:45
2005.12.11
Как обойти конфликт между IP адресами?