Rechercher : dans
Par :

[C++] valeur par défaut

Dernière réponse le 17 nov 2006 à 14:50:19 Char Snipeur, le 14 nov 2006 à 17:28:33 
 Signaler ce message aux modérateurs

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. Salutation !
Char Snipeur

Meilleures réponses pour « [C++] valeur par défaut » dans :
Les fonctions en C++ : surcharge et paramètres par défaut. Voir Les fonctions en C++ : surcharge et paramètres par défaut. 1. La surcharge de fonctions et méthodes de classes, dont le constructeur 2. Utilisation des paramètres par défaut En C++, une même fonction ou méthode de classe peut être...
Modifier l'application par défaut à l'ouverture d'un fichier VoirQuand vous double-cliquez sur un fichier, une action par défaut est exécutée. (Par exemple, si vous double-cliquez sur un fichier .jpg, c'est la visionneuse d'image "Eye of Gnome" qui est lancée). Il est très facile de changer les actions par...
Changer le chemin par défaut d'enregistrement des documents Word VoirBonjour! Vous avez déjà remarqué que lorsque vous voulez enregistrer votre document Word, le chemin d'enregistrement par défaut est: C:\Users\votre_nom_d'utilisateur\Documents. Eh bien, il est possible de changer ce chemin vers un dossier de votre...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...

1

kij_82, le 14 nov 2006 à 17:35:10

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
} 

~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

2

mamiemando, le 15 nov 2006 à 09:36:59

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

Répondre à mamiemando

3

Char Snipeur, le 15 nov 2006 à 10:36:00

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)) Salutation !
Char Snipeur

Répondre à Char Snipeur

4

mamiemando, le 15 nov 2006 à 23:57: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

Répondre à mamiemando

5

Char Snipeur, le 16 nov 2006 à 10:36:33

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 Salutation !
Char Snipeur

Répondre à Char Snipeur

6

mamiemando, le 16 nov 2006 à 14:49:40

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

Répondre à mamiemando

7

Char Snipeur, le 16 nov 2006 à 16:32:15

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... Salutation !
Char Snipeur

Répondre à Char Snipeur

8

mamiemando, le 16 nov 2006 à 18:51:05

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

Répondre à mamiemando

9

Char Snipeur, le 17 nov 2006 à 08:34:44

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? Salutation !
Char Snipeur

Répondre à Char Snipeur

10

mamiemando, le 17 nov 2006 à 09:48:05

Est-ce que le code que j'ai écrit dans <8> marche chez toi ?

Répondre à mamiemando

11

Char Snipeur, le 17 nov 2006 à 10:22:40

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

12

 mamiemando, le 17 nov 2006 à 14:50:19

Oui c'est ce que j'avais dit au post <2>.

Répondre à mamiemando