我正在使用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]);
}
}
答案 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]) );
}
}
}