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 :

Passer un pointeur sur un tableau de structure en paramètre


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut Passer un pointeur sur un tableau de structure en paramètre
    Bonjour,

    je n'ai pas trop l'habitude du C++ et des pointeurs
    et là je galère un peu pour passer un pointeur sur un tableau de structure en paramètre d'une méthode

    donc j'ai une variable
    MA_STRUCT tab[size];

    je voudrais donc passer un pointeur sur cette variable en paramètre d'une méthode qui va me la compléter...
    mais comment faire??
    quel doit être le prototype de la méthode en question??
    ...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Le paramètre devrait être de type MA_STRUCT*, je pense.
    Il faudra que tu passes également la taille du tableau.

    Ou alors utiliser un vector, de la STL.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par melleb Voir le message
    donc j'ai une variable
    MA_STRUCT tab[size];

    je voudrais donc passer un pointeur sur cette variable en paramètre d'une méthode qui va me la compléter......
    « MA_STRUCT tab[size]; » n'est pas une variable mais un tableau de variables. En l'occurence, tes variables contenues dans ton tableau sont de type MA_STRUCT.

    Un tableau, en C et C++, est matérialisé par un pointeur qui contient l'emplacement de la première case. L'indexation avec les crochets se fait ensuite en ajoutant n fois la taille de la structure à l'adresse de départ. Un tab[5], par exemple, est équivalent à un *(tab+5). Tu peux donc utiliser un pointeur comme tableau et vice-versa.

    Ça veut dire également que tu peux passer n'importe quelle variable, aussi longue soit-elle, en argument de méthode ou de fonction, mais pas un tableau, car c'est en fait le pointeur sur ce tableau que tu vas passer. Ta méthode pourra alors y accéder, mais elle travaillera sur les données originales, comme s'il s'agissait d'un passage par référence, car seul le pointeur aura été dupliqué localement.

    Mais, pour faire simple, si tu veux passer une variable ou un pointeur à une méthode ou à une fonction, tu déclares simplement l'argument comme étant du même type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int x;
    MaClasse::MaMethode (int param);
    
    
    
    
    
    MA_STRUCT tab [50];
    MaClasse::MaMethode (MA_STRUCT param []);
    
    voire même directement
    
    MaClasse::MaMethode (MA_STRUCT * param);
    Tu peux passer la taille entre crochet à la déclaration de ta méthode, mais comme seul le pointeur sera passée et qu'aucune place ne sera allouée ni à la déclaration de la classe, ni à l'instanciation d'un objet de ce type, elle sera simplement ignorée.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Le mieux reste quand-même d'utiliser un vector de la lib standard (voir la faq.).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par r0d Voir le message
    Le mieux reste quand-même d'utiliser un vector de la lib standard (voir la faq.).
    Je suis d'accord.
    Mais bon : d'abord les bases, ensuite les outils qui font gagner du temps et qui permettent d'éviter les erreurs. :-)

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    taratata.
    Il bien plus productif d'apprendre à se servir d'abort d'un std::vector que d'un tableau a la main.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Il bien plus productif d'apprendre à se servir d'abort d'un std::vector que d'un tableau a la main.
    Je ne suis pas tout a fait d'accord.

    Il faut d'abord avoir géré des listes doublement chainées à la main avec la gestion des pointeurs et des libérations (et puis c'est formateur), pour se rendre compte que finalement std::list, c'est cool.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je ne suis pas tout a fait d'accord.

    Il faut d'abord avoir géré des listes doublement chainées à la main avec la gestion des pointeurs et des libérations (et puis c'est formateur), pour se rendre compte que finalement std::list, c'est cool.
    C'est aussi à double tranchant. On peut prendre le pli de coder du C en C++ lorsqu'on retravaille sur les types de base. Avec les librairies STL et boost, on est tout de suite dans une orientation C++. Du coup, ca peut être plus formateur pour prendre le réflexe objet.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Ravie que mon pb ait déclenché ce ptit débat

    mais comme ça :
    Citation Envoyé par Obsidian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaMethode (MA_STRUCT param []);
    ça marche et ça me va...

    Merci...

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

Discussions similaires

  1. Pointeur sur un tableau de structures
    Par klakman dans le forum Débuter
    Réponses: 7
    Dernier message: 28/09/2009, 11h06
  2. Réponses: 5
    Dernier message: 21/09/2008, 09h45
  3. [x86_64] Passer un pointeur sur tableau défini dans .data
    Par khazna dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 24/04/2008, 19h49
  4. Réponses: 8
    Dernier message: 30/05/2006, 01h26
  5. Références et pointeurs sur un tableau
    Par smag dans le forum C++
    Réponses: 2
    Dernier message: 01/03/2005, 20h29

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