代码之家  ›  专栏  ›  技术社区  ›  Saif

C语言中指针数组的处理

  •  1
  • Saif  · 技术社区  · 8 年前

    我正在尝试使用指针在C中实现卷积算法。

    我知道我的反褶积。c代码正确。然而,我很难调用该函数来获得所需的结果。非常感谢您的帮助。

     // 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;
     }
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   AndersK    8 年前

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

    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)
    

    Vout 顺便说一句,设置为NULL,因此如果需要写入Vout,则会出现错误, 您需要分配内存,这可以在函数反褶积内完成 或者在外面,如果你已经知道尺寸的话。如果要分配 Vout公司 在您的功能中,您需要更改 double* Vout 到 double** Vout 这样你就可以改变什么 Vout公司 指向。

        2
  •  0
  •   Bernd Elkemann    8 年前

    正如coderredoc所说,Vout并没有初始化为内存,它需要类似于 double *Vout = malloc(N*sizeof(double)) .

    但对您更有用的是启用编译器警告(例如,在GCC中,它是用-Wall完成的)。在这种情况下,还有更多的警告。然后我会修复警告。

    然后在调试器(例如GDB)中运行该程序。调试器向您显示哪一行崩溃,然后查看它崩溃的原因:该行做什么/需要什么。在这种情况下,该行显示 Vout[t] = ... 所以你对自己说“让我检查一下Vout是否是空指针”。

        3
  •  0
  •   user3247643    8 年前

    这不是正确的代码。

    首先,函数定义不正确。在主功能中。,您可以调用反褶积函数,如“反褶积(Win、Vin、N、J、L、ht、gt、Vout);”;。 但是,N,J,L不是指针变量。

    如果要调用此表单,应定义“无效反褶积(double*Win,double*Vin, int N,int j,int L ,双*ht,双*gt,双*Vout);或者您应该像反褶积一样调用反褶积(Win、Vin、N、J、L、ht、gt、Vout);

    接下来,“double*Vout=NULL;”不是数组。它是指针变量。这意味着,Vout上没有分配的内存地址。如果你想得到正确的结果,你应该写“double-Vout[9];”。

    最后,Win、Vin、ht和gt的定义不明确。在代码中,它是数组。但是,在您的代码中,它是双类型变量。因此,您应该输入“Win[]、Vin[]、ht[]、gt[]”。

    你将改变下面的代码,你可以得到很好的结果。

    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;
    

    }