Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.035 c
4-1128428489
yanker
2005-10-04 16:21
2005.12.11
размер в памяти


2-1132907236
JTAG
2005-11-25 11:27
2005.12.11
Господа подскажите как при открытии формы сделать


2-1131801033
psa247
2005-11-12 16:10
2005.12.11
ShellListView


14-1132530722
SVASH
2005-11-21 02:52
2005.12.11
USBPRINT.SYS


3-1130309673
Thor_
2005-10-26 10:54
2005.12.11
Отображение вставки новой записи в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский