Форум: "Основная";
Текущий архив: 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