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 :

Fonctions, entrée, sortie


Sujet :

C

  1. #1
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut Fonctions, entrée, sortie
    (Re)Bonjour.

    Voici mon code :

    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
     
    #include <stdio.h>
    int RecupDeuxVariables(int a, int b, int *c, int *d)
    {
            int tmp_add, tmp_sous;
            tmp_add = a + b;
            tmp_sous = a - b;
            c = &tmp_add;
            d = &tmp_sous;
    }
    main()
    {
            int *addition;
            int *soustraction;
            RecupDeuxVariables(30,10,addition,soustraction);
            printf("\n\n----------\nVerication\n----------\nAdd : %d\nSous : 
    %d\n\n", *addition, *soustraction);
    }
    Mon gros probleme, c'est que je n'arrive pas à récupérer mes variables de sorties de ma fonction RecupDeuxVariables...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ----------
    Verication
    ----------
    Add : 0
    Sous : 0
    Pourtant, il me semble que je définis bien les adresses des pointeurs... Ou alors je me trompe... ? Mais je ne trouve pas l'erreur.

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Tes variables tmp_ sont locales a la fonction. Elles sont detruites lors du retour de celle-ci. Il est donc ininteressant d'en prendre l'adresse.
    La solution est evidemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    *c = tmp_add;
    *d = tmp_sous;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int addition;
    int soustraction;
     
    RecupDeuxVariables(30,10,&addition,&soustraction);
    Tu as encore un peu de travail pour comprendre la gestion de la memoire en C, on dirait. Bon courage.

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu renvoies des pointeurs vers des variables temporaires qui sont détruites à la sortie de la fonction... fait plutôt :
    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
    #include <stdio.h>
    int RecupDeuxVariables(int a, int b, int *c, int *d)
    {
            *c = a + b;
            *d = a - b;
            return 0; //necessaire puisque ta fonction est déclarée comme renvoyant un int
    }
    main()
    {
            int addition;
            int soustraction;
            RecupDeuxVariables(30,10,&addition,&soustraction);
            printf("\n\n----------\nVerication\n----------\nAdd : %d\nSous : 
    %d\n\n", addition, soustraction);
    }
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #4
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Hum, mais je pensais qu'il était dangereux d'affecter une valeur à un pointeur non initialisé, car la valeur pouvait être stocker n'importe où en mémoire ?

    En tout cas, merci, c'est clair qu'il y a encore du boulot

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    le pointeur n'est pas non initialisé... il est passé en paramètre, ensuite c'est à celui qui appelle ta fonction de bien fournir des pointeurs qui soient utilisables (autrement dit, c'est au niveau de l'appel de fonction qu'il faut faire attention)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    quand tu fais, avant ta fonction
    ça crée un entier. cet entier n'est pas initilalisé et a donc une valeur quelconque. par contre, il existe et prend une place en mémoire. par conséquent,est un pointeur vers cet entier, sa valeur est l'adresse mémoire de l'entier. En gros, addition vaut n'importe quoi, mais &addition ne vaut pas n'importe quoi!

    dans ta fonction, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int RecupDeuxVariables(int a, int b, int *c, int *d)
    Donc c en particulier est un pointeur vers un entier. (c'est exactement la bonne façon de faire)
    Quand tu appelle ta fonction, tu lui passe l'adresse de addition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecupDeuxVariables(30, 10, &addition, &soustraction)
    donc dans ta fonction (pendant son execution), c "pointe vers addition" (c est un pointeur donc la valeur est l'adresse de addition.

    Ainsi, une fois que tu as calculé la valeur que tu souhaite donner à la variable addition (donc temp_add), il ne te reste qu'à insérer cette valeur à la bonne place. Soit à la place de addition, soit là ou pointe c.
    Ainsi, apres l'execution de la fonction, temp_add n'existe plus, mais tu as au préalable copié sa valeur. C'est la seule méthode d'avoir un paramètre de sortie dans une fonction en C.

    J'espère que ça t'aide plus que ça ne t'embrouille
    Bonne chance pour la suite

  7. #7
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Merci pour ces explications.
    Vous êtes bien pédagogues.

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

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

Discussions similaires

  1. Utiliser les fonctions d'entrée-sortie
    Par nounou_bazaid dans le forum Débuter
    Réponses: 6
    Dernier message: 11/03/2012, 15h23
  2. Pointeurs parametres fonction entrée/sortie
    Par SgtBor dans le forum Débuter
    Réponses: 6
    Dernier message: 19/04/2010, 14h36
  3. Entrées sorties fonction.
    Par emprex dans le forum Débuter
    Réponses: 4
    Dernier message: 26/04/2008, 11h13
  4. Réponses: 11
    Dernier message: 13/10/2004, 00h58

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