2017-09-14 62 views
1

我需要創建一個包含二維數組的結構,但是數組大小可能會有所不同,所以我無法用一個常量來定義它。我試圖用雙指針來解決這個問題,只是爲了找出雙指針與雙數組不同。那我該怎麼做呢?如何在C結構中使用二維數組?

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

注意的邏輯,你的代碼試圖返回一個指向局部變量 - 這是非常錯誤的。您將需要使用動態分配。你對使用這種結構的地方有多少控制?你會傳遞給你沒有寫的函數麼?一種選擇就是簡單地分配一個適當大小的double值的向量,然後用表達式'gk-> kernel [row *(2 * gk-> r + 1)+ col]'(而不是'gk- > kernel [row] [col]'),儘管你最好在結構中明確記錄數組大小。這或多或少是微不足道的。如果有的話,替代品是混亂的。 –

回答

1

應分配的二維動態數組爲:

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

然後你就可以在GKernel.kernel存儲值按程序

+0

引用這個問題:_I試圖用雙指針來解決這個問題,只是爲了找出雙指針與double數組不同._這個答案看起來非常像使用雙指針。 –

+0

真的,我同意double數組和指針數組是不同的 – Pras

+0

謝謝你解決了我的問題! – user2333716