Текущий архив: 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.48 MB
Время: 0.04 c