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 :

Retourner 2 pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut Retourner 2 pointeurs
    Voila j'aurai besoin d'une fonction qui prend 2 pointeurs en paramètre,
    qui en retourne un grâce au return mais je souhaiterai aussi récupérer le deuxième pointeur sur lequel j'ai fait des traitements et je ne sais pas comment faire
    merci pour votre aide

  2. #2
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    Est-ce que tu as modifié les pointeurs eux-mêmes, ou la valeur pointée ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    salut, tu devrais faire qqch du genre (si ne ne me trompe pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    T * p=f(T1 * p1,T2 * p2,T3 * p3)
    {
      T * p=malloc(sizeof(*T));
    assert(p!=NULL);
     
    blabla
    return p;
    }
    où T, T1, T2 et T3 sont 4 types (int, double etc....) et où tu ne modifies que les objets pointés par p3.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      T * p=malloc(sizeof(*T));
    assert(p!=NULL);
    assert n'est pas une bonne méthode pour tester l'échec de malloc. Cette macro ne génére aucun code si la macro NDEBUG est définie (mode release) donc généralement chez le client, où la loi de Murphy est reine

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut gege2061,
    vaut-il alors mieux que je fasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T * p=malloc(sizeof(*p));
    if(p==NULL) exit(EXIT_FAILURE);

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par salseropom
    vaut-il alors mieux que je fasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T * p=malloc(sizeof(*p));
    if(p==NULL) exit(EXIT_FAILURE);
    Oui, c'est mieux

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom
    Salut gege2061,
    vaut-il alors mieux que je fasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T * p=malloc(sizeof(*p));
    if(p==NULL) exit(EXIT_FAILURE);
    C'est possible, mais c'est brutal, surtout sans explication...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       T * p = malloc (sizeof *p);
       if (p == NULL) 
       {
          fprintf (stderr, "memory error at %s:%d\n", __FILE__, __LINE__);
          exit (EXIT_FAILURE);
       }
    Ce qui se termine généralement en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define PERR(msg)\
          fprintf (stderr, #msg " at %s:%d\n", __FILE__, __LINE__)
    ...
     
       T * p = malloc (sizeof *p);
       if (p == NULL) 
       {
          PERR ("memory error");
          exit (EXIT_FAILURE);
       }
    puis en
    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
     
    #define PERR(msg)\
          fprintf (stderr, #msg " at %s:%d\n", __FILE__, __LINE__)
     
    #define MYASSERT(exp)\
    do\
    {\
       if (!(exp)) \
       {\
          PERR (#exp " not asserted");\
          exit (EXIT_FAILURE);\
       }\
    }\
    while (0)
     
       T * p = malloc (sizeof *p);
       MYASSERT (p != NULL);
    (NON TESTE)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    je ne modifie que la valeur pointée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Maillon * GestionFic(Maillon *MaChaine, Maillon *MaChaineInverse)
    {
       FILE *pf = ouvrir_fichier();
     
       MaChaine = Lecture_Fic(pf, MaChaine);
     
       fermer_fichier(pf);
     
       return MaChaine;
    }
    en gros j'ai ça, mais je veux aussi récupérer MaChaineInverse, bon là j'ai pas mis le traitement associé.

  9. #9
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    Citation Envoyé par nunurs83
    je ne modifie que la valeur pointée.
    Alors tu n'as pas besoin de faire un return :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void f(T * p1, T * p2) {...}
     
    int main(void) {
     
      T *p1 = machin;
      T *p2 = truc;
      f(p1, p2);
      // Et tu continues avec *p1 et *p2 éventuellement modifiés.
     
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    et si je modifie les pointeurs eux-mêmes ?

  11. #11
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    Citation Envoyé par nunurs83
    et si je modifie les pointeurs eux-mêmes ?
    Ben tu les passes par adresse.

  12. #12
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Si tu modifies les pointeurs eux meme c'est que ce sont des parametres en mise à jour et il n'y a pas à les retourner
    Pour creer un parametre en mise à jour, il suffit de passer un pointeur sur celui-ci
    Ce qui revient à passer un T ** à ta fonction

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/10/2005, 17h25
  2. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  3. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  4. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 21h23
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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