我的功能有什么问题?

时间:2013-05-28 09:05:07

标签: c function

我正在使用code :: blocks,当我编译这个程序时它没有显示任何错误但是当我运行它时说convolution.exe已经停止工作(即,我将其保存为convolution.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]);
  }

}

2 个答案:

答案 0 :(得分:1)

其他一些问题:

您的printf正在寻找long int但您正在传递int。在%ld函数中将%d更改为main()

更新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]

答案 1 :(得分:0)

您的问题已经回答here。 无论如何,问题是你访问你的阵列越界。请注意不要访问在初始化/声明时给出的大小。要解决您的问题,请按如下所示修改函数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]) );
      }
  }
}