Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.16;
Скачать: CL | DM;

Вниз

Не могу очистить буфер после компрессии методами Zlib   Найти похожие ветки 

 
Alik   (2010-10-20 14:19) [0]

Добрый день,

Моя проблема заключается в том, что при очистке буфера сжатых данных после компрессии методами Zlib компилятор выдает ошибку.
Функция ZCompress помещена в DLL файл.

var
 RawData: array of Byte;  // исходный несжатый массив  
 CompressData: array of Byte; // конечный сжатый массив
 RawDataLen: Integer; // размер несжатого массива
 CompressedDataLen: Integer; // размер сжатого массива
begin
 SetLength(RawData, RawDataLen);
 ...
 RawData заполняется данными
 ...
 ZCompress(@RawData[0],
                RawDataLen,
                Pointer(CompressedData),
                CompressedDataLen,
                zcMax);
 //сохраняю сжатый массив
 WriteFile(flw, CompressedData[0], CompressedDataLen, wtd, nil);
 //пытаюсь убить сжатый файл
 CompressedData := nil;
 После чего появляется ошибка
end;

Модуль ShareMem подключен как в DLL так и в вызывающей программе.


 
Palladin ©   (2010-10-20 14:22) [1]


> Модуль ShareMem подключен как в DLL так и в вызывающей программе.

самым первым? в dpr?


 
Alik   (2010-10-20 14:42) [2]


> Palladin ©   (20.10.10 14:22) [1]
>
> > Модуль ShareMem подключен как в DLL так и в вызывающей
> программе.
>
> самым первым? в dpr?


Благодарю Вас, вопрос решен, ShareMem был прописан в юните, где вызывалось сжатие.
Прописал в dpr все работат!)


 
Alik   (2010-10-20 15:21) [3]

Проблема все таки возникает при вызове CompressedData := nil,
но не каждый раз.

???


 
Alik   (2010-10-20 16:09) [4]


> Palladin ©   (20.10.10 14:22) [1]
>
> > Модуль ShareMem подключен как в DLL так и в вызывающей
> программе.
>
> самым первым? в dpr?


Так как проблема осталась, подключил сам модель напрямую, т.е. вызов функции сжатия осуществляется изнутри программы. Тем не менее ошибка возникает при каждом вызове функции.


 
Фокус_Ник   (2010-10-20 16:15) [5]

> Alik   (20.10.10 16:09) [4]

Модуль ShareMem должен быть прописан САМЫМ ПЕРВЫМ в ОБОИХ dpr (и в exe, и в dll). Похоже, что у Вас это не так.


 
Alik   (2010-10-20 16:27) [6]

Подключил стандартную библиотеку ZLib в Delphi 7.
Как только очищаю сжатый массив появляется та же самая ошибка. Если отключаю очистку, потом ошибка появляется где то по ходу выполнения программы. То есть налицо какой то глюк в памяти, а где именно он возникает?
Может я не правильно задаю буффера?  

RawData: array of Byte;  // исходный несжатый массив  
CompressData: array of Byte; // конечный сжатый массив
RawDataLen: Integer; // размер несжатого массива
CompressedDataLen: Integer; // размер сжатого массива

try
  CompressBuf(@RawData[0],
                   RawDataLen,
                   Pointer(CompressedData),
                   CompressedDataLen);

 finally
   RawData := nil;
   CompressedData := nil;
 end

При том при этом я вижу сжатые данные, по ним вопросов нет!


 
Alik   (2010-10-20 16:29) [7]


> Фокус_Ник   (20.10.10 16:15) [5]
> > Alik   (20.10.10 16:09) [4]
>
> Модуль ShareMem должен быть прописан САМЫМ ПЕРВЫМ в ОБОИХ
> dpr (и в exe, и в dll). Похоже, что у Вас это не так.


Да они прописаны и там и там первыми, проверил!
Проблема где то в другом, смотрите [4] и [6]


 
Leonid Troyanovsky ©   (2010-10-20 18:26) [8]


> Alik   (20.10.10 16:29) [7]

> Проблема где то в другом, смотрите [4] и [6]

Память для CompressData выделяет А.С. Пушкин?

--
Regards, LVT.


 
Alik   (2010-10-20 20:00) [9]


> Leonid Troyanovsky ©   (20.10.10 18:26) [8]
>
> > Alik   (20.10.10 16:29) [7]
>
> > Проблема где то в другом, смотрите [4] и [6]
>
> Память для CompressData выделяет А.С. Пушкин?
>
> --
> Regards, LVT.


Память для CompressData выделяется в методе ZCompress библиотеке ZLib.

******************
*  ZCompress                                                                 *
*                                                                            *
*  pre-conditions                                                            *
*    inBuffer  = pointer to uncompressed data                                *
*    inSize    = size of inBuffer (bytes)                                    *
*    outBuffer = pointer (unallocated)                                       *
*    level     = compression level                                           *
*                                                                            *
*  post-conditions                                                           *
*    outBuffer = pointer to compressed data (allocated)                      *
*    outSize   = size of outBuffer (bytes)                                   *
*****************************************************************************}


 
_Юрий   (2010-10-20 20:06) [10]

Попробуйте объявить CompressData как Pointer, и освобождайте память FreeMem"ом


 
_Юрий   (2010-10-20 20:11) [11]

Дело в том, что память для динамического массива можно выделять только с помошью SetLength, иначе вы лишаете компилятор возможности корректно подсчитать ссылки и вовремя освободить память.


 
Alik   (2010-10-20 21:41) [12]

Благодарю всех кто подключился к теме!

Проблема решилась следующим образом:

var
 P1, P2: Pointer;
begin
....
                try
                  GetMem(P1, RawDataLen);
                  Move(RawData[0], P1^, RawDataLen);
                  CompressBuf(P1,//@RawData[0],
                              RawDataLen,
                              P2,//Pointer(CompressedData),
                              CompressedDataLen);
                  SetLength(CompressedData, CompressedDataLen);
                  Move(P2^, CompressedData[0], CompressedDataLen);
                finally
                  FreeMem(P1);
                  FreeMem(P2);
                end;

И когда я вызываю
CompressedData := nil никаких проблем не возникает!!!


 
Leonid Troyanovsky ©   (2010-10-20 21:44) [13]


> Alik   (20.10.10 20:00) [9]

> *    outBuffer = pointer (unallocated)  

И с какого пуркуа совать туда динамический массив.
RTFM.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-10-20 21:50) [14]


> Alik   (20.10.10 21:41) [12]

> Благодарю всех кто подключился к теме!

Тема любви к динамическим массивам (да еще и в длл)
не раскрыта.

--
Regards, LVT.


 
_Юрий   (2010-10-21 19:32) [15]


>   GetMem(P1, RawDataLen);
>                   Move(RawData[0], P1^, RawDataLen);
>                   CompressBuf(P1,//@RawData[0],


как раз на вход то подавать дин. массив можно, главное - чтобы была заранее выделена необходимая  длина.


> CompressedData := nil никаких проблем не возникает!!!


это вообще лишнее. Компилятор и так сообразит, что на массив больше ничего не указывает - по выходу за пределы области видимости переменной CompressedData



Страницы: 1 вся ветка

Текущий архив: 2011.01.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
15-1285619359
Юрий
2010-09-28 00:29
2011.01.16
С днем рождения ! 28 сентября 2010 вторник


15-1286224153
Юрий
2010-10-05 00:29
2011.01.16
С днем рождения ! 5 октября 2010 вторник


2-1288094860
fiascko
2010-10-26 16:07
2011.01.16
перевод из 16ой в 10ую


2-1287986449
Irisss
2010-10-25 10:00
2011.01.16
Компилятор игнорирует Breakpoint


15-1280383980
Dennis I. Komarov
2010-07-29 10:13
2011.01.16
DM Chess Tournament II