-5

我正在使用代码:: 块,当我编译这个程序时它没有显示任何错误,但是当我运行它时它说卷积.exe 已停止工作(即,我将其保存为卷积.c),我不知道发生了什么事,谁能帮我解决这个问题,我的代码如下

#include<stdio.h>
#include<stdlib.h>
#define array_len(x) (sizeof(x)/sizeof(double))
void convolution(double *signal, int nt, double *wind, int r, double *rm)
{

  int i,j;
  double copy[nt];
  for(i=0; i<nt; i++)
  {
      copy[i] = signal[i];
  }

  int l = (nt+r-1);
  for(i=r;i<=l;i++)
  {
      wind[i]=0;
  }
  for(i=nt;i<=l;i++)
  {
      copy[i]=0;
  }
  for(i=0;i<=l;i++)
  {
      rm[i]=0;
      for(j=0;j<=i;j++)
      {
         rm[i] = (rm[i]+(copy[j]*wind[i-j]) );
      }

  }
}

void main()
{
  double a[1020];
  int i;
  for(i=0; i<1020; i++)
  {
      a[i] = 1;
  }
  int la = array_len(a);
  printf("\nc1\t%d",la);

  double b[1020];
  for(i=0; i<1020; i++)
  {
      b[i] = 1;
  }
  int lb = array_len(b);
  printf("\nc2\t%d\n",lb);

  double r[la+lb-1];
  int lr = array_len(r);
  printf("\nc3\t%d\n",lr);

  printf("entering convolution\n");
  convolution(a,la,b,lb,r);
  printf("in main\n\n");

  for(i=0;i<(50);i++)
  {
      printf("rm[%d]=%lf\n",i,r[i]);
  }

}
4

2 回答 2

1

其他几个问题:

printf正在寻找,long int但你正在通过它int。在函数中更改%ld为。%dmain()

更新main()不是,void而是有一个int返回类型(如int main()),并在结束括号之前返回一些东西(通常return 0;在执行顺利进行的情况下放置)。

编辑:我只想提一下,您可以通过处理编译器打印的警告轻松解决这些问题(我确定它们在那里)。

编辑:这是我的编译器打印的-Wall-Wextra启用了标志(我在 Linux 下使用 GCC):

test.c: In function ‘main’:

test.c:43:3: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int’ [-Wformat]

test.c:51:3: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int’ [-Wformat]

test.c:55:3: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int’ [-Wformat]

test.c:34:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
于 2013-05-28T09:16:37.553 回答
0

您的问题已在此处得到解答。无论如何,问题是您越界访问数组。请注意不要访问在初始化/声明时给出的大小范围内的数组。为了解决你的问题,修改函数convolution如下:

void convolution(double *signal, int nt, double *wind, int r, double *rm)
{

  int i,j;
  int l = (nt+r-1);
  double signal1[l];
  double signal2[l];
  for(i=0; i<l; i++)
  {
      if (i < nt)
          signal1[i] = signal[i];
      else
          signal1[i] = 0;
      if (i < r)
          signal2[i] = wind[i];
      else
          signal2[i] = 0;
  }
  for(i=0;i<=l;i++)
  {
      rm[i]=0;
      for(j=0;j<=i;j++)
      {
         rm[i] = (rm[i]+(signal1[j]*signal2[i-j]) );
      }
  }
}
于 2013-05-28T10:10:00.560 回答