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 :

Comment une procedure peut renvoyer plusieurs valeurs


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Comment une procedure peut renvoyer plusieurs valeurs
    Bonjour!
    Je suis un nouveau en C.
    En fait je voudrais faire une procedure qui doit renvoyer plusieurs valeurs.
    Je fais comment pour renvoyer deux valeurs en C.
    Est ce que il est obligé de retourner un tableau avec les valeurs? Si c'est ce cas, comment je manipule?

    L'autre côté, je cherchee la fonction qui permet de quitter le procedure, l'exit() est un peu violant, parce que les destructeurs ne seront pas affectués.

    merci.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Comment une procedure peut renvoyer plusieurs valeurs
    Citation Envoyé par Jamlan
    En fait je voudrais faire une procedure qui doit renvoyer plusieurs valeurs.
    Pas de 'procédure' en C. Des fonctions uniquement...
    Je fais comment pour renvoyer deux valeurs en C.
    Utilise une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct data
    {
       int a;
       int b;
    };
     
    void f (struct data *p)
    {
       p->a = 123;
       p->b = 456;
    }
    Usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       struct data x;
     
       f (&x);
    Les valeurs sont dans x.a et x.b ...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut
    Une procedure ne renvoie pas de valeurs, a part au travers de ses arguments.

    Une fonction, elle, retourne une valeur, et d'autres au moyen de ses arguments.

    Si tu veux faire une procedure qui renvoie deux valeurs il faut faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void toto(int *v1, int *v2)
    la procedure toto prends en arguments deux entiers v1 et v2 qu'elle va modifier et qui donc seront utilisables par l'appelant qui va l'utiliser ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int valeur1, valeur2;
     
    toto(&valeur1, &valeur2);

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par barthelv
    Une procedure ne renvoie pas de valeurs, a part au travers de ses arguments.

    Une fonction, elle, retourne une valeur, et d'autres au moyen de ses arguments.
    Please !

    C != Pascal.

    Citation Envoyé par barthelv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void toto(int *v1, int *v2)
    2 pointeurs alors qu'un seul suffit... Et si il faut renvoyer 14 valeurs, tu mets 14 pointeurs ? Faut être un peu plus professionel que ça...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    2 pointeurs alors qu'un seul suffit... Et si il faut renvoyer 14 valeurs, tu mets 14 pointeurs ? Faut être un peu plus professionel que ça...
    Je suis d'accord avec toi, je donnais juste un cas TRES simple pour deux valeurs. Si il y en a plus, je suis d'accord que ta methode est bien meilleure

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je suis un nouveau en C.
    bienvenue à toi !

    En fait je voudrais faire une procedure
    Pas de procédure en C, que des fonctions.

    Est ce que il est obligé de retourner un tableau avec les valeurs?
    Ce n'est pas une solution envisageable

    Si c'est ce cas, comment je manipule?
    Euh, avec des gants ?

    Non, plus sérieusement, intuitivement, tu pourrais penser à celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct data fct()
    {
      struct data tmp;
     
      tmp.ch1 = 10;
      tmp.ch2 = 20;
     
      return tmp;
    }
    Néanmoins, même si celà est toléré par certains compilateurs, la norme t'interdit de renvoyer une structure. De plus, celà coûte énormément de renvoyer beaucoup de données d'une fonction.

    D'ailleur au passage, gcc te donne une option de compilation qui est :
    -Waggregate-return
    Pour te signaler ce genre d'erreur.

    La seule solution qui me semble envisageable et raisonnable c'est une solution à base de pointeur, dans ce cas, je me permet de te demander puisque tu es débutant si tu as vu les pointeurs ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Néanmoins, même si celà est toléré par certains compilateurs, la norme l'interdit de renvoyer une structure.
    La norme, non. Elle l'autorise depuis 1989. C'est le vieux C K&R de 1973 qui ne savait pas faire ça... Par contre, c'est déconseillé pour des structure d"une taille > un long.

    Les fonctions standards div() et ldiv() utilisent ce principe avec div_t et ldiv_t.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    La norme, non. Elle l'autorise depuis 1989
    Très bien donc, je me coucherai moins bête ce soir !

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Trop fort! Merci pour vous tous!

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2014, 21h54
  2. Réponses: 1
    Dernier message: 03/06/2011, 00h42
  3. [WD12] Renvoyer plusieurs valeurs à la fermeture d'une fenêtre
    Par Gaetch dans le forum WinDev
    Réponses: 17
    Dernier message: 19/02/2009, 11h20
  4. Réponses: 3
    Dernier message: 13/11/2008, 09h21
  5. Réponses: 4
    Dernier message: 27/07/2006, 16h47

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