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

Вниз

Case label outside of rang   Найти похожие ветки 

 
no   (2008-02-23 00:19) [0]

delphi 2007 выдает такое предупреждение:

[Pascal Warning] Unit1.pas(149): W1018 Case label outside of range of case expression

на коде:

procedure TForm2.forumbrowserCommandStateChange(ASender: TObject; Command: Integer; Enable: WordBool);
begin
case Command of
   CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
   CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
   CSC_UPDATECOMMANDS: stopBtn.Enabled := Enable; // <<---
end;
end;


как будет правильно?


 
Riply ©   (2008-02-23 00:24) [1]

> [0] no   (23.02.08 00:19)
> delphi 2007 выдает такое предупреждение:
> [Pascal Warning] Unit1.pas(149): W1018 Case label outside of range of case expression

> как будет правильно?

Правильно будет перевести текст (со словариком или без).
А еще правильнее нажать F1 на предупреждении и прочитать, что написано в Help`е.


 
no   (2008-02-23 00:29) [2]

http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_events.htm


 
Германн ©   (2008-02-23 02:13) [3]


> Riply ©   (23.02.08 00:24) [1]
>
> > [0] no   (23.02.08 00:19)
> > delphi 2007 выдает такое предупреждение:
> > [Pascal Warning] Unit1.pas(149): W1018 Case label outside
> of range of case expression
>
> > как будет правильно?
>
> Правильно будет перевести текст (со словариком или без).
>
> А еще правильнее нажать F1 на предупреждении и прочитать,
>  что написано в Help`е.
>

"Дело было вечером, делать было нечего..."
Вот попробовал воспроизвести ситуацию, получил предупреждение, перевел без словаря и ни фига не понял что написано в Help`е (BDS2006).
:(


 
Германн ©   (2008-02-23 02:22) [4]

Ну то что написано в Хэлпе понял. (после пятой бутылки :)
Но почему значение $FFFFFFFF не вписывается в Integer всё равно не понял. :(


 
guav ©   (2008-02-23 02:26) [5]

> [4] Германн ©   (23.02.08 02:22)

Видимо по мнению компилятора, оно беззнаковое 4294967295, а не -1.


 
Riply ©   (2008-02-23 02:37) [6]

> [4] Германн ©   (23.02.08 02:22)
> Ну то что написано в Хэлпе понял. (после пятой бутылки :)
> Но почему значение $FFFFFFFF не вписывается в Integer всё равно не понял. :(

Ну вот.
Я ж говорила о несовместимости, а Вы: "искусство - искусство" :)

MAXDWORD запихать в integer можно, но тяжело запихать в границы от -MAXINT до MAXINT :)


 
Германн ©   (2008-02-23 02:40) [7]


> guav ©   (23.02.08 02:26) [5]
>
> > [4] Германн ©   (23.02.08 02:22)
>
> Видимо по мнению компилятора, оно беззнаковое 4294967295,
>  а не -1.
>

Просмотрел хэлпы от Д6 и BDS2006. Нигде не говорится что компилятор может трактовать Case label по-своему. Вне зависимости от типа case expression.


 
Германн ©   (2008-02-23 02:45) [8]


> Riply ©   (23.02.08 02:37) [6]
>
> > [4] Германн ©   (23.02.08 02:22)
> > Ну то что написано в Хэлпе понял. (после пятой бутылки
> :)
> > Но почему значение $FFFFFFFF не вписывается в Integer
> всё равно не понял. :(
>
> Ну вот.
> Я ж говорила о несовместимости, а Вы: "искусство - искусство"
> :)
>
> MAXDWORD запихать в integer можно, но тяжело запихать в
> границы от -MAXINT до MAXINT :)
>

Несовместимость - это не ко мне. :)
А чем  MAXDWORD отличается от "-1"? Это что компилятор такой глупый, что не может $FFFFFFFF понять как "-1"? Ведь тип case expression ему известен!


 
Германн ©   (2008-02-23 02:48) [9]

Блин. Наверно я предъявляю слишком большие требования к компилятору Дельфи. АСМ всё-таки проще.


 
Riply ©   (2008-02-23 02:48) [10]

>  [7] Германн ©   (23.02.08 02:40)
> Просмотрел хэлпы от Д6 и BDS2006. Нигде не говорится что компилятор может
> трактовать Case label по-своему. Вне зависимости от типа case expression.

А ты поробуй заменить в
forumbrowserCommandStateChange(ASender: TObject; Command: Integer; Enable: WordBool);

integer на DWord :)


 
Германн ©   (2008-02-23 03:02) [11]


> Riply ©   (23.02.08 02:48) [10]

Не. Я просто не сразу заметил, что тут выдается Warning, а не Error. Ну и плюс то, что я в основном работаю на ассемблере. Там для компилятора всегда без разницы в какой системе счисления писать константы. А тут теперь стало понятно, что компилятор предупреждает не слишком грамотных програмеров, что они может быть "скопипастили" то,  в чём они не разбираются :)


 
guav ©   (2008-02-23 03:13) [12]

Я вот в С попробовал, результат ещё интереснее
#include <stdio.h>

int main()
{
signed char i = -1;
switch (i)
{
case 0xff:
 puts("not printed");
 break;
case 0xffffffff:
 puts("printed");
 break;
}
return 0;
}

Компилится без ворнингов, пишется второе, char 1 байт. если char unsigned, писаться будет первое.


 
Германн ©   (2008-02-23 03:39) [13]


> guav ©   (23.02.08 03:13) [12]
>
> Я вот в С попробовал, результат ещё интереснее

А какой компилятор С ты пользовал?
Если мне не изменяет мой склероз, ты тоже работаешь (работал) с контроллерами.


 
no   (2008-02-23 09:30) [14]

так, а по сути вопроса кто скажет чего?
я ведь не могу менять данные типы :

(ASender: TObject; Command: Integer; Enable: WordBool);


 
Anatoly Podgoretsky ©   (2008-02-23 11:24) [15]


> Но почему значение $FFFFFFFF не вписывается в Integer всё
> равно не понял.

Потому что MaxInt = $7FFFFFFF


 
Anatoly Podgoretsky ©   (2008-02-23 11:28) [16]


> как будет правильно?

Правильно будет так:

if Command = CSC_NAVIGATEBACK then BackBtn.Enabled := Enable
else if CSC_NAVIGATEFORWARD then forwBtn.Enabled := Enable
else if CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;

или

case Command of
  CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
  CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
  else stopBtn.Enabled := Enable;
end;


 
Anatoly Podgoretsky ©   (2008-02-23 11:30) [17]


> Это что компилятор такой глупый

Это не компилятор глупый, он как раз очень умный, в отличии от программиста.


 
no   (2008-02-23 19:37) [18]


>
> Правильно будет так:
>
> if Command = CSC_NAVIGATEBACK then BackBtn.Enabled := Enable
> else if Command = CSC_NAVIGATEFORWARD then forwBtn.Enabled := Enable
> else if Command = CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;
>
>


два новых предупреждения:

[Pascal Warning] Unit1.pas(248): W1021 Comparison always evaluates to False
[Pascal Warning] Unit1.pas(248): W1023 Comparing signed and unsigned types - widened both operands


 
Anatoly Podgoretsky ©   (2008-02-23 19:41) [19]

И которая строка 248


 
no   (2008-02-24 00:13) [20]


> И которая строка 248


эта:
else if Command = CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;

а с этой конструкцией предупреждений нет, но в рантайм кнопка "стоп" всегда недоступна...

case Command of
 CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
 CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
 else stopBtn.Enabled := Enable;
end;


:(


 
guav ©   (2008-02-24 00:32) [21]

> [13] Германн ©   (23.02.08 03:39)

Нет. И не работал.


> [14] no   (23.02.08 09:30)

Явный cas спасёт
Integer(CSC_UPDATECOMMANDS): stopBtn.Enabled := Enable;


 
guav ©   (2008-02-24 00:33) [22]

> [13] Германн ©   (23.02.08 03:39)

Компилятор от VS2005.


 
Германн ©   (2008-02-24 00:36) [23]


> guav ©   (24.02.08 00:32) [21

Опередил про явный cast. Только я хотел предложить:
case DWord(Command) of


 
Anatoly Podgoretsky ©   (2008-02-24 00:54) [24]

Про приведение уже написали, или к Integer или к dWord
А второй вариант наверно потому не работае, что у тебя поступают только CSC_NAVIGATEBACK и CSC_NAVIGATEFORWARD
Поскольку нет причин не работать.
Это проблема смешивания знаковых и беззнаковых операндов.


 
no   (2008-02-24 01:02) [25]


> case DWord(Command) of


да, warnings нет, но кнопка Стоп по прежнему недоступна в рантайм


 
Anatoly Podgoretsky ©   (2008-02-24 01:06) [26]

> no  (24.02.2008 01:02:25)  [25]

Я тебе уже написал, что у тебя параметр принимает только два значения.


 
Германн ©   (2008-02-24 01:11) [27]


> no   (24.02.08 01:02) [25]
>
>
> > case DWord(Command) of
>
>
> да, warnings нет, но кнопка Стоп по прежнему недоступна
> в рантайм
>

Проверяй отладчиком. Приходит ли  CSC_UPDATECOMMANDS и если приходит, то какое значение у праметра Enable.


 
Anatoly Podgoretsky ©   (2008-02-24 13:03) [28]

> Германн  (24.02.2008 01:11:27)  [27]

Или не приходит, по приведеному коду, или потом где то кнопке присваивается другое значение, по не приведеному.
Я бы сделал отладочный вывод куда ни будь на форму.
А для проверки второй теории - присвоил бы значение Command перед case.



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.018 c
15-1202565066
vrem_
2008-02-09 16:51
2008.03.23
Фото участников форума, самые новые


2-1203397094
Ultimate
2008-02-19 07:58
2008.03.23
Компонент WebBrowser


2-1203511255
Ultimate
2008-02-20 15:40
2008.03.23
Эффекты появления


2-1203878639
NieL
2008-02-24 21:43
2008.03.23
Transparency


11-1186243874
Vladimir Kladov
2007-08-04 20:11
2008.03.23
Версия 2.76