[C++] valeur par défaut

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 nov. 2006 à 17:28
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 17 nov. 2006 à 14:50
Bonjour.
Voila mon problème :
je déclare une fonction ainsi :
void f(double&,double&,double);
maintenant, je souhaite avoir des valeur par défaut pour les deux derniers paramètres, je tape donc :
void f(double & a,double& b=1.2,double c=2.3){...}
le compilateur accepte bien le paramètre par défaut pour c, mais pas pour b. Le '&' le gène. Bien entendu, je veu pouvoir conservé le '&' car dans le cas ou il est fourni, b est modifié.
si quelqu'un à une idée pour résoudre ce problème, merci d'avance.

12 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
14 nov. 2006 à 17:35
Je ne pense pas que tu puisse passer comme cela une valeur par défaut dans ton entete de fonction, si tu veux la récupérer ensuite.

Essai tout simplement un truc du genre :
void f(double & a,double& b,double c=2.3){
  b = 1.2;   // --- Default start value
} 

1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 nov. 2006 à 10:36
Voici exatement ce que je tape :
void traite (char** a,double& b,double& c,const double &l=1.2,char* u)
{
...}

et l'erreur retourné :
traite.h:15: assignement of read-only reference 'l'
Mon compilo est gcc sous linux version 3.2.3
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 nov. 2006 à 09:36
Ou alors il faut utiliser des const références :
void f(const double & x,const double & y=2.3,const double & z=7.6){
  ...
}

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 nov. 2006 à 10:36
Merci.
En fait la solution de kij_82 ne conviens pas car à ce moment la on ne peut pas faire :
f(3.25) par exemple, car il manquerai un paramètre.
La solution de mamiemando ne conviens pas non plus, car le compilateur me dit qu'il est impossible d'assigner une valeur à une variable const.(en résumé)
quelque par, je comprend qu'il ne veuille pas m'accepter cette déclaration. Double& passe la référence à b. Si on ne met pas b, il faut alors créer une variable de type double qui prendra la valeur par défaut.
une dernière hypothèse serai d'utiliser les new, mais je suis peux familier avec ça.
un truc dans le genre de :
void f(double& a,double& b=new double(1.2))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 nov. 2006 à 23:57
La solution de mamiemando ne conviens pas non plus, car le compilateur me dit qu'il est impossible d'assigner une valeur à une variable const.(en résumé)

Chez moi ça compile sans problème
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 nov. 2006 à 14:49
Ben oui coco mais tu ne peux mettre des valeurs par défaut que pour les paramètres en fin de prototypes ! Or la ton char * n'a pas de valeur par défaut.
(mando@cobo) (~) $ cat plop.cpp
#include <iostream>

void f(const float & x,const float & y=6.9,const float & z=2.8){
        std::cout << x << ' ' << y << ' ' << z << ' ' << std::endl;
}

int main(){
        f(1.2);
        return 0;
}
(mando@cobo) (~) $ g++ -W -Wall plop.cpp
(mando@cobo) (~) $ ./a.out
1.2 6.9 2.8

Pour info c'est gcc 4.1.2 que j'utilise, mais je pense que ça n'a rien à voir avec la version de gcc sur ce coup

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 nov. 2006 à 16:32
oups, autant pour moi, j'ai oublié de recopier. En fait c bien :
void traite (char** a,double& b,double& c,const double &l=1.2,char* u=0)
{
...}
Le problème persiste...
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 nov. 2006 à 18:51
Pour un pointeur nul utilise plutot la constante NULL.
#include <iostream>

int f(const double & x,const double & y = 0,const char * z = NULL){
    std::cout << x << ' ' << y << ' ' << z << std::endl;
    std::cout << std::endl;
}

void traite (char** a,const double & b,const double & c,const double &l=1.2,char* u=NULL){
    std::cout << "*a=" << *a << std::endl;
    std::cout << "b=" << b << std::endl;
    std::cout << "c=" << c << std::endl;
    std::cout << "l=" << l << std::endl;
    std::cout << "u=" << u << std::endl;
    std::cout << std::endl;
}

int main(){
    f(1,2.5,"tapir");
    char * plop = "plop";
    traite(&plop,2.3,4.2,4.8,"mando");
    return 0;
}

A noter que envoyer NULL sur std::cout bloque l'écriture sur ce flux c'était peut être ton problème. Ca doit se régler avec un std::flush ou truc dans le genre.

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 nov. 2006 à 08:34
Je trouve que 0 est plus parlant que NULL surtout qu'il me semble bien que NULL est défini ainsi :
#define NULL 0
Mais bref, non, le problème persiste.
Pour t'en convaincre, j'ai fait
void fct(double& a,const double& ab=0.33)
{...}
et l'erreur de compilation est toujours
traite.h:15: assignement of read-only reference 'ab'
J'ai tester sur une deuxième machine (gcc 3.4.2) Si ce n'est pas la version de gcc, ça viens peux être d'une option.
mon fichier s'appel *.cpp, donc compiler en C++. Peut être qu'en C la commande passerai?
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
17 nov. 2006 à 09:48
Est-ce que le code que j'ai écrit dans <8> marche chez toi ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 nov. 2006 à 10:22
Salut.
Oui, il fonctionne. Merci. J'ai trouvé l'erreur. Elle viens du fait que je modifie l dans la suite(pb d'interprétation du message du compilo et de num de lignes). Remarque, en mettant le const je m'en doutait. mais comme ça ne compile pas sans le const...
J'en déduit, que mon pb n'a pas de solution simple.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
17 nov. 2006 à 14:50
Oui c'est ce que j'avais dit au post <2>.
0