![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Constant expression violates subrange bounds (nrComm)
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.