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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.009 c
2-1299047111
filimonic
2011-03-02 09:25
2011.06.05
Re


15-1298022297
TUser
2011-02-18 12:44
2011.06.05
Про пятивалентный углерод


1-1255806622
minomorf
2009-10-17 23:10
2011.06.05
Как в TSynEdit сделать подсветку строки (как при ошибке)


2-1298670826
TStas
2011-02-26 00:53
2011.06.05
Как у Дельфей переставить папку по умолчанию?


2-1298609942
maxefficiently
2011-02-25 07:59
2011.06.05
RAR Component