15 августа 2020 г.

Задачка №26

Я тут обругался страшно на одно "нововведение" в библиотеке ZLib.

Упражнение: что не так в этом коде? В предположении, что все параметры указаны верно. Функция, если что, возвращает Z_OK:
function InitDeflate(const ACompressionLevel: Byte): TZStreamRec;
var
  Code: Integer;
begin
  FillChar(Result, SizeOf(Result), 0);
  Code := System.ZLib.deflateInit_(Result, ACompressionLevel, zlib_version, SizeOf(TZStreamRec)));
  
  // ... далее идёт анализ Code
  // в данном случае Code = Z_OK
end;

Бонус-упражнение: найдите описание этого поведения в документации к ZLib.

4 комментария :

  1. Может быть, не финализируется Result перед выполнением FillChar?

    ОтветитьУдалить
    Ответы
    1. ZLib - это C библиотека, она в проект подключается через уже скомпилированные .obj. Соответственно, C понятия не имеет про автофинализируемые типы Delphi. Следовательно, автофинализируемых типов в TZStreamRec нет.

      Удалить
  2. Может, оригинальная библиотека полагает TZStreamRec неперемещаемым (некопируемым)? Тогда result может указывать на временную переменную вместо настоящей цели присваивания, и если ZLib зачем-нибудь сохраняет указатель на z_streamp (TZStreamRec), он сломается. Пример: если есть функция f(var a: SomeType), то код a := f(a) будет выполнен как temp := f(a); a := temp, чтобы когда функция начнёт писать что-то в результат, это не вызвало неожиданных изменений ссылочного параметра a.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.