2013-07-13 35 views
0

我想在使用Eclipse(Kepler)和MinGW(gcc 4.7.2)的Windows 8系統上的C程序中使用FFTW .dll(v 3.3.3)。有我懷疑這兩個問題是與我的配置做:使用Eclipse和mingw限制fftw的數組大小?

  1. 小於977,程序運行一個數組的大小併產生 預期輸出;如果N> = 977,則程序崩潰而不輸出。
  2. 儘管與N < 977一起運行會給出預期的輸出,但調試給出的值完全不同。

任何人都可以指向正確的方向嗎?

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <complexUtil.h> 
#include <fftw3.h> 

#define N 976 

main() 
{ 
    fftw_complex *in, *out; 
    fftw_plan p; 

    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); 
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); 

    FILE* infile; 
    float value; 
    int i = 0; 

    // Populate input array from file 
    infile = fopen("testData.txt", "r"); 
    for (i=0; i<N; i++) { 
     fscanf(infile, "%f", &value); 
     (*(in + i)) = value + 0.0i; 
    } 
    fclose(infile); 

    // Perform fft 
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftw_execute(p); 
    fftw_destroy_plan(p); 
    fftw_free(in); fftw_free(out); 

    // Debug output 
    printf("in\t\tout\n"); 
    for (i=0; i<N; i++) { 
     printf("%f\t%f\n", 
        creal((fftw_complex)* (in + i)), 
        creal((fftw_complex)* (out + i))); 
    } 
    return(0); 
} 

編譯器調用:

gcc "-IC:\\Users\\Brian\\workspace\\psd\\src" "-IC:\\Users\\Brian\\workspace\\psd\\lib" "-includeC:\\Users\\Brian\\workspace\\psd\\src\\complexUtil.h" "-includeC:\\Users\\Brian\\workspace\\psd\\src\\fftw3.h" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\psd.o" "..\\src\\psd.c" 
gcc "-LC:\\Users\\Brian\\workspace\\psd\\lib" -Wl,--stack,2048 -o psd.exe "src\\psd.o" -lfftw3-3 

正常輸出:

in   out 
0.188000 348.455000 
0.000000 29.738027 
0.021000 -88.468551 
0.021000 16.764387 
0.021000 -48.056287 
... 

調試輸出:

in   out 
-2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 -2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
-2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 -2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
... 

還有一個症狀:在調試模式下沒有輸出顯示,因爲我正在逐步執行,直到通過輸出循環進行一定次數的迭代。然後我得到一個輸出塊,Eclipse中的步進函數變成灰色。

+1

***'int' ***'main()'... – 2013-07-13 10:21:08

+0

@ H2CO3評論與問題無關。 – JackCColeman

回答

0

977是素數,因此它不會按照FFTW的要求將因素分解爲小素數的冪。因此fftw_plan_dft_1d將失敗並返回NULL,並且隨後調用p == NULL的FFTW將會崩潰。如果你嘗試N> 976的合理值,例如N = 1024,那麼應該按預期工作,因爲你的代碼似乎是好的(除了完全沒有錯誤檢查)。

+0

謝謝保羅。我已經嘗試過1024,結果相同。我通過向下工作來到977,以找到問題開始的價值。重新錯誤檢查 - 非常正確MBR $ –

+0

可能不相關,但除非你真的需要雙精度,那麼考慮使用單精度庫和頭文件(fftw3f) - 它會更快,它會減半你的內存需求。 –

+0

其實這是我使用雙精度庫解決的早期問題。用fftw3f-3我得到了:gcc「-LC:\\ Users \\ Brian \\ workspace \\ psd \\ lib」-Wl, - stack,2048 -o psd.exe「src \\ psd.o」 -lfftw3f-3 src \ psd.o:在函數'main'中: C:\ Users \ Brian \ workspace \ psd \ Debug /../ src/psd.c:23:未定義的對_imp__fftw_malloc的引用 C :\ Users \ Brian \ workspace \ psd \ Debug /../ src/psd.c:24:對'_imp__fftw_malloc'的未定義引用 –