powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Фильтрация BLOB-полей
24 сообщений из 24, страница 1 из 1
Фильтрация BLOB-полей
    #38194280
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто нибудь делал фильтрацию с помощью fibplus?

как изменили размер буффера вы вызове функции переданной в RegisterBlobFilter
написал код в с++ builder изменение размерана realloc

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall PackBuffer(char *src,int &src_len)
{
char s[]="qqqqqqqqqqq";
src=(char*)realloc(src,strlen(s));//выдает AccessViolation ReadError
memcpy(src,s,strlen(s));
src_len=strlen(s);
} 



что интересно в src не те данные передаются на входе
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194310
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

с этим в раздел C/C++.

Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194632
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
void __fastcall PackBuffer(char *src,int &src_len)
{
char s[]="qqqqqqqqqqq";
src=(char*)realloc(src,strlen(s));//выдает AccessViolation ReadError
} 



Так а как ты вызываешь эту замечательную функцию PackBuffer(char *src,int &src_len) ?

AccessViolation ReadError как бы намекает, что параметр src в этот момент указывает на
недоступную память, т.е. попусту содержит какой-то мусор.
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194703
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

с этим я разобрался неправильно были объявлены входные переменные AnsiString *src
сейчас данные которые подаются на вход правильные и они видны в src

у меня падает в другом месте на memcpy, причем падает не всегда, с маленькими данными все работает корректно, а когда надо скопировать размер памяти 10 мегабайт тогда выдает ошибку

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall UnpackBuffer(AnsiString *src,int &src_len)
{
  unsigned long unc_len;
  memcpy(&unc_len, src->c_str(), 4);
  char *unc = (char*)malloc(unc_len);
  uncompress(unc, &unc_len, src->c_str()+4, src_len);
  realloc(src->c_str(),unc_len);
  src_len=unc_len;
  memcpy(src->c_str(), unc, src_len); // падает здесь AccessViolation ReadError
  free(unc);
}
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194713
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish// падает здесь AccessViolation ReadError
Потому что ты память выделил только на строку. А терминирующий нуль куда по-твоему должен писаться?.. Да и, собственно, где тебя так научили выделять память для AnsiString?..
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194722
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а как еще её выделять если данные в AnsiString хранятся?
зачем ноль в конце добавлять если в AnsiString данные бинарного вида?
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194757
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishа как еще её выделять если данные в AnsiString хранятся?

Специально для этого предназначенной функцией SetLength.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194758
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

все получилось src->SetLength
дальше заработало
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194821
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarfishDimitry Sibiryakov,

а как еще её выделять если данные в AnsiString хранятся?
зачем ноль в конце добавлять если в AnsiString данные бинарного вида?

Ну, может быть, НЕ хранить тогда данные в AnsiString ?
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194823
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

Ты уверен, что это именно то, что тебе надо ?

Код: plaintext
1.
2.
3.
4.
void __fastcall UnpackBuffer(AnsiString *src,int &src_len)
{
  unsigned long unc_len;
  memcpy(&unc_len, src->c_str(), 4);
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194832
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish, не всегда срабатывает SetLength

void __fastcall PackBuffer(AnsiString *src,int &src_len)
{
unsigned long cmp_len = src_len*1.11+12;
char *cmp = (char*)malloc(src_len);
compress2(cmp, &cmp_len, src->c_str(), src_len, 9);
src->SetLength(cmp_len+4);
memcpy(src->c_str(), &src_len, 4);
memcpy(src->c_str()+4, cmp, cmp_len);
src_len=cmp_len+4;
free(cmp);
}
иногда срабатывает, а иногда нет ,после выхода из процедуры выдает Invalid pointer operation
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194837
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

да надо сохранить первоначальный размер строки до компрессии, при распаковке это число как то учитывается, и его надо где то взять, я его сохраняю в начале строки 4 байта int, потом считываю при распаковке, и подаю в декомпрессов
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194862
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish, SetLength похоже не работает в сторону уменьшения строки
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38194903
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish, зачем ты AnsiString используешь? Он же для таких вещей не предназначен.
Почему не char * или vector<char>?

В хелпе написано: "The c_str method is intended primarily for reading the value of the AnsiString. To modify the string’s value, use the [] operator or AnsiString methods such as Insert and Delete.".
Код: plaintext
1.
2.
  memcpy(src->c_str(), &src_len, 4);
  memcpy(src->c_str()+4, cmp, cmp_len);


Уверен, что это корректно обрабатывается?
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195358
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, компонент так написан http://www.devrace.com/ru/fibplus/articles/2261.php
только у меня на с++ builder

пасклевский вариант procedure UnpackBuffer(var Buffer: PChar; var BufSize: LongInt);

переменную var Buffer: PChar; я перписал на СИ в виде char *src такая конструкция не работает
оказалось что на си это тип AnsiString
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195363
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarfishMasterZiv,

да надо сохранить первоначальный размер строки до компрессии, при распаковке это число как то учитывается, и его надо где то взять, я его сохраняю в начале строки 4 байта int, потом считываю при распаковке, и подаю в декомпрессов

Это немного смахивает на идиотизм...
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195423
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishоказалось что на си это тип AnsiString

Авотхрен. "var x:PChar" переводится на С++ как "char* &x" и никаких AnsiString.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195481
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

сжатие работает корректно , при упаковке уменьшается размер буффевра при выполнении realloc.

void __fastcall PackBuffer(char* &src,int &src_len)
{
unsigned long cmp_len = src_len*1.11+12;
char *cmp = (char*)malloc(src_len);
compress2(cmp, &cmp_len, src, src_len, 9);
realloc(src,cmp_len+4);
memcpy(src, &src_len, 4);
memcpy(src+4, cmp, cmp_len);
src_len=cmp_len+4;
free(cmp);
}

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

void __fastcall UnpackBuffer(char* &src,int &src_len)
{
unsigned long unc_len;
memcpy(&unc_len, src, 4);
char *unc = (char*)malloc(unc_len);
uncompress(unc, &unc_len, src+4, src_len-4);
realloc(src,unc_len);
src_len=unc_len;
memcpy(src, unc, src_len);// тут вылетает
free(unc);
}
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195548
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

в исходниках нашел что ожидаются функции такого вида
typedef void __fastcall (*TIBBlobFilterProc)(void *BlobBuffer, int &BlobSize);

typedef TIBBlobFilterProc *PIBBlobFilterProc;

void __fastcall RegisterBlobFilter(int BlobSubType, PIBBlobFilterProc EncodeProc, PIBBlobFilterProc DecodeProc);

у меня это сделано так
DM->FDB->RegisterBlobFilter(-1,(PIBBlobFilterProc)PackBuffer,(PIBBlobFilterProc)UnpackBuffer);

где
void __fastcall UnpackBuffer(char* &src,int &src_len)
void __fastcall PackBuffer(char* &src,int &src_len)
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195554
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, товарисч Garfish, ужо опубликовал весь свой кодильник-то, что гадать так и будем ?
Кто ж знает, где там у тебя что ещё навараксано...


Кроме того, это НЕ МОЖЕТ работать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall PackBuffer(char* &src,int &src_len)
{
unsigned long cmp_len = src_len*1.11+12; // чё эта за хрень ? * 1.11 ? Это всё равно, что ни на что не умножать.
char *cmp = (char*)malloc(src_len);
compress2(cmp, &cmp_len, src, src_len, 9);
realloc(src,cmp_len+4); // realloc возвращает адрес нового буфера, тебе -- похрен, ты его даже нигде не сохраняешь.
memcpy(src, &src_len, 4);
memcpy(src+4, cmp, cmp_len);
src_len=cmp_len+4;
free(cmp);
}




прочитай хотя бы документацию по realloc

http://www.cplusplus.com/reference/cstdlib/realloc/?kw=realloc
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195565
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

ты маг и кудесник, что же раньше не сказал, что надо присвоить адрес src=(char*)realloc...

все работает
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195568
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishtypedef void __fastcall (*TIBBlobFilterProc)(void *BlobBuffer, int &BlobSize);
у меня это сделано так
void __fastcall UnpackBuffer(char* &src,int &src_len)

Ну а назачем ты так сделал? Чтобы слоники падали?.. Тебе не приходило в голову, что
подсовывать функцию с совсем другой сигнатурой чревато боком?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195570
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

если бы я знал утром, что в этом месте упаду я бы здесь соломы подстелил )))
...
Рейтинг: 0 / 0
Фильтрация BLOB-полей
    #38195577
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

с void* не работает, это наверно так функция задекларирована, что на входе ожидается указатель
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Фильтрация BLOB-полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]