IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Transmission de pointeur par référence


Sujet :

C++

  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut Transmission de pointeur par référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <iostream>
    using namespace std;
     
    void creation ( int dim, ???????? )
    {    // dim est la dimension du tableau d'entiers à créer
        // Que mettre à la place de ?????? pour transmetre le 
        //pointeur sur entier "tableau" par référence à la variable locale "tab"?
        cout << "     Début de creation" << endl;
     
        tab = new int [ dim ];
        for ( int i=0; i<dim; i++ )
            tab[i] = i*i+1;    // affectation pour debug
     
        cout << "     Fin de creation" << endl;
    }
    void main ()
    {
        int dimension;    // Dimension du tableau
        int *tableau =0;// Tableau à créer
     
        cout << "Saisir la dimension du tableau : ";
        cin >> dimension;
     
        creation ( int dimension, ?????? );
     
            for ( int i=0; i<dimension; i++ )
                   cout << "tableau[" << i << "]=" << tableau[i] << endl;
     
        system ( "pause" );
     
            delete tableau;
    }
    Voici le problème d'un grand débutant en C++:
    Je commence par créer un pointeur sur entier dans "main" : "tableau".
    Je veut créer une fonction "creation" qui, une fois exécutée, doit faire pointer le pointeur "tableau" sur un tableau d'entiers de "dimension" valeurs.
    Je ne trouve par comment transmettre par référence un pointeur à une fonction pour faire ça!!!
    Si c'est maladroit, comment faire autrement. Le but étant tout de même de faire attribuer le tableau dynamique au pointeur par une fonction.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par bertry Voir le message
    Si c'est maladroit, comment faire autrement. Le but étant tout de même de faire attribuer le tableau dynamique au pointeur par une fonction.
    Un débutant devrait utiliser vector, pas allouer manuellement de la mémoire. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <vector>
     
    void main ()
    {
        int dimension;    // Dimension du tableau
     
        cout << "Saisir la dimension du tableau : ";
        cin >> dimension;
        std::vector<int> tableau(dimension);
        for ( int i=0; i<dimension; i++ )
            cout << "tableau[" << i << "]=" << tableau[i] << endl;
        system ( "pause" );
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut, et bienvenue sur le forum.

    Déjà, tu pourrais, tout simplement, envisager de renvoyer un pointeur sur le premier élément du tableau créé, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int* creation(int dim)
    {
        cout << "     Début de creation" << endl;
        int* tab = new int [ dim ];
        for ( int i=0; i<dim; i++ )
            tab[i] = i*i+1;    // affectation pour debug
     
        cout << "     Fin de creation" << endl;
     
    }
    qui s'utiliserait sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int main ()
    {
        int dimension;    // Dimension du tableau
        int *tableau =0;// Tableau à créer
     
        cout << "Saisir la dimension du tableau : ";
        cin >> dimension;
     
        tableau = creation ( dimension );
     
            for ( int i=0; i<dimension; i++ )
                   cout << "tableau[" << i << "]=" << tableau[i] << endl;
     
        system ( "pause" );
     
            delete tableau;
    }
    Sinon, il faut envisager de passer une référence sur un pointeur (et non un pointeur sur une référence, ce qui est interdit), ce qui donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void  creation(int dim, int*& tab)
    {
        cout << "     Début de creation" << endl;
        tab = new int [ dim ];
        for ( int i=0; i<dim; i++ )
            tab[i] = i*i+1;    // affectation pour debug
     
        cout << "     Fin de creation" << endl;
     
    }
    et qui serait utilisé sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int main ()
    {
        int dimension;    // Dimension du tableau
        int *tableau =0;// Tableau à créer
     
        cout << "Saisir la dimension du tableau : ";
        cin >> dimension;
     
        creation ( dimension, tableau);
     
            for ( int i=0; i<dimension; i++ )
                   cout << "tableau[" << i << "]=" << tableau[i] << endl;
     
        system ( "pause" );
     
            delete tableau;
    }
    La dernière solution nous vient en droite ligne du langage C et utiliserait un... pointeur de pointeur... mais bon, il n'est pas des plus évident d'avoir à les gérer.

    Remarque au passage que la fonction main() doit renvoyer un entier...
    Cela signifie que les deux prototypes admis sont
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char * argv[])
    Remarque également que, lors de l'appel d'une fonction, il ne faut pas indiquer le type de la variable que tu fournis en paramètre

    Ainsi l'appel à la fonction creation(int, int*&) se fait simplement sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    creation(dimention, tableau);
    où dimention est la variable représentant la taille du tableau à créer et tableau est la variable représentant le pointeur recevant l'adresse du premier élément du tableau

    [EDIT]En outre, Jolyloic a parfaitement raison: l'idéal est toujours d'utiliser les classes conteneurs fournies par le standard, plutot que de devoir s'amuser à gérer l'allocation dynamique de la mémoire par soi-même...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Ok je vais regarder comment marche "vector" pour comprendre ta méthode. C'est probablement une bonne méthode.
    Mais ça ne me dis pas comment transmettre un pointeur par référence. C'est surtout ça que je cherche à faire.
    Merci JolyLoic.

    Merci Koala01 Je vais étudier tes suggestions de près, à première vue, il semble que tu m'ai donné la réponse que je cherchai.

    [EDIT]
    Merci koala, ta deuxième suggestion correspond parfaitement à ce que je cherche. Merci pour le coup de main.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/08/2008, 17h13
  2. Retour par référence d'un pointeur
    Par FunkyTech dans le forum C++
    Réponses: 16
    Dernier message: 22/07/2008, 13h56
  3. Passage par référence/pointeur
    Par NiamorH dans le forum C++
    Réponses: 5
    Dernier message: 15/07/2008, 10h05
  4. Réponses: 10
    Dernier message: 27/06/2008, 14h16
  5. Réponses: 11
    Dernier message: 20/08/2007, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo