2017-09-14 1 views
1

Je dois créer une structure qui contient un tableau 2D, mais la taille du tableau peut varier, donc je ne peux pas le définir avec une longueur constante. J'ai essayé de résoudre ceci avec un double pointeur seulement pour découvrir que le double pointeur n'est pas le même qu'un double tableau. Alors, comment puis-je faire cela?Comment utiliser des tableaux 2D dans une structure 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

Notez que votre code a essayé de retourner un pointeur vers une variable locale - c'est horriblement faux. Vous devrez utiliser l'allocation dynamique. Quel contrôle avez-vous sur l'endroit où cette structure est utilisée? Que ferez-vous passer à des fonctions que vous n'avez pas écrites? Une option consiste simplement à allouer un vecteur de valeurs 'double' de taille appropriée, puis à l'indexer avec les expressions' gk-> kernel [row * (2 * gk-> r + 1) + col] '(au lieu de' gk- > kernel [row] [col] '), bien que vous fassiez mieux d'enregistrer la taille du tableau explicitement dans la structure. C'est plus ou moins trivial. Les alternatives, si disponibles, sont désordonnées. –

Répondre

1

Attribuez votre tableau dynamique 2D:

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

Ensuite, vous pouvez stocker des valeurs dans GKernel.kernel selon la logique de votre programme

+0

Pour citer la question: _J'ai essayé de résoudre ceci avec un double pointeur seulement pour découvrir que le double pointeur n'est pas le même qu'un double tableau. Cette réponse ressemble remarquablement à l'utilisation d'un double pointeur. –

+0

Vrai, je suis d'accord double tableau et tableau de pointeurs sont différents – Pras

+0

Merci qui a résolu mon problème! – user2333716