2017-09-14 20 views
1

2次元配列を保持する構造体を作成する必要がありますが、配列のサイズが変わる可能性があるため、一定の長さで定義することはできません。私は二重ポインタでこれを解決しようとしましたが、ダブルポインタが二重配列と同じではないことがわかりました。だから私はこれをどのようにすることができますか?C構造体内で2D配列を使用するには?

struct GaussianKernel { 
    int r; 
    double weightSum; 
    double **kernel; 
}; 

GaussianKernel initializeKernel2D(jdouble sigma){ 
    int r = (int) ceil(3 * sigma); 
    int kernelLen = 2 * r + 1; 
    double G[kernelLen][kernelLen]; 
    double weightSum = 0; 
    double temp; 

    for (int y = -r; y <= r; y++) 
    { 
     for (int x = -r; x <= r; x++) 
     { 
     temp = exp(-(pow(x, 2) + pow(y, 2))/(2 * pow(sigma, 2)))/(2 * PI * pow(sigma, 2)); 
     G[y + r][x + r] = temp; 
     weightSum = weightSum + temp; 
     } 
    } 

    struct GaussianKernel GKernel; 
    GKernel.r = r; 
    GKernel.kernel = G; 
    GKernel.weightSum = weightSum; 

    return GKernel; 
} 
+0

ノートのロジックに従ってGKernel.kernelに値を格納することができます

GKernel.kernel = malloc(kernelLen * sizeof(double *)); for(i=0;i<kernelLen;i++) GKernel.kernel[i] = malloc(kernelLen * sizeof(double)); 

ローカル変数 - それはひどく間違っています。動的割り当てを使用する必要があります。この構造体がどこで使用されているかについて、あなたはどれだけのコントロールを持っていますか?あなたが書いていない関数に何を渡しますか? 'gk-> kernel [row *(2 * gk-> r + 1)+ col]'という式で索引付けするだけです。 > kernel [row] [col] ')、構造体に明示的に配列のサイズを記録する方が良いでしょう。それは多かれ少なかれです。可能であれば、代替案は乱雑です。 –

答えて

1

あなたにあなたの2D動的配列を割り当てる必要があります。そして、あなたはあなたのコードがへのポインタを返すようにしようとしたことを、あなたのプログラム

+0

質問を引用するには_私はdoubleポインタでこれを解決しようとしましたが、doubleポインタがdouble配列と同じではないことがわかりました。この答えはdoubleポインタを使用した場合と似ています。 –

+0

真実、私はダブル配列とポインタの配列が異なることに同意します – Pras

+0

ありがとう私の問題を解決! – user2333716

関連する問題