我正在尝试使用指针在C中实现卷积算法。
我知道我的deconvolution.c代码是正确的。但是,我很难调用Main中的函数来获得所需的结果。任何帮助深表感谢。
// deconvolution.c
#include "deconvolution.h"
#include "math.h"
void deconvolution (double *Win, double *Vin, int *N, int *j, int *L, double *ht, double *gt, double *Vout)
{
int k, n, t;
for(t = 0; t < *N; t++) {
k = t;
Vout[t] = (ht[0] * Win[k]) + (gt[0] * Vin[k]);
for(n = 1; n < *L; n++) {
k += (int) pow(2.0, (double) *j - 1.0);
if(k >= *N) k -= *N;
Vout[t] += (ht[n] * Win[k]) + (gt[n] * Vin[k]);
}
}
}
//////////////
// deconvolution.h
#include <stdio.h>
void deconvolution (
double *Win, double *Vin, int *N, int *j, int *L, double *ht, double *gt, double *Vout);
//////////////
// main.c
#include <stdio.h>
int main(int argc, const char * argv[]) {
int N = 9; // Size of Win and Vin
int J = 3; // Levels
int L = 4; // Size of gt and ht
double *Vout = NULL; // output will be stored here
double Win = {1.0, -2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, -9.0};
double Vin = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, -7.0, 8.0, 9.0};
double ht = {-1.0, 2.0, -3.0, -4.0};
double gt = {-1.0, 2.0, 3.0, -4.0};
deconvolution (
Win, Vin, N, J, L, ht, gt, Vout);
// Should Print Vout = {40.0, -16.0, -42.0, 24.0, -74.0, -8.0, -8.0, -46.0, -8.0}
// But I get an error
return 0;
}
答案 0 :(得分:0)
就像coderredoc所说,Vout没有初始化为内存,它需要像double *Vout = malloc(N*sizeof(double))
。
但对您来说更有用的是启用编译器警告(例如在GCC中使用-Wall完成)。在这种情况下还有更多的警告。然后我会修复警告。
然后在调试器(例如GDB)中运行程序。调试器显示哪条线路崩溃,然后你看看它崩溃的原因:该线路/需要什么。在这种情况下,该行说Vout[t] = ...
所以你对自己说'#34;让我检查一下Vout是否为空指针&#34;。
答案 1 :(得分:0)
这不是正确的代码。
首先,函数定义不正确。在主函数中,您调用deconvolution函数,如&#34; deconvolution(Win,Vin,N,J,L,ht,gt,Vout);. 但是,N,J,L不是指针变量。
如果你想调用这个表单,你应该定义&#34; void deconvolution(double * Win,double * Vin, int N,int j,int L ,double * ht,double * gt,double * Vout);或者你应该像去卷积一样调用反卷积(Win,Vin,&amp; N,&amp; J,&amp; L,ht,gt,Vout);
接下来,&#34; double * Vout = NULL;&#34;不是数组。它的指针变量。这意味着,Vout上没有分配内存地址。如果你想得到正确的结果,你应该写&#34;双Vout [9];&#34;。
最后,Win,Vin,ht和gt的定义不明确。在代码中,它是数组。但是,在你的代码中它是双类型变量。所以,你要胜利[...]赢[],Vin [],ht [],gt []&#34;。
您将更改以下代码,您可以获得良好的结果。
int main(int argc,const char * argv []){
int N = 9; // Size of Win and Vin
int J = 3; // Levels
int L = 4; // Size of gt and ht
double Vout[9]; // output will be stored here
double Win[] = {1.0, -2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, -9.0};
double Vin[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, -7.0, 8.0, 9.0};
double ht[] = {-1.0, 2.0, -3.0, -4.0};
double gt[] = {-1.0, 2.0, 3.0, -4.0};
deconvolution (Win, Vin, &N, &J, &L, ht, gt, Vout);
// Should Print Vout = {40.0, -16.0, -42.0, 24.0, -74.0, -8.0, -8.0, -46.0, -8.0}
// But I get an error
return 0;
}
答案 2 :(得分:0)
你的函数原型有一些声明为指针的整数常量
void deconvolution (double *Win
, double *Vin
, int *N
, int *j
, int *L
, double *ht
, double *gt
, double *Vout)
但是当你调用deconvolution时,你不会将地址传递给这些常量
deconvolution ( Win, Vin, N, J, L, ht, gt, Vout); // &N,&J,&L
您应该将deconvolution更改为普通的ints,因为您 不要在函数中改变N,J,L没有理由 将地址传递给他们。
void deconvolution (double *Win
, double *Vin
, int N
, int j
, int L
, double *ht
, double *gt
, double *Vout)
Vout
btw设置为NULL,因此如果您需要写入Vout,您将收到错误,
你需要分配内存,这可以在函数deconvolution中完成
或者如果您已经知道尺寸的话。如果您想在功能中分配Vout
,则需要将double* Vout
更改为double** Vout
,以便您可以更改Vout
指向的内容。