Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];

Вниз

Не могу очистить буфер после компрессии методами 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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1287920088
George
2010-10-24 15:34
2011.01.16
TABOrder и фреймы


6-1233263581
Josh
2009-01-30 00:13
2011.01.16
Утечка памяти при мультипоточном сканировании сети NetShareEnum


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


2-1288102111
ilsur
2010-10-26 18:08
2011.01.16
Тексты и шрифты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский