Страница 1 из 1

Функция filterCreate

Добавлено: 14 фев 2011, 20:19
Shurikenix
Здравствуйте. Среда RAD 2010.
В общем, делаю вот так

void __fastcall LowPassIIR_L (char fType, mfloat fC, mfloat fC1, mfloat Rp, mfloat Rs, mfloat *inBuf, mfloat *outBuf, int inCount, int outCount, int Dir)
{
double a[32], b[32];
FP fp;
FC fc;
mfloat in1, f, d;
int i, j;

fp.digital = true;
fp.type = fType + FB_LOW;
fp.wpl = 1.0 / fC;
fp.wph = 1.0 / fC1;
fp.Rp = Rp;
fp.Rs = Rs;

fc.b = &b[0];
fc.a = &a[0];
fc.Na = 6;
fc.Nb = 6;

filterCreate(&fp, &fc, 6);
И здесь вываливаемся по Ахес виолатион.
И МессагеБокс с текстом: Access violation at address 0AB6166F in module "DSP.DLL". Write of address 00000000.
Debug Output: Invalid Address specified to RtlReAllocateHeap( 0ABA0000, 0012E680 )

Что не так?

Re: Функция filterCreate

Добавлено: 14 фев 2011, 21:02
Бахурин Сергей
попробуйте так:

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

FC fc;
memset(&fc,0,sizeof(FC));
filterCreate(&fp, &fc, 6);
памятьпод коэффициенты выделится сама в функции filterCreate перед выходом надо очистить выделеную память функцией filterClear

Re: Функция filterCreate

Добавлено: 14 фев 2011, 22:07
Shurikenix
Спасибо.
А зачем огород городить? Мне не нужна эта возня с динамически выделяемой памятью. Ведь ее потом высвобождать нужно. Да и под 5-8 переменных типа double запрашивать у системы память несколько странновато, не находите? Гораздо проще сделать статический массив, плюс к этому программа работать быстрее будет.
Нужно сделать проверку - если переменные fc.a и fc.b не равны нулю, то значит уже содержат адрес нужного места в памяти, куда сохранять результат расчета коэффициентов.
В общем, заменил, работает.
memset(&fc, 0, sizeof(FC));
filterCreate(&fp, &fc, filterGetOrder(&fp));

Re: Функция filterCreate

Добавлено: 15 фев 2011, 08:33
Бахурин Сергей
я не могу использовать статические массивы, потому что не знаю порядка фильтра, который надо рассчитывать. вы можете задать любой порядок или потребовать чтобы фильтр укладывался в заданный коридор АЧХ. Так что у вас есть 2 варианта: использовать функцию с динамическим выделением памяти, или написать расчет фильтров самостоятельно так как вам это нравится.

PS
filterCreate(&fp, &fc, filterGetOrder(&fp));
можно заменить на
filterCreate(&fp, &fc, 0);
результат будет одинаковым.