Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.004 c
2-1298177204
Gu
2011-02-20 07:46
2011.06.05
Версия SQL клиента и сервера - узнать


15-1298022283
павел
2011-02-18 12:44
2011.06.05
ограничение использования FloatToStr и ему подобных


2-1298993690
Андрей_новичок
2011-03-01 18:34
2011.06.05
Получить путь и имя файла рисунка рабочего стола


1-1256130157
sniknik
2009-10-21 17:02
2011.06.05
Узнать позицию (индекс) текущей строчки меню TMainMenu.TMenuItem


2-1298569806
RMan
2011-02-24 20:50
2011.06.05
Прозрачное неактивное окно





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский