2012-02-21 2 views
1

Dans un fichier d'en-tête de l'API que je trouve une déclaration de fonction étrange:Comment appeler une fonction avec ce paramètre: fun (Ty param [NUM])?

void API_GetParameter(API_SOMESTRUCT param[API_NUM_CONST]); 

API_NUM_CONST est une valeur ENUM et API_SOMESTRUCT est un struct, donc je suppose que param est un tableau de cette struct.

La fonction attend donc un champ de données existant qu'elle remplit ou modifie. Je ne peux pas dire ce que fait la fonction API en interne.

En ce moment, mon code ressemble à ceci:

API_SOMESTRUCT *param = new API_SOMESTRUCT[API_NUM_CONST]; 
API_GetParameter(param); 
// ... read out param 
delete[] param; 
param = NULL; 

Mais je soupçonne que ce morceau de code pour être responsable d'une erreur de corruption de tas, je suis récemment obtenir et je ne sais pas si mon appel est correct.


Je comprends les en-têtes de fonction avec des tableaux non const pour les paramètres qui ressemblent à ceci:

void fun(int *arr); // expects a pointer to a non-const int array of arbitrary size... 
  • Alors, quelle est la signification exacte de la déclaration de la fonction API? Le numéro param est-il appelé par valeur ou par référence?
  • Et comment j'appelle correctement cette fonction?

Répondre

1

Déclaration void f(int x[3]); est le même que void f(int *x); Ainsi, la fonction doit recevoir un pointeur valide pour API_SOMESTRUCT. Sinon, vous ne pouvez pas savoir ce qu'il va faire, combien d'éléments il attend, ou ce qu'il va en faire. Vous devez lire la documentation.

Si je devais deviner, je suis passé dans un tableau de API_NUM_CONST éléments, il suffit alloué sur la pile:

API_SOMESTRUCT param[API_NUM_CONST] 
API_GetParameter(param); 
// use param 
+0

« void Déclaration f (int x [3]); est la même chose que void f (int * x); ' -> La première déclaration ne spécifie-t-elle pas alors la taille du tableau? Ou est-ce juste un indice? –

+1

Selon la taille de la structure et le nombre d'éléments, il peut être plus approprié de déclarer un 'std :: vector v (API_NUM_CONST);' et de passer un '& v [0]'. –

+3

@Martin Dans une déclaration de fonction comme 'int i [3]', le '3' est un commentaire pur; ceci est converti par le compilateur en 'int * i', et' int i [3] 'et' int i [100] 'sont du même type. –

Questions connexes