Форум: "Прочее";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
ВнизVariable state might not have been initialized Найти похожие ветки
← →
И. Павел © (2011-02-15 16:18) [0]Странно, но такой код приводит к предупреждению компилятора: "Variable "state" might not have been initialized". Это просто глюк, или state действительно может принимать еще какие-то значения?
TEvType = (EvAlreadyProcessed, EvNoDoc, EvEditing);
...
var state: integer;
...
begin
case Ev of
EvEditing: state := 3;
EvAlreadyProcessed: state := 4;
EvNoDoc: state := 5;
end;
ADOQ.Active := false;
ADOQ.SQL.Text := "UPDATE ... SET state = " + IntToStr(state) + ...
← →
И. Павел © (2011-02-15 16:19) [1]Ev: TEvType
← →
icelex © (2011-02-15 16:23) [2]дефолтную ветку пропиши
← →
Юрий Зотов © (2011-02-15 16:24) [3]
case Ev of
EvEditing: state := 3;
EvAlreadyProcessed: state := 4;
else state := 5;
end;
← →
clickmaker © (2011-02-15 16:27) [4]компилятору лень проверять, все ли возможные значения ты перебрал в case
← →
И. Павел © (2011-02-15 16:33) [5]icelex ©, Юрий Зотов ©, clickmaker © спасибо.
Хотя, по моему, зря Delphi предупреждение в этом случае пишет: если поставить else в case а потом добавить в TEvType новое значение, то блок case можно забыть поправить, т.к. предупреждения компилятора не будет.
← →
Гость (2011-02-15 16:37) [6]так предпочитаю писать
state := 5;
case Ev of
EvEditing: state := 3;
EvAlreadyProcessed: state := 4;
end;
ADOQ.Active := false;
ADOQ.SQL.Text := "UPDATE ... SET state = :state"
param() := state ;
если нужен state дальше, если нет
ADOQ.Active := false;
ADOQ.SQL.Text := "UPDATE ... SET state = :state"
param() := 5;
case Ev of
EvEditing: param() := 3;
EvAlreadyProcessed: param():= 4;
end;
← →
Гость (2011-02-15 16:37) [7]Удалено модератором
← →
Гость (2011-02-15 16:37) [8]sorry*
← →
TUser © (2011-02-15 16:41) [9]
> по моему, зря Delphi предупреждение в этом случае пишет
они там компилятор все-таки писали, а не искусственный интеллект
← →
KSergey © (2011-02-15 16:52) [10]Как вариант, почему такое предупрежение все же выдается - это оставлено на тот случай, что на самом деле переменная Ev - это как минимум байт, а значит фактически может принимать и другие значения помимо TEvType.
← →
Гость (2011-02-15 17:07) [11]с помощью
for i:= 0 to 255 do
mmo1.Lines.Add( IntToStr(i) +": i := b + 1; ")
сгенерил
var
i:Integer;
b:byte;
begin
b:= random(256);
case b of
0: i := b + 1;
1: i := b + 1;
2: i := b + 1;
..
254: i := b + 1;
255: i := b + 1;
end;
ShowMessage( inttostr(i) );
ругается все равно
← →
KSergey © (2011-02-15 17:21) [12]> Гость (15.02.11 17:07) [11]
> сгенерил
> ругается все равно
Значит все были уверены, что никто этого делать не будет, можно не проверять :)
Нет else - есть дырка.
Железно, и тестировать легко :)
← →
Юрий Зотов © (2011-02-15 17:53) [13]
> И. Павел © (15.02.11 16:33) [5]
> Хотя, по моему, зря Delphi предупреждение в этом случае
> пишет: если поставить else в case а потом добавить в TEvType
> новое значение, то блок case можно забыть поправить, т.к.
> предупреждения компилятора не будет.TEvType = (EvEditing, EvAlreadyProcessed, EvNoDoc);
...
state := Ord(Ev) + 3;
То есть - меняем объявление TEvType и все проблемы исчезают. Вместе с CASE.
По крайней мере, до тех пор, пока в эту ветку не заглянула некая одиозная личность.
:o)
← →
Омлет © (2011-02-15 18:20) [14]> И. Павел © (15.02.11 16:33) [5]
> Хотя, по моему, зря Delphi предупреждение в этом случае пишет: если поставить else в case а потом добавить в TEvType новое значение, то блок case можно забыть поправить, т.к. предупреждения компилятора не будет.
Поэтому лучше писать как-то так:
case Ev of
EvEditing: state := 3;
EvAlreadyProcessed: state := 4;
else raise Exception.Create("unknown value");
end;
← →
Игорь Шевченко © (2011-02-15 18:52) [15]
> else raise Exception.Create("unknown value");
убивать на месте
← →
Leonid Troyanovsky © (2011-02-15 19:15) [16]
> И. Павел © (15.02.11 16:18)
> TEvType = (EvAlreadyProcessed, EvNoDoc, EvEditing);
> ...
> var state: integer;
TEvType = (EvAlreadyProcessed, EvNoDoc, EvEditing);
const
state: array [TEvType] of integer = (3, 4, 5);
Отрабатывать до автоматизма.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2011-02-15 19:19) [17]
> Игорь Шевченко © (15.02.11 18:52) [15]
> убивать на месте
Это негуманно :)
--
Regards, LVT.
← →
Игорь Шевченко © (2011-02-15 19:24) [18]
> Это негуманно :)
Иногда надо использовать и негуманные методы. В воспитательных целях.
Почему убивать, написано здесь:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392
← →
Anatoly Podgoretsky © (2011-02-15 19:28) [19]> clickmaker (15.02.2011 16:27:04) [4]
Ну не то, чтобы лень, но ev может быть за пределами границы EvType
Ev := 7;
← →
Leonid Troyanovsky © (2011-02-15 19:55) [20]
> Игорь Шевченко © (15.02.11 19:24) [18]
> Иногда надо использовать и негуманные методы. В воспитательных
> целях.
В воспитательных - лучше сечь.
Убивать надо тех, кто обрабатывает класс Exception.
--
Regards, LVT.
← →
Игорь Шевченко © (2011-02-15 20:17) [21]
> Убивать надо тех, кто обрабатывает класс Exception.
И тех, кто возбуждает - тоже.
"Сегодня битва с дураками" (с)
← →
И. Павел © (2011-02-15 20:23) [22]
> Убивать надо тех, кто обрабатывает класс Exception
> И тех, кто возбуждает - тоже.
Даже страшно представить, что тогда нужно делать с теми, кто подавляет исключения без всякой обработки :)
← →
Дмитрий Белькевич (2011-02-15 20:41) [23]
> убивать на месте
Что не так? Потенциально неприсвоенная переменная - лучше?
← →
Игорь Шевченко © (2011-02-15 21:29) [24]Дмитрий Белькевич (15.02.11 20:41) [23]
> Что не так?
последующие посты также следует читать
← →
Leonid Troyanovsky © (2011-02-15 22:44) [25]
> Игорь Шевченко © (15.02.11 20:17) [21]
> И тех, кто возбуждает - тоже.
Сечь, все же, более гуманно.
Если публично, то и вполне воспитательно.
Хотя, конечно, бывает, что до греха недалеко :)
--
Regards, LVT.
← →
Leonid Troyanovsky © (2011-02-15 22:53) [26]
> И. Павел © (15.02.11 20:23) [22]
> Даже страшно представить, что тогда нужно делать с теми,
> кто подавляет исключения без всякой обработки :)
Ничего страшного. В том же лесу их и наказать.
Только мучаться будут дольше.
--
Regards, LVT.
← →
Омлет © (2011-02-16 11:34) [27]> Игорь Шевченко © (15.02.11 19:24) [18]
> Почему убивать, написано здесь:
> http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392
Это понятно. Но цель в данном случае простая - вовремя сказать программисту, что он кое-что забыл. Это исключение не надо обрабатывать в коде.
← →
DiamondShark © (2011-02-16 11:52) [28]Удалено модератором
← →
Игорь Шевченко © (2011-02-16 12:15) [29]
> вовремя сказать программисту, что он кое-что забыл
Assert
← →
Омлет © (2011-02-16 12:23) [30]Assert несколько не для того. Хотя особой разницы нет, т.к. это своего рода юнит-тест, встроенный в код.
← →
DiamondShark © (2011-02-16 12:39) [31]
> Assert несколько не для того.
Не для чего "не того"?
Assert именно для индикации попадания в состояния или пути исполнения, которые при нормальной логике выполнения не должны возникать.
← →
Юрий Зотов © (2011-02-16 12:59) [32]Удалено модератором
← →
_Юрий (2011-02-16 19:18) [33]
> Ничего страшного. В том же лесу их и наказать.
> Только мучаться будут дольше.
>
На медленном огне.
Не меньше.
← →
И. Павел © (2011-02-17 09:54) [34]>
>
> [32] Юрий Зотов © (16.02.11 12:59) [Показать текст]
> Удалено модератором
Это же какую пытку бедным программистам, генерирующим Exception-ы предложил Юрий Зотов, что его сообщение даже вырезали :)
← →
Anatoly Podgoretsky © (2011-02-17 10:18) [35]> И. Павел (17.02.2011 09:54:34) [34]
Тебе что интересно? Хочешь поговорить об этом? Ну так пригласи его в чат.
← →
KSergey © (2011-02-17 12:57) [36]> > И тех, кто возбуждает - тоже.
>
> Сечь, все же, более гуманно.
>
> Хотя, конечно, бывает, что до греха недалеко
Еще немного - и беседа примет правильное направление.
← →
asail © (2011-02-17 14:26) [37]
> И. Павел © (15.02.11 16:18)
> Это просто глюк, или state действительно может принимать
> еще какие-то значения?
Еще как может!TEvType = (EvAlreadyProcessed, EvNoDoc, EvEditing);
...
var state: integer;
b: Byte absolute Ev;
...
begin
b := 77;
case Ev of
EvEditing: state := 3;
EvAlreadyProcessed: state := 4;
EvNoDoc: state := 5;
end;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.003 c