powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
25 сообщений из 25, страница 1 из 1
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854227
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую.
Вот такой код, в одном из модулей MFPack (MfPack.MfpUtils).
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  _MFARGB = record
	rgbBlue: Byte;
	rgbGreen: Byte;
	rgbRed: Byte;
	rgbAlpha: Byte;
  end;
  MFARGB = _MFARGB;

procedure CopyTColorToMFARGB(const cColor: TColor; out argb: MFARGB);
begin
  argb.rgbRed   := (cColor AND $FF);
  argb.rgbGreen := (cColor shr 8) AND $FF;
  argb.rgbBlue  := (cColor shr 16) AND $FF;
  argb.rgbAlpha := (cColor shl 24) AND $FF; //здесь ошибка
end;


На последней строчке при компиляции вылетает
[dcc32 Error] MfPack.MfpUtils.pas(882): E1012 Constant expression violates subrange bounds
Это в Delphi XE3. В Delphi 10.3.1 CE ошибка не возникает. Кто-то знает или есть мысли, почему может быть так?
И что нужно сделать, чтобы в XE3 ошибка не возникала?

TColor в обеих версиях определен одинаково. Флажок в опциях компилятора Range Checking снят и там, и там (Но это, правда, как написано Runtime errors). Опция {R-} тоже есть в модуле. Я так понимаю/предполагаю, что cColor shl 24 видимо выходит за пределы integer, поэтому ошибка. Но почему это не дает ошибку в Delphi 10.3.1 ?
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854230
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, я эту функцию не использую, при создании формы вызывается функция
Код: pascal
1.
MFStartup(MF_VERSION, MFSTARTUP_LITE);

и всё.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854237
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

Там ошибка в коде: shl -> shr
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854243
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,
да, я уже сам заметил.
Исправил, но теперь в другом месте аналогичная ошибка.
Код: pascal
1.
  srd.rgbtRed:= byte(src shl 16);

вот тут.
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854247
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Интересно всё-таки, почему в новой Delphi компилируется без ошибок.
Потому что это не ошибка.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854250
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Интересно всё-таки, почему в новой Delphi компилируется без ошибок.
Потому что это не ошибка.Переформулирую вопрос, почему в версии XE3 компиляция не происходит и выдается сообщение об ошибке (привел выше), а в версии 10.3.1 компилируется?
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854257
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

Потому что ситуацию можно трактовать двояко. Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). Более свежий компилятор стал более толерантным :), считает, что дебаггер не просто так в поставку входит и им нужно пользоваться
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854268
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62,

... Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). ...Не совсем так. Он сообщает, что
dcc32[dcc32 Error] MfPack.MfpUtils.pas(911): E1012 Constant expression violates subrange boundsПримерно: константное выражение выходит за границы диапазона.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854292
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

так в чем проблема то? Ну выдает XE3 ошибку, и что дальше? На момент реализации XE3 у разработчиков делфи было одно видение ситуации. К моменту выхода 10.3 видение у разработчиков делфи изменилось. Как писали выше, видение стало более толератным, соответственно компилятор реализовали в более расширенном режиме.

Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854293
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3
Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854298
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2так в чем проблема то? Ну выдает XE3 ошибку, и что дальше? На момент реализации XE3 у разработчиков делфи было одно видение ситуации. К моменту выхода 10.3 видение у разработчиков делфи изменилось.
...
Вообще у разработчиков MFPack написано:
Latest release:
---------------------
MfPack
Version X 2.6.1 Prodigy release.
Delphi XE2 up to and including Delphi 10.3.1.
Ну ладно, спасибо за комментарии.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854304
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)
Так он ругается на код, который всё равно переписывать нужно...
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854308
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)
Так он ругается на код, который всё равно переписывать нужно...Не только. Я уже сделал, что компилируется в XE3. Пока добавляю код шаг за шагом вот в этом примере
https://docs.microsoft.com/ru-ru/windows/win32/medfound/how-to-play-unprotected-media-files
Хочу посмотреть, что такое вот это Media Foundation и м.б. сделать одну штуку с её помощью.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854318
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Не только.
Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854321
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Не только.
Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.Там еще было.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854324
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Не только.
Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.Да, там функция, где вторая ошибка, похоже неправильная. Вроде известный пакет, давно есть, странно даже, если такие ошибки. И на форуме у них на sourceforge тоже пока кажется никто не написал про это.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854325
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Там еще было
Покажешь?
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854327
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
насчёт известный, это я спутал с DSPack.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854329
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Примерно: константное выражение выходит за границы диапазона.
Да, он видит какие-то приседания результат которых таки выходит за рамки допустимых значений. Трактовать можно и так.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854330
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Там еще было
Покажешь?Лень. Я уже исправил, теперь искать, где это в коде было. Было три или 4 места в том файле. Если интересно, можешь сам скачать и посмотреть, как компилируется.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854335
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Лень. Я уже исправил, теперь искать, где это в коде было. Было три или 4 места в том файле.
Тоже сдвиги?
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854336
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeys62Там еще было
Покажешь?Там 1 - ое где вместо shr - shl, потом два места, где автор по-моему неправильно преобразует RGB - сдвиги в обратном порядке. И одно место вот такое
Код: pascal
1.
srd.rgbReserved:= byte(src shl 24); // this should always be 0!

Это хотя странно выглядит, но формально не ошибка, действительно будет 0.

Это единственный известный мне перевод для Дельфи новых API для работы с мультимедиа и я уже пользовался им раньше, более старой версией. https://www.sql.ru/forum/1181782/otkuda-vzyat-zvukovoy-potok
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854597
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, похоже, что дело в каких-то опциях проекта, надо посмотреть. Потому что в тестовом проекте в той же XE3 всё сдвигается без проблем и сообщений об ошибке.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
const
  Int1 = $ABCD1234;

procedure TMainForm.btnActClick(Sender: TObject);
begin
  Memo.Lines.Clear;
  Memo.Lines.Add(IntToHex(Int1, 4));
  Memo.Lines.Add(IntToHex(Int1 shl 8, 4));
  Memo.Lines.Add(IntToHex(Int1 shl 16, 4));
  Memo.Lines.Add(IntToHex(Int1 shl 24, 4));
  Memo.Lines.Add(IntToHex(Int1 shl 32, 4));

  Memo.Lines.Add('------------------');

  Memo.Lines.Add(IntToHex(byte(Int1), 1));
  Memo.Lines.Add(IntToHex(byte(Int1 shl 8), 1));
  Memo.Lines.Add(IntToHex(byte(Int1 shl 16), 1));
  Memo.Lines.Add(IntToHex(byte(Int1 shl 24), 1));
  Memo.Lines.Add(IntToHex(byte(Int1 shl 32), 1));
end;


Выводит:
ABCD1234
CD123400
12340000
34000000
ABCD1234
------------------
34
0
0
0
34
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39854609
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, если объявить переменную целого типа или типа TColor, то будет сообщение об ошибке, такое же.
...
Рейтинг: 0 / 0
E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
    #39924754
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забросил всё это дело, на днях вернулся к нему и наткнулся на неожиданную ошибку (точнее - наткнулся давно, но как раз тогда и забросил).
Вызываю IAudioClient.GetService, получаю access violation.
Код: pascal
1.
function GetService(riid: TGUID; out ppInterface: IUnknown): HResult; stdcall;


Есть старый чей-то интерфейсный файл к этому же модулю, с ним всё работает, разницы не вижу. Потом присмотрелся, увидел:
Код: pascal
1.
function GetService(const riid: TGUID; out ppInterface: IUnknown): HResult; stdcall;


Второе, с const - работает.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / E1012 Constant expression violates subrange bounds - разное поведение в разных версиях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]