※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


C言語における動的配列(間違えた使い方) Dynamic Arrays in C - The Wrong Way


 C言語で多次元配列のメモリ確保に用いられる他の方法は、しばしばFFTWで利用できません。これを行うと、FFTWで深刻なエラーがおきるかもしれません。ここではその方法は、よく知られ使われているため、これについて議論します。この方法は、配列のポインタの配列のポインタの・・・を作るものです。たとえば、以下のようなものです。

int i,j;
fftw_complex ***a_bad_array; /* 5x12x27の配列を確保する他の方法 */

a_bad_array = (fftw_complex***)malloc( 5 * sizeof(fftw_complex**) );
for( i=0; i<5; ++i ){
    a_bad_array[i] = (fftw_complex**)malloc( 12 * sizeof(fftw_complex*) );
    for( j=0; j<12; ++j )
        a_bad_array[i][j] = (fftw_complex*)malloc( 27 * sizeof(fftw_complex) );
}

 ご存じのとおりこの種の配列は確保するのも(解放するのも)大変です。一方で、(i.j,k)番目の要素が、a_bad_array[i][j][k]というように簡単に参照できる利点があります。

 もしこの方法が好きで、配列へのアクセスを最大限に簡単にしたい要望があり、さらにFFTWに配列を渡したい場合は、両者の特性を生かしたハイブリッドメソッドを使うことができます。配列を1つの連続したブロックで確保して、同時にポインタ配列の配列もブロックの適切な場所で宣言します。この種のテクニックは、このドキュメントの範囲を超えているので、C言語の多次元配列の情報をもっと得たい場合は、comp.lang.cのFAQを参照してください。