Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Приветствую.
Вот такой код, в одном из модулей MFPack (MfPack.MfpUtils).
  _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 ?
27 авг 19, 14:56    [21958368]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Собственно, я эту функцию не использую, при создании формы вызывается функция
MFStartup(MF_VERSION, MFSTARTUP_LITE);
и всё.
27 авг 19, 14:59    [21958374]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62,

Там ошибка в коде: shl -> shr
27 авг 19, 15:09    [21958382]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey,
да, я уже сам заметил.
Исправил, но теперь в другом месте аналогичная ошибка.
  srd.rgbtRed:= byte(src shl 16);
вот тут.
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.
27 авг 19, 15:16    [21958389]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.

Потому что это не ошибка.
27 авг 19, 15:20    [21958393]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Интересно всё-таки, почему в новой Delphi компилируется без ошибок.

Потому что это не ошибка.
Переформулирую вопрос, почему в версии XE3 компиляция не происходит и выдается сообщение об ошибке (привел выше), а в версии 10.3.1 компилируется?
27 авг 19, 15:24    [21958396]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62,

Потому что ситуацию можно трактовать двояко. Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). Более свежий компилятор стал более толерантным :), считает, что дебаггер не просто так в поставку входит и им нужно пользоваться
27 авг 19, 15:31    [21958405]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62,

... Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). ...
Не совсем так. Он сообщает, что
dcc32
[dcc32 Error] MfPack.MfpUtils.pas(911): E1012 Constant expression violates subrange bounds
Примерно: константное выражение выходит за границы диапазона.
27 авг 19, 15:42    [21958420]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 568
s62,

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

Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3
27 авг 19, 16:31    [21958453]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
asutp2
Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3

Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)
27 авг 19, 16:33    [21958454]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
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.

Ну ладно, спасибо за комментарии.
27 авг 19, 16:45    [21958460]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)

Так он ругается на код, который всё равно переписывать нужно...
27 авг 19, 17:01    [21958467]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :)

Так он ругается на код, который всё равно переписывать нужно...
Не только. Я уже сделал, что компилируется в XE3. Пока добавляю код шаг за шагом вот в этом примере
https://docs.microsoft.com/ru-ru/windows/win32/medfound/how-to-play-unprotected-media-files
Хочу посмотреть, что такое вот это Media Foundation и м.б. сделать одну штуку с её помощью.
27 авг 19, 17:10    [21958474]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Не только.

Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.
27 авг 19, 17:32    [21958487]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Не только.

Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.
Там еще было.
27 авг 19, 17:34    [21958490]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Не только.

Оба приведённых примера переписывать нужно точно - там со сдвигами напутано.
Да, там функция, где вторая ошибка, похоже неправильная. Вроде известный пакет, давно есть, странно даже, если такие ошибки. И на форуме у них на sourceforge тоже пока кажется никто не написал про это.
27 авг 19, 17:37    [21958494]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Там еще было

Покажешь?
27 авг 19, 17:37    [21958495]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
s62,
насчёт известный, это я спутал с DSPack.
27 авг 19, 17:39    [21958497]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Примерно: константное выражение выходит за границы диапазона.

Да, он видит какие-то приседания результат которых таки выходит за рамки допустимых значений. Трактовать можно и так.
27 авг 19, 17:41    [21958499]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Там еще было

Покажешь?
Лень. Я уже исправил, теперь искать, где это в коде было. Было три или 4 места в том файле. Если интересно, можешь сам скачать и посмотреть, как компилируется.
27 авг 19, 17:42    [21958500]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
s62
Лень. Я уже исправил, теперь искать, где это в коде было. Было три или 4 места в том файле.

Тоже сдвиги?
27 авг 19, 17:57    [21958506]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Kazantsev Alexey
s62
Там еще было

Покажешь?
Там 1 - ое где вместо shr - shl, потом два места, где автор по-моему неправильно преобразует RGB - сдвиги в обратном порядке. И одно место вот такое
srd.rgbReserved:= byte(src shl 24); // this should always be 0!
Это хотя странно выглядит, но формально не ошибка, действительно будет 0.

Это единственный известный мне перевод для Дельфи новых API для работы с мультимедиа и я уже пользовался им раньше, более старой версией. https://www.sql.ru/forum/1181782/otkuda-vzyat-zvukovoy-potok
27 авг 19, 17:58    [21958507]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Вообще, похоже, что дело в каких-то опциях проекта, надо посмотреть. Потому что в тестовом проекте в той же XE3 всё сдвигается без проблем и сообщений об ошибке.

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
28 авг 19, 13:11    [21959011]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Нет, если объявить переменную целого типа или типа TColor, то будет сообщение об ошибке, такое же.
28 авг 19, 13:18    [21959023]     Ответить | Цитировать Сообщить модератору
 Re: E1012 Constant expression violates subrange bounds - разное поведение в разных версиях  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1076
Забросил всё это дело, на днях вернулся к нему и наткнулся на неожиданную ошибку (точнее - наткнулся давно, но как раз тогда и забросил).
Вызываю IAudioClient.GetService, получаю access violation.
function GetService(riid: TGUID; out ppInterface: IUnknown): HResult; stdcall;

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

Второе, с const - работает.

Сообщение было отредактировано: 10 фев 20, 16:44
10 фев 20, 16:42    [22076953]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить