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 :

[c] passage de paramètres par adresse


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut [c] passage de paramètres par adresse
    Bonjour,
    j explique mon problème.

    Actuellement mon programme est le suivant (en simplifié, je n ai mis que ce qui importe au problème que je rencontre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void){
    MonType *contenu = NULL;
    .
    .
    fonction1(&contenu);
    }
    Ceci marche très bien

    Mais désormais j aimerais avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void){
    MonType *contenu = NULL;
    .
    .
    fonction2(&contenu);
    }
     
    void fonction2(MonType *contenu)
    {
    fonction1(&contenu);
    }
    Mais là, il n y a plus de passage par adresse entre la fonction1 et la fonction2.

    ps: dites moi si je ne suis pas clair.
    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    vu que dans fonction2 tu as déjà l'adresse de "contenu" (du main) dans contenu, tu peux la passer directement à fonction1 :
    fonction1(contenu)

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ton programme semble assez confus quant à ce qui est une adresse ou non.
    Commence par regarder ceci:
    http://emmanuel-delahaye.developpez....difie_variable

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    de cette façon ça devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void){
    MonType *contenu = NULL;
    .
    .
    fonction2(&contenu);
    }
     
    void fonction2(MonType **contenu)
    {
    fonction1(contenu);
    }
    mais en fait non

    ps : ce tuto je l ai déja lu un paquet de fois , ça doit mal passer!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    si fonction2 recoit :
    MonType **contenu

    tu peux passer à fonction1 :
    *contenu qui contiendra l'adresse de contenu (du main)
    mais c'est assez confu d'apeller de la même manière 3 variables différentes
    Et tu n'as pas dis comment est déclaré fonction1

    Et comme on ne sait pas ce que font tes fonctions on ne sait pas si tu as besoin de l'adresse de contenu ou de l'adresse de *contenu (du main)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    en gros j ai contenu qui est un pointeur de stuctures et ce contenu est modifié par la fonction1.
    Quand la fonction1 est directement appelé dans le main c est niquel mais quand il y a une fonction (fonction2 par exemple) entre le main et fonction1 ba ça fonctionne plus.
    voila en gros

    ps : fonction1(MonType *contenu);
    ps2 : en fait je modifie contenu dans fonction1 et j ai besoin de contenu dans le main

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    alors tu peux faire fonction2(contenu)
    et dans fonction2 faire fonction1(contenu)

    avec les déclaration
    void fonction1(MonType * contenu)
    void fonction2(MonType * contenu)

    Tu n'a pas besoin passer &contenu vu que contenu est déjà un pointeur vers ta structure

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    bon en suivant le tuto ça me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main:
    int x
    fonction1(&x)
     
    void fonction1(int *x)
    et ça marche d ailleurs


    donc avec la meme logique ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main:
    int x
    fonction2(&x)
     
    fonction2:
    void fonction2(int *x)
    fonction1(&x)
     
    void fonction1(int **x)
    et ça marche
    finalement ça m a pas fait de mal de relire le tuto une fois de plus

    merci


    ps : si je passe par une 3eme fonction je devrais mettre :
    fonction3(int ***x) ??

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ca ne marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main:
    int x
    fonction2(&x)
     
    fonction2:
    void fonction2(int *x)
    fonction1(&x)
     
    void fonction1(int **x)
    Je ne sais pas ce que doit faire fonction1, mais dans tous les cas elle ne peut pas modifier la variable x du main : elle ne peut modifier que la variable locale x de fonction2 puisque c'est l'adresse de cette variable qui est passée en argument et qu'elle n'a rien à voir avec l'adresse du x du main.
    Si fonction1 doit pouvoir modifier le x du main, il faut lui passer l'adresse du x du main (qui est la valeur du x de fonction2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main:
    int x
    fonction2(&x)
     
    fonction2:
    void fonction2(int *x)
    fonction1(x)
     
    void fonction1(int *x)

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    bon je vais filer une partie du code parce que là vous m avez embrouillé

    en synthétique bien sur :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    typedef struct emplacement
    {
    int numero;
    char nom[30];
    float prix;
    int stock;
    struct emplacement * suivant;
    }Emplacement;
     
    typedef Emplacement * Magasin;
     
    int ajout_produit(Magasin *contenu);
    int menu_bdd(Magasin *contenu);
     
    int main(void)
    {
    Magasin contenu = NULL;//j ai caché le chargement du magasin, il n est pas vide en réalité
    ajout_produit(&contenu);
    return TRUE;
    }
     
    int menu_bdd(Magasin *contenu)
    {
    ajout_produit(contenu);
    return TRUE;
    }
     
    int ajout_produit(Magasin *contenu)
    {
    float prix;
    int stock;
    int numero;
    char nom[30] = "";//pareil ici il manque les fonctions qui renvoient les valeurs des champs
    Emplacement *truc2;
     
    truc2 = (Emplacement*) malloc(sizeof(Emplacement));
    truc2->suivant = *contenu;
    truc2->numero = numero;
    strcpy(truc2->nom,nom);
    truc2->prix = prix;
    truc2->stock = stock;
    *contenu = truc2;
    return TRUE;
    }
    donc du coup, j ai fait comme tu m as dit mais ça fonctionne hélas toujours pas.

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Er qu'est ce qui ne marche pas dans ce code ? Tout à l'air d'aller bien.
    (A part le return TRUE de main)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    c est bon ça marche en fait
    Je suis con, j ai placé mon point d'arrêt après une fonction qui enregistrait mon contenu dans un fichier binaire et désallouait le tout
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    typedef struct emplacement
    {
    int numero;
    char nom[30];
    float prix;
    int stock;
    struct emplacement * suivant;
    }Emplacement;
     
    typedef Emplacement * Magasin;
     
    int ajout_produit(Magasin *contenu);
    int menu_bdd(Magasin *contenu);
     
    int main(void)
    {
    Magasin contenu = NULL;//j ai caché le chargement du magasin, il n est pas vide en réalité
    menu_bdd(&contenu);
    return TRUE;
    }
     
    int menu_bdd(Magasin *contenu)
    {
    ajout_produit(contenu);
    return TRUE;
    }
     
    int ajout_produit(Magasin *contenu)
    {
    float prix;
    int stock;
    int numero;
    char nom[30] = "";//pareil ici il manque les fonctions qui renvoient les valeurs des champs
    Emplacement *truc2;
     
    truc2 = (Emplacement*) malloc(sizeof(Emplacement));
    truc2->suivant = *contenu;
    truc2->numero = numero;
    strcpy(truc2->nom,nom);
    truc2->prix = prix;
    truc2->stock = stock;
    *contenu = truc2;
    return TRUE;
    }
    Je met le code final si jamais quelqu'un se trouvait dans une situation similaire à la mienne.
    merci a tous

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2009, 23h46
  2. Réponses: 3
    Dernier message: 29/06/2007, 17h18
  3. Passage de paramètres par adresse
    Par Irish dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/02/2007, 17h39
  4. Passage de paramètre par adresse, pointeur
    Par spileo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/01/2007, 19h00
  5. Réponses: 19
    Dernier message: 09/06/2006, 10h03

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