Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Constant expression violates subrange bounds (nrComm)


Страницы:   1 2

Kolan ©   (2010-04-01 10:34:00) 

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

В компоненте 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.


evvcom   (2010-04-08 09:43:00) [1]

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

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

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


Anatoly Podgoretsky   (2010-04-07 20:32:00) [2]

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

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


evvcom   (2010-04-07 11:23:00) [3]


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

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


Anatoly Podgoretsky   (2010-04-01 13:50:00) [4]

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

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


Anatoly Podgoretsky   (2010-04-01 13:49:00) [5]

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

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


Anatoly Podgoretsky   (2010-04-01 13:48:00) [6]

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

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


Leonid Troyanovsky   (2010-04-01 13:43:00) [7]


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

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

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

--
Regards, LVT.


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

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

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


Kolan   (2010-04-01 13:08:00) [9]

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

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


Leonid Troyanovsky   (2010-04-01 12:53:00) [10]


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

>  case (Sender as TComponent).Tag of

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

--
Regards, LVT.


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

тебе вообще надо только младшие биты анализировать
то есть
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:
   ...


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

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" (с) справка


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

Приведи значение констант, видимо все таки они у тебя 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;


Anatoly Podgoretsky   (2010-04-01 12:03:00) [14]

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

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


Anatoly Podgoretsky   (2010-04-01 12:01:00) [15]

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

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


brother   (2010-04-01 11:32:00) [16]

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

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


Kolan   (2010-04-01 11:30:00) [17]

Cardinal?

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


Kolan   (2010-04-01 11:14:00) [18]

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


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

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


Leonid Troyanovsky   (2010-04-01 10:48:00) [20]


> Kolan ©   (01.04.10 10:34)  

> function GetSetupError(code:integer):string;

Cardinal?

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

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

--
Regards, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо