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

Langages de programmation Discussion :

Pourquoi une seule valeur de retour pour les fonctions ?


Sujet :

Langages de programmation

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut Pourquoi une seule valeur de retour pour les fonctions ?
    Pourquoi C/C++/Pascal/Java ne proposent-ils pas la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Double, Double function1;
    {
       result 3, 4;
    }
    
    ...
    int a, b;
    
    a,b = function1;
    Est-ce pour des raisons de rapidité ?
    De possibilité ou d'impossibilité ?
    Pour imposer des bonnes pratiques de programmation ?
    ...

    Pourquoi ?

    [Edit]
    Bon vous m'aurez corrigé en fait je voulais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Double, Double function1;
    {
       result 3, 4;
    }
    
    ...
    Double a, b;
    
    a,b = function1;
    [/Edit]

  2. #2
    Expert confirmé
    Avatar de grafikm_fr
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 470
    Points : 5 059
    Points
    5 059
    Par défaut
    Pour faire plus propre et parce que rien ne t'empeche de retourner un tableau avec autant de valeurs que tu veux

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    En ce qui concerne le renvoi de tableau

    Super. En gros à chaque fois tu dois te taper de construire une structure. Je ne pense pas que tu fasses ça. J'imagine que tu passes par des pointeurs. Alors que je ne vois pas pourquoi le compilateur ne pourrait pas placer un peu d'assembleur pour simuler le renvoi d'un tableau.

    Ca serait plus propre plus simple (et peut-être plus rapide ?).

    Sinon tu dis plus propre, peux-tu développer ?

  4. #4
    Membre éclairé
    Avatar de hachesse
    Inscrit en
    Mars 2002
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 189
    Points : 651
    Points
    651
    Par défaut
    Une fonction est quelque chose de typé et valué
    Or ce que tu propose de faire c'est tout l'inverse.

    Au retour d'une fonction le but est d'avoir une valeur et une seule valeur dont tu connais le type.

    Dans tout les autres cas, tu passe par une procédure.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Si tu regardes mon code, ma fonction est typé fortement. La fonction renvoi deux doubles.

    Putain je me suis planté. a et b ca doit être des doubles bien sûr

    Et pour ce qui est de valué, Pourquoi ?

  6. #6
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Points : 638
    Points
    638
    Par défaut
    Au retour d'une fonction le but est d'avoir une valeur et une seule
    valeur dont tu connais le type.
    d'autant que cette valeur peut être une structure qui peut contenir
    des infos aussi nombreuses que disparates

  7. #7
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Une fonction renvoie une seule valeur. C'est par définition!

    Il y a différents moyens (déjà cités) pour renvoyer plusieurs valeurs : renvoie d'un tableau ou d'une structure. On peut aussi utiliser des procédures et passer en paramètre les variables à modifier (passage par référence).

    On peut écrire un langage qui renvoie deux valeurs. Mais le problème pour retourner 3 valeurs reste entier et les solutions sont tableau, struct et proc...

    Donc cela ne sert pas à grand chose de renvoyer deux valeurs...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Je connais les différentes techniques pour renvoyer plusieurs valeurs.

    La question est pourquoi par exemple Bjarne Stroustrup n'a pas défini dans la grammaire du C++ ce qu'il faut pour que l'on puisse renvoyer un nombre fixe de paramètres typés, le programmeur pouvant choisir ce nombre. De la même manière qu'une fonction à un nombre fixe de paramètres typés mais ce nombre peut être supérieur à 1.

    La question porte sur le pourquoi pas sur le comment.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Ca me paraît tellement évident que je ne me suis jamais posé la question, en fait... Mais maintenant que tu le dis...

    L'avantage d'une fonction, comme dit précédemment, c'est qu'elle est typée et valuée. La seule utilisation d'une fonction n'est pas celle que tu indiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = maFonction(monParamètre);
    On peut se servir d'une valeur de retour d'une fonction dans un autre appel de fonction sans avoir à passer par une variable, par exemple ! Ca, tu pourrais difficilement le faire avec ta méthode, ou alors ce serait tellement figé que tes codes seraient absolument inutilisables ailleurs...

    -Wintermute

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Winter je ne suis pas d'accord.

    Qu'est ce qui t'empêche de prévoir dans la grammaire de ton langage l'utilisation d'un crochet comme pour les tableaux.

    Soit tu veux utiliser la valeur de retour plusieurs fois => de toute façon tu devra stocker ta fonction dans une variable intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a = fonction1
    b = fonction2
    fonction3(a, b, 36)
    fonction4(a, b, 45)
    ou lancer plusieurs fois la fonction (le compilateur se chargeant de créer ou non une variable intermédiaire).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction3(fonction1, fonction2, 36)
    fonction4(fonction1, fonction2, 45)
    Donc tu te retrouves dans le cas
    variable = fonction
    Tu as donc moins de possibilités qu'avec ce que je propose

    Soit tu veux l'utiliser au sein d'une fonction et tu pourrais très bien faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction2(fonction1()[1], fonction1()[2]);
    //ou
    fonction2(fonction1);
    //au lieu de 
    fonction2(fonction1, fonction2)
    La différence est mineure au niveau de la syntaxe sauf que ce que je propose permet de faire des trucs en plus.
    En plus dans le premier cas tu peux faire jouer des optimisations moins complexes que dans le second cas




    Et je le répète, les fonctions que je propose sont typées alors ne l'utilisez pas comme argument svp.

  11. #11
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    je crois que ca viens surtout du fonctionnement en pile d'un langage proche de la machine. du coup, autant on peut mettre autant de données en entrée, autant on a toujours qu'une seule valeur sur la pile ! une seule sortie a la fonction

    ca doit s'expliquer comme ca.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Et où je pourrai trouver ce genre d'infos ?

  13. #13
    duj
    duj est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2003
    Messages : 141
    Points : 474
    Points
    474
    Par défaut
    Au fait, la première chose que je ferais le jour où un langage permettrait de retourner deux valeurs:

    Et pourquoi pas trois ?!

  14. #14
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    une question me taraude ... si tu as besoin de deux doubles tu peux toujours faire un enregistrement des deux doubles et pis voila , quelles seraient l intéret pratique d'un double renvoie de fct° ?

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    L'idée est pas mauvaise et astucieuse et je m'étais jamais posé la question.
    Pourquoi Bjarne de l'a pas implémenté ?
    Soit il n'y a pas pensé
    Soit effectivement ca n'est pas possible ou alors très pénalisant dans le cout CPU d'un appel de fonction (qui est déjà assez couteux comme ca )

    Le mieux c'est encore de lui demander directement

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par Bruno75
    La question est pourquoi par exemple Bjarne Stroustrup n'a pas défini dans la grammaire du C++ ce qu'il faut pour que l'on puisse renvoyer un nombre fixe de paramètres typés, le programmeur pouvant choisir ce nombre.
    Pour la même raison que le type des chaines de caractères n'est pas un type interne au C++ mais une classe définie dans une bibliothèque ?
    De plus, il y a longtemps qu'il n'est plus le seul à décider de l'évolution du C++ et de sa grammaire.

    Ce que tu cherches à faire compliquerait inutilement la tâche des développeurs de compilateurs (changement de la sémantique de l'opérateur virgule sur le return ce qui casse la compatibilité avec le C), compliquerait encore plus la mise en oeuvre de la RVO, ..., alors que c'est excessivement facile à faire par programmation.

    En ce qui me concerne, il y a plus important à faire d'abord. Genre avoir une move-semantics, chose justement en discussion pour la prochaine norme.

    Si tu t'interresses aux choix pris pour ce langage, tu peux regarder Design and Evolution of C++ qui date un peu je crois -- et je ne sais pas si il aborde ta question ou non. Sinon, je crois qu'un autre bouquin dans la même thématique est sorti, mais j'ai oublié son titre.

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Contacter directement Bjarne !!! ok. Tu me passes son portable ?

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Ca compliquerait excessivement la tâche des compilateurs, peut-être mais le but c'est de simplifier la tâche du programmeur en mettant du compliqué dans le compilateur. Par contre que ce ne soit pas prioritaire je veux bien l'admettre.

    Est-ce que tu pourrais développer un peu en quoi cela compliquerait la tâche du compilateur ? Après tout les fonctions peuvent bien avoir un nombre quelconque de paramètres.

    C'est amusant de constater que microsoft est capable de
    - pondre un nouvel os
    - développer dot net
    - créer deux langage c# et vb.net

    Et pourtant ils sont pas fichus de mettre les template !!!!

    Faut vraiment qu'on m'explique. Faire un compilateur est plus compliqué ?

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    L'adrese email de Bjarne Stroustrup est en clair, et tous les membres du comité fréquentent news:comp.lang.c++.moderated et on en a même quelques uns qui suivent fr.comp.lang.c++. Tu sais donc où poser ta question maintenant.

    Cela complique la tâche du compilateur qui devra faire le distingo sur l'utilisation de l'opérateur virgule lorsqu'il suit un return :
    - continuer à fonctionner normalement quand la fonction ne renvoie qu'une seule chose
    - renvoyer deux éléments au lieu d'un seul (le premier je crois ; contrairement à l'opérateur point-virgule) quand la fonction est cencée en renvoyer deux.

    Quelques part cela signifie qu'il faut gérer un nouveau genre le type : le type double, triple, .... Et donc permettre toutes les possibilités de conversion possibles quand il intervient. Et donc, la vérification précédente doit pouvoir intervenir n'importe où.
    Bref. C'est bien se compliquer la tâche alors qu'un tel dispositif se rajoute facilement par programamtion. Certes, c'est un peu plus verbeux, mais c'est aussi le cas quand on utilise les vecteurs plutôt que les tableaux C.
    Une recherche rapide sur tuple et C++ sur google donenra des liens vers quelques bibliothèques qui les implémente dont BOOST.

    Pour ce qui est des templates, c'est un véritable casse-tête à implémenter. Pour l'instant, il n'y a qu'un seul compilateur qui respecte la norme et implémente export pour les templates.

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Je mets résolu mais faut pas hésiter à rajouter qqs commentaires.
    Merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/09/2010, 13h09
  2. Réponses: 13
    Dernier message: 30/06/2008, 15h25
  3. Réponses: 10
    Dernier message: 02/05/2007, 10h19
  4. Problème de sous requête (retour d'une seule valeur)
    Par ero-sennin dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/06/2006, 11h12
  5. [VB6] Valeur de retour pour une Form
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/08/2004, 17h16

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