"Прозрачное" сжатие BLOB-полей. Как реализовать в

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 05 сен 2006, 19:28

SAV писал(а):... попробовал по разному и realloc пробовал :-(
Как именно пробовал? Вот так что ли:

Код: Выделить всё

void __fastcall PackBuffer(void *&SourceBuf, int &SourceLen) 
{
  try 
  {
  SourceBuf = realloc(SourceBuf, SourceLen-1);
  } 
  catch (Exception &E) 
  { 
   ShowMessage("PackBuffer error\n"+E.Message); 
   Form1->pFIBTransaction1->Rollback(); 
  }
}

SAV
Сообщения: 54
Зарегистрирован: 19 авг 2006, 17:59

Сообщение SAV » 05 сен 2006, 21:42

WildSery писал(а):
SAV писал(а):... попробовал по разному и realloc пробовал :-(
Как именно пробовал? Вот так что ли:

Код: Выделить всё

void __fastcall PackBuffer(void *&SourceBuf, int &SourceLen) 
{
  try 
  {
  SourceBuf = realloc(SourceBuf, SourceLen-1);
  } 
  catch (Exception &E) 
  { 
   ShowMessage("PackBuffer error\n"+E.Message); 
   Form1->pFIBTransaction1->Rollback(); 
  }
}
Именно так и пробовал... поразбирался ещё: в общем так
1) У меня включен CodeGuard вот лог ошибки
Error 00126. 0x310000 (Thread 0x12A9C):
Bad parameter: A bad memory block (0x9C3550) has been passed to the function.
realloc(0x009C3550, 0x129 [297])

Call Tree:
0x00402514(=Project1.exe:0x01:001514) c:\Program Files\Borland\CBuilder6\Projects\FibBlobFilter\Unit1.cpp#50
0x004AE5E6(=FIBPlus_CB6.bpl:0x01:07D5E6)
0x0043AE96(=FIBPlus_CB6.bpl:0x01:009E96)
0x0045AEA3(=FIBPlus_CB6.bpl:0x01:029EA3)
0x0044C478(=FIBPlus_CB6.bpl:0x01:01B478)
0x0044C5CE(=FIBPlus_CB6.bpl:0x01:01B5CE)
2) Exceptioon о неосвобождённой или неправильного обращения к памяти не возникает,может это просто предупреждение гварда? Или всё таки есть гдето баг или неправильное использование realloc?

SAV
Сообщения: 54
Зарегистрирован: 19 авг 2006, 17:59

Сообщение SAV » 10 сен 2006, 11:56

Dimitry Sibiryakov писал(а):Ага, я уже догадался прочитать статью по ссылке. У тебя функция неправильно объявлена. Ей должен передаваться указатель на указатель на буфер. Т.е. примерно так:

Код: Выделить всё

PackBuffer(void *&SourceBuf,int &SourceLen)
Тогда должно заработать.
Я посмотрел в исходниках FIBPlus в файле IBBlobFilter.hpp написанно:
typedef void __fastcall (*TIBBlobFilterProc)(void *BlobBuffer, int &BlobSize);
то есть прототип для функци фильтра.

Ответить