![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про 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 в результате окажется не инициализированным