Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Приветствую. Вот такой код, в одном из модулей 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] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Собственно, я эту функцию не использую, при создании формы вызывается функцияMFStartup(MF_VERSION, MFSTARTUP_LITE);и всё. |
27 авг 19, 14:59 [21958374] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
s62, Там ошибка в коде: shl -> shr |
27 авг 19, 15:09 [21958382] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Kazantsev Alexey, да, я уже сам заметил. Исправил, но теперь в другом месте аналогичная ошибка. srd.rgbtRed:= byte(src shl 16);вот тут. Интересно всё-таки, почему в новой Delphi компилируется без ошибок. |
27 авг 19, 15:16 [21958389] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Потому что это не ошибка. |
||
27 авг 19, 15:20 [21958393] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
|
||||
27 авг 19, 15:24 [21958396] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
s62, Потому что ситуацию можно трактовать двояко. Более древний компилятор видит, что в результате сдвиговых операций гарантированно получается ноль, и предупреждает об этом (вероятно, считая, что ради нуля нет смысла городить огород). Более свежий компилятор стал более толерантным :), считает, что дебаггер не просто так в поставку входит и им нужно пользоваться ![]() |
27 авг 19, 15:31 [21958405] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
|
||||
27 авг 19, 15:42 [21958420] Ответить | Цитировать Сообщить модератору |
asutp2 Member Откуда: Тюмень Сообщений: 728 |
s62, так в чем проблема то? Ну выдает XE3 ошибку, и что дальше? На момент реализации XE3 у разработчиков делфи было одно видение ситуации. К моменту выхода 10.3 видение у разработчиков делфи изменилось. Как писали выше, видение стало более толератным, соответственно компилятор реализовали в более расширенном режиме. Что делать с этим? А разве непонятно? либо переписать код для совместимости, либо перейти на 10.3 |
27 авг 19, 16:31 [21958453] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Так хочется не переписывать, а галочку где-нибудь поставить, чтобы всё заработало сразу. :) |
||
27 авг 19, 16:33 [21958454] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Вообще у разработчиков MFPack написано:
Ну ладно, спасибо за комментарии. |
||||
27 авг 19, 16:45 [21958460] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Так он ругается на код, который всё равно переписывать нужно... |
||
27 авг 19, 17:01 [21958467] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
https://docs.microsoft.com/ru-ru/windows/win32/medfound/how-to-play-unprotected-media-files Хочу посмотреть, что такое вот это Media Foundation и м.б. сделать одну штуку с её помощью. |
||||
27 авг 19, 17:10 [21958474] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Оба приведённых примера переписывать нужно точно - там со сдвигами напутано. |
||
27 авг 19, 17:32 [21958487] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
|
||||
27 авг 19, 17:34 [21958490] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
|
||||
27 авг 19, 17:37 [21958494] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Покажешь? |
||
27 авг 19, 17:37 [21958495] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
s62, насчёт известный, это я спутал с DSPack. |
27 авг 19, 17:39 [21958497] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Да, он видит какие-то приседания результат которых таки выходит за рамки допустимых значений. Трактовать можно и так. |
||
27 авг 19, 17:41 [21958499] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
|
||||
27 авг 19, 17:42 [21958500] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Тоже сдвиги? |
||
27 авг 19, 17:57 [21958506] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
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] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Вообще, похоже, что дело в каких-то опциях проекта, надо посмотреть. Потому что в тестовом проекте в той же 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; Выводит:
|
||
28 авг 19, 13:11 [21959011] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Нет, если объявить переменную целого типа или типа TColor, то будет сообщение об ошибке, такое же. |
28 авг 19, 13:18 [21959023] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1256 |
Забросил всё это дело, на днях вернулся к нему и наткнулся на неожиданную ошибку (точнее - наткнулся давно, но как раз тогда и забросил). Вызываю 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 | ![]() |