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

Вниз

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

Наверх




Память: 0.52 MB
Время: 0.009 c
11-1238343292
codemaster
2009-03-29 20:14
2011.10.30
KOL и Классы


15-1309505832
Andy BitOff
2011-07-01 11:37
2011.10.30
Поправка к вакансии


15-1309811398
Юрий
2011-07-05 00:29
2011.10.30
С днем рождения ! 5 июля 2011 вторник


15-1309724999
Юрий
2011-07-04 00:29
2011.10.30
С днем рождения ! 4 июля 2011 понедельник


1-1270103659
Kolan
2010-04-01 10:34
2011.10.30
Constant expression violates subrange bounds (nrComm)