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

Вниз

Constant expression violates subrange bounds (nrComm)   Найти похожие ветки 

 
Kolan ©   (2010-04-01 10:34) [0]

Здравствуйте!

В компоненте nrComm есть много таких констант:


...
 ERROR_NO_SUCH_DEVINST                    = APPLICATION_ERROR_MASK or ERROR_SEVERITY_ERROR or $20B;
...


И есть функция, которая их использует:

function GetSetupError(code:integer):string;
begin
 Result := "#" + IntToHex(code, 8) + ".";
 case code of
   ERROR_NO_SUCH_DEVINST:
     Result := Result + " Device not found.";
   ERROR_NO_AUTHENTICODE_CATALOG,
   ERROR_AUTHENTICODE_DISALLOWED,
   ERROR_AUTHENTICODE_TRUSTED_PUBLISHER,
   ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED,
   ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED,
   ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH,
   ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE:
     Result := Result + " Driver authentication error.";
 end;

end;


При компиляции воявляется ворнинг на каждую строку кейса: [DCC Warning] nrwin32di.pas(836): W1012 Constant expression violates subrange bounds

Странно то, что в тестовом проекте (только форма и накиданные на неё компоненты) выдается только этот ворнинг, а в рабочем проекте (где компонент не на форме, а создается в коде) к каждому ворнингу добавляется еще и ошибка: [DCC Error] nrwin32di.pas(836): E2026 Constant expression expected

Вопросы:
1. Почему возникает ворнинг?
2. Почему ошибка возникает только в рабочем проекте?
3. Как сделатьтак, чтобы компилилось?

Компонент лицензионный, но поддержка говорит, что у них все хорошо.

Конмпилил в D2009 и D2010.


 
Kolan ©   (2010-04-01 10:35) [1]

Да, константы в константах объявлены так:

 APPLICATION_ERROR_MASK        = $20000000;
 ERROR_SEVERITY_SUCCESS        = $00000000;
 ERROR_SEVERITY_INFORMATIONAL  = $40000000;
 ERROR_SEVERITY_WARNING        = $80000000;
 ERROR_SEVERITY_ERROR          = $C0000000;


 
Дмитрий Белькевич   (2010-04-01 10:47) [2]


> еще и ошибка: [DCC Error] nrwin32di.pas(836): E2026 Constant
> expression expected


На какой строке пишет?


 
Leonid Troyanovsky ©   (2010-04-01 10:48) [3]


> Kolan ©   (01.04.10 10:34)  

> function GetSetupError(code:integer):string;

Cardinal?

> а создается в коде) к каждому ворнингу добавляется еще и
> ошибка

Включай модуль с описанием констант.

--
Regards, LVT.


 
Kolan ©   (2010-04-01 11:00) [4]

На какой строке пишет?
На каждой из констант вроде ERROR_NO_SUCH_DEVINST.


 
Kolan ©   (2010-04-01 11:14) [5]

Включай модуль с описанием констант.
Куда? В модуль где испльзую остальные компоненты? Включил. Не помогает.


 
Kolan ©   (2010-04-01 11:30) [6]

Cardinal?

Сardinal помогло, странно только как у поддержки работает.


 
brother ©   (2010-04-01 11:32) [7]

> Сardinal помогло, странно только как у поддержки работает.

так видимо и работает: по-секрету или для избранных!)


 
Anatoly Podgoretsky ©   (2010-04-01 12:01) [8]

> Kolan  (01.04.2010 10:35:01)  [1]

Ни одной константы не используется в коде.


 
Anatoly Podgoretsky ©   (2010-04-01 12:03) [9]

> Kolan  (01.04.2010 11:30:06)  [6]

Приведи значение констант, видимо все таки они у тебя Cardinal


 
Kolan ©   (2010-04-01 12:13) [10]

Приведи значение констант, видимо все таки они у тебя Cardinal

Я же вроди привел.

Например
ERROR_NO_SUCH_DEVINST                    = APPLICATION_ERROR_MASK or ERROR_SEVERITY_ERROR or $20B;

Используется в коде:
function GetSetupError(code:integer):string;
begin
Result := "#" + IntToHex(code, 8) + ".";
case code of
  ERROR_NO_SUCH_DEVINST:
    Result := Result + " Device not found.";
  ERROR_NO_AUTHENTICODE_CATALOG,
  ERROR_AUTHENTICODE_DISALLOWED,
  ERROR_AUTHENTICODE_TRUSTED_PUBLISHER,
  ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED,
  ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED,
  ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH,
  ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE:
    Result := Result + " Driver authentication error.";
end;

end;


Константы, которые используется в её вычислении.

APPLICATION_ERROR_MASK        = $20000000;
ERROR_SEVERITY_SUCCESS        = $00000000;
ERROR_SEVERITY_INFORMATIONAL  = $40000000;
ERROR_SEVERITY_WARNING        = $80000000;
ERROR_SEVERITY_ERROR          = $C0000000;


 
Игорь Шевченко ©   (2010-04-01 12:28) [11]

Kolan ©   (01.04.10 12:13) [10]

procedure TForm1.Button1Click(Sender: TObject);
begin
 case (Sender as TComponent).Tag of
 $C0000001:
   ShowMessage("$C0000001");
 $C0000010:
   ShowMessage("$C0000010");
 $C0000100:
   ShowMessage("$C0000100");
 $C0001000:
   ShowMessage("$C0001000");
 end;
end;


[Pascal Warning] main.pas(29): W1012 Constant expression violates subrange bounds

"This error message occurs when the compiler can determine that a constant is outside the legal range. This can occur for instance if you assign a constant to a variable of subrange type" (с) справка

"The case statement may provide a readable alternative to deeply nested if conditionals. A case statement has the form
case selectorExpression of
  caseList1: statement1;
    ...
  caseListn: statementn;
end
where selectorExpression is any expression of an ordinal type smaller than 32 bits " (с) справка


 
Игорь Шевченко ©   (2010-04-01 12:33) [12]

тебе вообще надо только младшие биты анализировать
то есть
if (foo and ERROR_SEVERITY_ERROR) = ERROR_SEVERITY_ERROR then
 case foo and (not ERROR_SEVERITY_ERROR) of
 ERROR_NO_SUCH_DEVINST and not ERROR_SEVERITY_ERROR:
   ...


 
Leonid Troyanovsky ©   (2010-04-01 12:53) [13]


> Игорь Шевченко ©   (01.04.10 12:28) [11]

>  case (Sender as TComponent).Tag of

case Cardinal((Sender as TComponent).Tag) of

--
Regards, LVT.


 
Kolan ©   (2010-04-01 13:08) [14]

«any expression of an ordinal type smaller than 32 bits »

Так C0000001 же вроде вкладыается в 32 бита.


 
Игорь Шевченко ©   (2010-04-01 13:13) [15]

Leonid Troyanovsky ©   (01.04.10 12:53) [13]

век живи, век учись, спасибо за науку :)


 
Leonid Troyanovsky ©   (2010-04-01 13:43) [16]


> Игорь Шевченко ©   (01.04.10 13:13) [15]

> век живи, век учись, спасибо за науку :)

Да ладно, неужели нечто подобное не писал:
case WaitForSingleObject(..) of
 WAIT_FAILED: ..;

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-04-01 13:48) [17]

> Kolan  (01.04.2010 12:13:10)  [10]

Ты привел не полностью, строку с ERROR_NO_SUCH_DEVINST вроде не приводил.
Вот это ERROR_SEVERITY_ERROR          = $C0000000; превышает интервал для Integer, так что Cardinal правильно. Кстати это хорошо, что у тебя в компиляторе включена проверка диапазонов, а то бы возможно в рантайм пришлось искать проблемы.


 
Anatoly Podgoretsky ©   (2010-04-01 13:49) [18]

> Kolan  (01.04.2010 13:08:14)  [14]

А должно быть меньше


 
Anatoly Podgoretsky ©   (2010-04-01 13:50) [19]

> Kolan  (01.04.2010 13:08:14)  [14]

Просто справка с ошибкой.


 
evvcom ©   (2010-04-07 11:23) [20]


> Так C0000001 же вроде вкладыается в 32 бита

Вкладывается, только как беззнаковое. И integer вкладывается, только уже как знаковое. При приведении типов беззнакового C0000001 к знаковому необходим еще 1 бит, т.е. получаем минимум 33 бита, а они уже в Integer не укладываются.


 
Anatoly Podgoretsky ©   (2010-04-07 20:32) [21]

> evvcom  (07.04.2010 11:23:20)  [20]

Нужен не один бит, а тридцать два битаю


 
evvcom ©   (2010-04-08 09:43) [22]

Ну вообще-то я и написал

> минимум 33 бита

а то, что система в этом случае будет требовать количество бит, равное степени двойки, так это и ежу должно быть понятно :)



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

Форум: "Основная";
Текущий архив: 2011.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
15-1309877734
oleg1963lora
2011-07-05 18:55
2011.10.30
Как назвать UltraISO, Daemon и т.д. общим словом?


2-1310126824
MsGuns
2011-07-08 16:07
2011.10.30
TEdit с правым выравниванием


15-1309984198
Юрий
2011-07-07 00:29
2011.10.30
С днем рождения ! 7 июля 2011 четверг


3-1265163528
Дмитрий С
2010-02-03 05:18
2011.10.30
Несколько строк в одну (*.mdb)


15-1309954783
dest81
2011-07-06 16:19
2011.10.30
select, sum как правильней





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