2013-03-15 5 views
0

Je travaille sur un projet qui a plusieurs paramètres d'entrée (certains d'entre eux doivent être calculés dans le code), donc je les ai tous mis dans une structure.Comment passer un pointeur vers un tableau bidimensionnel dont la taille est définie par un pointeur en C?

typedef struct{ 
    int N_cell; 
    int N_node; 
}INPUT; 

Dans la fonction principale, je déclare

INPUT in; 

Après cela, il y a plusieurs lignes utilisées pour le calcul in.N_cell et in.N_node. Maintenant, je définis

double *pos_node[in.N_node]; 
for (i = 0; i < in.N_node; i++) 
    pos_node[i] = (double *) calloc(3, sizeof(double)); 

Je dois passer le pointeur de ce tableau à une fonction que je définis comme

void func(double *pos_node[????]){....} 

Ma question est, que dois-je écrire dans le « ???? " endroit? Devrais-je utiliser in.Node et ajouter "INPUT in" dans la liste des paramètres?

Merci beaucoup!

+0

vous aurez du mal à compiler quelque chose comme ce que vous avez là que vous n'avez pas défini une taille finie de pos_node (en utilisant une variable n'est pas aller au travail) – KevinDTimm

+0

Avez-vous des conseils sur la façon de traiter ce genre de problème? Je veux dire beaucoup de fonctions besoin d'utiliser ces paramètres d'entrée et la taille de certains tableaux sont déterminés par eux. Pensez-vous mieux utiliser les variables "extern"? –

Répondre

0

Essayez d'allouer pos_node sur le tas:

double **pos_node = calloc(in.N_node, sizeof(double*)); 
for (i = 0; i < in.N_node; i++) 
    pos_node[i] = (double *) calloc(3, sizeof(double)); 

void func(double **pos_node){....} 
+0

Cela semble fonctionner. Merci beaucoup! –

0

Vous devez allouer de la mémoire pour le pos_node ainsi:

double **pos_node = calloc (in.N_node, sizeof (double *)); 

(tableaux de longueur variable sont disponibles en C99, mais la plupart des gens n'aiment pas utiliser c99 encore)

Ensuite, devient facile de voir comment passer le tableau. Un tableau dans C est juste un bloc de mémoire, donc double *array[] peut tout aussi bien être écrit comme double **array: l'adresse d'un bloc de mémoire qui contient des adresses à doubler.

+0

Vous voulez dire quand allouer de la mémoire pour pos_node je devrais d'abord doubler ** pos_node = calloc (in.N_node, sizeof (double *)); puis faites pour (i = 0; i

Questions connexes