TDecompressionStream распаковка файла

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

TDecompressionStream распаковка файла

Сообщение S_Gur » 04.09.2019 21:59:24

Всем доброго времени суток. Требуется небольшая помощь. Работаю с Лазарусом от случая к случаю, поэтому опыта пока маловато. Проблема в следующем. Нужно перенести небольшую функцию из Дельфей в Лазарус. Код функции следующий:

Код: Выделить всё
Function LoadIniFile(AClose : Boolean = False) : Boolean;

Var
  FIn, FOut : TFileStream;
  Fzd       : TDecompressionStream;
  RSize     : Integer;
  Buff      : Array[0..5119] Of Byte;

Begin
  Result           := False;
  If Not AClose Then
  Begin
    INIFileName    := GetAppConfigDir(False);
    If Not DirectoryExists(INIFileName) And Not CreateDir(INIFileName) Then Exit;
    INIFileName    := INIFileName + '\' + ChangeFileExt(ExtractFileName(Application.ExeName), '.INI');
    TmpINIFileName := GetTempFileName;
    If FileExists(INIFileName) Then
    Begin
      FIn          := TFileStream.Create(INIFileName, fmOpenRead);
      Fzd          := TDecompressionStream.Create(FIn);
      FOut         := TFileStream.Create(TmpINIFileName, fmCreate);
      Repeat
        RSize      := Fzd.Read(Buff[0], SizeOf(Buff));
        FOut.Write(Buff[0], RSize)
      Until RSize <> SizeOf(Buff);
      FOut.Free;
      Fzd.Free;
      FIn.Free
    End;
    INIFile        := TINIFile.Create(TmpINIFileName)
  End;
  Result           := True
End;


В Дельфях эта функция работает без проблем (естественно с учетом особенностей). В Лазарусе при компиляции выдается хинт "Local variable "Buff" does not seem to be initialized". Вопрос следующий: можно ли проигнорировать этот хинт, а если нет, то где и как я должен инициализировать массив?
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: TDecompressionStream распаковка файла

Сообщение Vadim » 05.09.2019 05:05:41

S_Gur
Хинт игнорировать можно запросто. Любой. Просто нужно понимать, что это значит, потому что в хинте может быть и вполне дельный совет. ;-)
У Вас использование переменной Buff зависит от нескольких условий, о чём хинт и напоминает. В Вашем коде чего либо ужасного я не вижу.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TDecompressionStream распаковка файла

Сообщение S_Gur » 05.09.2019 07:34:10

Vadim, я, в обще-то, понимаю, что такое хинты. Меня интересует частный конкретный случай. Я имею дурную привычку писать программы так, чтобы при сборке никаких хинтов и предупреждений не вылезало вообще. Здесь я от него избавиться не могу. Я пробовал инициализировать буфер FillChar-ом, причем как в начале функции, так и первой строкой после Repeat. Хинт не уходит. Насколько я могу понять, либо я это делаю неправильно, либо хинт вовсе не связан с буфером - такое иногда бывает и в дельфях, и в лазарусе. Меня вовсе не ломает очистить буфер, но я никак не могу найти, как правильно это сделать
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: TDecompressionStream распаковка файла

Сообщение Awkward » 05.09.2019 08:30:03

А если просто перед repeat поставить
Код: Выделить всё
buff[0]:=0;
Awkward
новенький
 
Сообщения: 48
Зарегистрирован: 19.01.2017 00:06:47

Re: TDecompressionStream распаковка файла

Сообщение S_Gur » 05.09.2019 08:45:15

Awkward, да, спасибо, помогло
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: TDecompressionStream распаковка файла

Сообщение Vadim » 05.09.2019 09:00:36

S_Gur
В частном конкретном Вашем случае компилятор подсказывает, что при запуске процедуры выделяются какие-то отнюдь не маленькие ресурсы, которые из-за выставленных Вами в процедуре условий могут вообще не использоваться. Это намёк на возможную бесполезную трату ресурсов процессора. Правильным решением по подсказке будет не бессмысленная возня с buff в самой процедуре, а проверку существования каталога и файла ДО вызова процедуры. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TDecompressionStream распаковка файла

Сообщение S_Gur » 05.09.2019 09:21:39

Vadim, насколько я понимаю, речь идет именно о буфере. Потоки динамические и пока их не создашь, никакие ресурсы на них выделяться не будут. С точки зрения логики эту функцию разбивать на части совсем неудобно. Можно попробовать массив создавать динамически, конечно. А что - для Лазаруса 5 несчастных килобайт такая критичная трата ресурсов?
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: TDecompressionStream распаковка файла

Сообщение Vadim » 05.09.2019 09:56:06

S_Gur писал(а):Потоки динамические и пока их не создашь, никакие ресурсы на них выделяться не будут.

А мы с Вами разве про потоки говорим? Совсем ведь про другое... ;-)
S_Gur писал(а):А что - для Лазаруса 5 несчастных килобайт такая критичная трата ресурсов?

Несмотря на то, что Вы всё знаете про хинты на всякий случай напомню: Lazarus - это не компилятор, это простая обычная IDE и ей вообще ничего не надо. Это Вам для Вашей программы надо и если компилятор (специально подчёркиваю, компилятор ;-) ) видит неэффективную трату ресурсов, он Вам поэтому и даёт свой хинт, подсказку, на что обратить внимание.
S_Gur писал(а):Можно попробовать массив создавать динамически, конечно.

Можно. Но поскольку, в данном случае, ресурсы программы Вас совершенно не волнуют, самое эффективное решение - проигнорировать выданный компилятором хинт.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TDecompressionStream распаковка файла

Сообщение S_Gur » 05.09.2019 10:03:52

Но поскольку, в данном случае, ресурсы программы Вас совершенно не волнуют, самое эффективное решение - проигнорировать выданный компилятором хинт.


Можно выбрать и третий вариант - прислушаться к совету компилятора и проинициализировать буфер, что я и сделал. Хинт благополучно ушел :D В любом случае, всем спасибо за советы
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: TDecompressionStream распаковка файла

Сообщение Vadim » 05.09.2019 10:15:58

S_Gur
Не исключено, что мы с Вами не очень хорошо разбираемся в английском. :-) В данном случае "инициализация" - это первое, по времени, заполнение данными буфера. А если буфер не будет использоваться, зачем его данными заполнять? ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TDecompressionStream распаковка файла

Сообщение Mirage » 05.09.2019 16:43:40

Данный хинт не о растрате ресурсов, а об отсутствии инициализации переменной перед использованием. Ввиду характера ее использования, хинт неверный, можно игнорить.
А что касается ресурсов, то 5КБ на стеке в общем-то довольно немало, так что вынести проверки за функцию - хороший совет. Тем более, что проблем с разбиением никаких не просматривается, в т.ч. с точки зрения логики.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: *Rik* и гости: 9

Рейтинг@Mail.ru