2013-05-28 112 views
-5

我正在使用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

http://stackoverflow.com/questions/16770078/what-is-the-mistake-in-this-program – Jeyaram

+4

您需要使用*調試器*,而不是堆棧溢出。一旦你使用調試器縮小了錯誤,並且* still *無法弄清楚如何解決這個問題,那麼只能轉向Stack Overflow。 –

+2

您可能應該學習如何使用調試器 - 一步一步調試並查看它崩潰的位置 – mvp

回答

1

其他一些問題:

printf正在尋找long int但你傳遞int。在main()函數中將%ld更改爲%d

更新main()不被void,但有一個int返回類型(如int main()),也剛剛結束括號(通常return 0;放在案件的執行進展順利)之前在年底返回的東西。

編輯:我只是想提一下,這些東西,你可以通過照顧編譯器打印的警告(我敢肯定他們在那裏)很容易修復。

編輯:這是印有啓用(我使用的是Linux下GCC)-Wall-Wextra標誌什麼我的編譯器:

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] 
+0

感謝您的信息,但編譯時我沒有收到任何警告 –

+0

這很奇怪,您使用的編譯器是什麼? Cygwin的?我更新了我的帖子,看我的編輯。 – Nobilis

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])); 
     } 
    } 
}