2017-09-14 2 views
1

Ich muss eine Struktur erstellen, die ein 2D-Array enthält, aber die Array-Größe kann variieren, so dass ich es nicht mit einer konstanten Länge definieren kann. Ich habe versucht, dies mit einem Doppelzeiger zu lösen, nur um herauszufinden, dass der Doppelzeiger nicht dasselbe wie ein Doppel-Array ist. Wie kann ich das tun?Wie werden 2D-Arrays in einer C-Struktur verwendet?

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

Hinweis speichern kann, dass Ihr Code versucht, einen Zeiger auf eine Rückkehr lokale Variable - das ist schrecklich falsch. Sie müssen die dynamische Zuordnung verwenden. Wie viel Kontrolle haben Sie darüber, wo diese Struktur verwendet wird? Was wirst du an Funktionen weitergeben, die du nicht geschrieben hast? Eine Option besteht einfach darin, einen Vektor mit geeigneten Größen von "doppelten" Werten zuzuweisen und diesen dann mit den Ausdrücken "gk-> kernel [row * (2 * gk-> r + 1) + col]" (statt "gk- > kernel [row] [col] '), obwohl es besser wäre, die Array-Größe explizit in der Struktur aufzuzeichnen. Das ist mehr oder weniger trivial. Die Alternativen, falls verfügbar, sind unordentlich. –

Antwort

1

Sie sollten Ihre 2D zuteilen dynamische Array als:

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

Dann sind Sie Werte in GKernel.kernel nach Logik des Programms

+0

Um die Frage zu zitieren: _Ich versuchte, dies mit einem Doppelzeiger zu lösen, nur um herauszufinden, der Doppelzeiger ist nicht das gleiche wie ein Doppel-Array._ Diese Antwort sieht bemerkenswert wie mit einem Doppelzeiger. –

+0

Wahr, ich stimme zu, Doppel-Array und Array von Zeigern sind unterschiedlich – Pras

+0

Danke, dass mein Problem gelöst! – user2333716

Verwandte Themen