Здравствуйте. Среда 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 )
Что не так?
Функция filterCreate
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Функция filterCreate
попробуйте так:
памятьпод коэффициенты выделится сама в функции filterCreate перед выходом надо очистить выделеную память функцией filterClear
Код: Выделить всё
FC fc;
memset(&fc,0,sizeof(FC));
filterCreate(&fp, &fc, 6);
-
- Сообщения: 2
- Зарегистрирован: 14 фев 2011, 20:04
Re: Функция filterCreate
Спасибо.
А зачем огород городить? Мне не нужна эта возня с динамически выделяемой памятью. Ведь ее потом высвобождать нужно. Да и под 5-8 переменных типа double запрашивать у системы память несколько странновато, не находите? Гораздо проще сделать статический массив, плюс к этому программа работать быстрее будет.
Нужно сделать проверку - если переменные fc.a и fc.b не равны нулю, то значит уже содержат адрес нужного места в памяти, куда сохранять результат расчета коэффициентов.
В общем, заменил, работает.
memset(&fc, 0, sizeof(FC));
filterCreate(&fp, &fc, filterGetOrder(&fp));
А зачем огород городить? Мне не нужна эта возня с динамически выделяемой памятью. Ведь ее потом высвобождать нужно. Да и под 5-8 переменных типа double запрашивать у системы память несколько странновато, не находите? Гораздо проще сделать статический массив, плюс к этому программа работать быстрее будет.
Нужно сделать проверку - если переменные fc.a и fc.b не равны нулю, то значит уже содержат адрес нужного места в памяти, куда сохранять результат расчета коэффициентов.
В общем, заменил, работает.
memset(&fc, 0, sizeof(FC));
filterCreate(&fp, &fc, filterGetOrder(&fp));
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Функция filterCreate
я не могу использовать статические массивы, потому что не знаю порядка фильтра, который надо рассчитывать. вы можете задать любой порядок или потребовать чтобы фильтр укладывался в заданный коридор АЧХ. Так что у вас есть 2 варианта: использовать функцию с динамическим выделением памяти, или написать расчет фильтров самостоятельно так как вам это нравится.
PS
filterCreate(&fp, &fc, filterGetOrder(&fp));
можно заменить на
filterCreate(&fp, &fc, 0);
результат будет одинаковым.
PS
filterCreate(&fp, &fc, filterGetOrder(&fp));
можно заменить на
filterCreate(&fp, &fc, 0);
результат будет одинаковым.