Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
2-1204115259
Darvin
2008-02-27 15:27
2008.03.23
TCanvas и регионы


15-1202831227
Nucer
2008-02-12 18:47
2008.03.23
Лицензирование Windows 2003 Server Standard


2-1203529658
voe
2008-02-20 20:47
2008.03.23
работа с координатами.


15-1202580316
В,алекс
2008-02-09 21:05
2008.03.23
Виста / D7


2-1203659963
АИК
2008-02-22 08:59
2008.03.23
PostMessage





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