我试图用指针在C语言中实现卷积算法。
我知道我的反褶积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;
 }

最佳答案

您的函数原型有一些整数常量声明为指针

void deconvolution (double *Win
                    , double *Vin
                    , int *N
                    , int *j
                    , int *L
                    , double *ht
                    , double *gt
                    , double *Vout)

但是当你调用反褶积时,你不会把地址传递给这些常数
deconvolution ( Win, Vin, N, J, L, ht, gt, Vout); // &N,&J,&L

你应该把反褶积改为正常积分,因为你
不要改变函数中的N,J,L
把地址传给他们。
void deconvolution (double *Win
                    , double *Vin
                    , int N
                    , int j
                    , int L
                    , double *ht
                    , double *gt
                    , double *Vout)

Voutbtw设置为空,因此如果您需要写入以证明您将收到一个错误,
你需要分配内存,这可以在函数反褶积中完成
或者在外面,如果你已经知道尺寸的话。如果要在函数内部分配Vout,则需要将double* Vout更改为double** Vout,以便可以更改Vout指向的内容。

10-07 13:30