6
votes

Array de pointeurs en tant que paramètre de fonction

J'ai une question de base sur la matrice et le pointeur en C / C ++.

dire que j'ai: p> xxx pré>

Comment passer le FOOPTRARRAY code > dans une fonction? J'ai essayé: p> xxx pré>

Comment puis-je traiter avec le tableau de pointeur? P>

EDIT: STRUT> I une fois que l'erreur msg est de passer le mauvais tableau de pointeur, mais de toutes les réponses, je me rendrai compte que c'est autre chose ... (affectation du pointeur) p> xxx pré>

Je ne comprends pas vraiment pourquoi : Foo * * à foo * [4]. Si comme paramètre de fonction, ils sont inter-changements entre eux, pourquoi pendant la mission, il me donne une erreur de compilation? P>

J'ai essayé de dupliquer le message d'erreur avec le code minimum comme suit: P>

#include <iostream>

using namespace std;

struct Foo
{
int id;
};

void getResult(Foo** fooPtrArray)
{
cout << "I am in getResult" << endl;
Foo* fooPtrArray1[4];
fooPtrArray1 = fooPtrArray;
}

int main()
{
Foo* fooPtrArray[4];
getResult(fooPtrArray);
}


2 commentaires

Définir "Échec". Échec de la compilation? à l'exécution? Comment, exactement (ou vaguement, ça ne me dérange pas)?


Je joins mon code coupé comme ci-dessus, c'est une erreur de compilation. L'erreur vient de l'intérieur de la fonction Void getResult (FOO * * FOOPTRARAY)


5 Réponses :


13
votes

Les deux xxx pré>

et p> xxx pré>

ainsi que p> xxx pré>

va Travailler parfaitement bien (ils sont tous équivalents). P>

Il n'est pas clair de votre question quel était le problème. Qu'est-ce qui a échoué "? P>

Lorsque vous passez des matrices de passage comme celui-ci, il est généralement logique de passer également le nombre d'éléments, car l'astuce avec le type de tableau de caractères est normalement utilisée spécifiquement pour permettre des réseaux de passage de différentes tailles p> xxx pré>

mais si vous allez toujours passer des tableaux d'éléments strictement 4, il pourrait être une meilleure idée d'utiliser un pointeur typé différemment en tant que paramètre P >

int getResult(Foo* (&fooPtrArray)[4]);
...
Foo* array[4];
getResult(array);


4 commentaires

Cela semble intéressant: int getresult (foo * (* facoprarray) [4]) avec deux astérisques et une paire de support. Est-ce exact?


Oui c'est correct. Mais en C ++, une référence (au lieu d'un pointeur) pourrait être plus appropriée dans ce cas (voir les commentaires adidtions dans la réponse).


Pourriez-vous élaborer comment FOO * (& FOOPTRARRAY) [4] est analysé et comment vous appelleriez-vous sur le corps de la fonction?


@splicer: FOOPTRARRAY Dans ce cas est une référence à un tableau de 4 pointeurs sur foo . Dans la fonction, il serait utilisé dans la voie "habituelle", comme facoptrarray [3] = 0 . Ce n'est pas différent du premier groupe de variantes, à l'exception du type de matrice est conservé (non décroissé à un pointeur), ce qui signifie que vous pouvez faire Tailleof FOOPTARARRAY / TAILLEOF * FOOPTRARRAY et obtenez 4 comme résultat. Encore une fois, ce paramètre n'est compatible que avec des arguments à 4 éléments.



0
votes

Ces deux signatures de fonction ressemblent à elles devraient fonctionner. Lorsque vous appelez la fonction, vous feriez quelque chose comme ceci:

int returnValue;
returnValue = getResult(fooPtrArray);


0 commentaires

2
votes

Qu'est-ce que vous avez déclaré avec la ligne suivante:

for (int i=0; i < arraySize; i++)
{
    Foo* fooPtr = fooPtrArray[i];
    if (fooPtr)
    {
        fooPtr->memberFunction();
        fooPtr->memberVariable;
    }
}


0 commentaires

0
votes

Le top One compile OK:

http://codepad.org/kocnpmtv

Le second est ok aussi:

http://codepad.org/7osqpryi


0 commentaires

0
votes

Je ne vois pas comment cela peut compiler sans INT renvoyé ?!

@kinopiko Votre code ne compile pas en C ++.

@lily Quel est le message d'erreur que vous obtenez? Dans votre exemple GetResult doit renvoyer un int. C'est probablement ce qui échoue.


0 commentaires