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 :

Changement de signature d'une fonction : déplacement dans une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Par défaut Changement de signature d'une fonction : déplacement dans une classe
    Bonjour à tous,

    Je veux faire quelque chose d'assez simple à priori : je veux transformer une fonction qui prend en argument une matrice et un vecteur en une fonction membre de ma classe matrice (qui s'appelle creuse) qui ne prend plus qu'un vecteur en argument.

    Comme ma fonction utilise plusieurs classes et que je ne comprends pas le problème j'ai un peu de mal à le réduire à un problème minimal. Je propose plutot une comparaison avant/après:

    Voici le code avant (qui marche très bien):
    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
    19
    20
    21
     
    vecteur gradientConjugue(creuse ma, vecteur b){
      vecteur rep(b.getsize()); double epsilon=0.000001;
      vecteur reste(ma.prod(rep)-b);
      vecteur proj(ma.prod(rep)-b);
      int compt=1;
     
      while(compt<=200000 && reste.normeCarre()>=(epsilon*epsilon)){
     
        double alpha=reste.normeCarre()/produitScalaire(proj,ma.prod(proj));
        double aux=reste.normeCarre();
        rep=rep-prod(alpha,proj);
        reste=reste-prod(alpha,ma.prod(proj));
        double beta=reste.normeCarre()/aux;
     
        proj=reste+prod(beta,proj);
        compt=compt+1;
      }
      std::cout << compt;
      return rep;
    }

    et le code après:
    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
    19
    20
     
    vecteur creuse::gradientConjugue(vecteur b){
      vecteur rep(b.getsize()); double epsilon=0.000001;
      vecteur reste(this->prod(rep)-b);
      vecteur proj(this->prod(rep)-b);
      int compt=1;
     
      while(compt<=200000 && reste.normeCarre()>=(epsilon*epsilon)){
        double alpha=reste.normeCarre()/produitScalaire(proj,this->prod(proj));
        double aux=reste.normeCarre();
        rep=rep-prod(alpha,proj);
        reste=reste-prod(alpha,this->prod(proj));
        double beta=reste.normeCarre()/aux;
     
        proj=reste+prod(beta,proj);
        compt=compt+1;
      }
      std::cout << compt;
      return rep;
    }

    j'ai un message d'erreur à la ligne rep=rep-prod(alpha,proj) qui me dit que je fournis double& et vecteur& et qu'il n'y a pas de fonctions avec une telle signature (ma fonction prod prend en argument un double et un vecteur , cf code qui marche bien).
    Ceci doit mettre en lumière ma non compréhension des references parceque je pense bien fournir un double et un vecteur, et puis une reference étant un alias de l'objet je ne vois pas comment il peut interpreter que je lui donne une reference.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    n'aurais-tu pas une méthode de creuse qui s'appelle prod() et qui quels que soient ses paramètres masquerait la visibilité de la fonction globale prod()?
    Dans ce cas remplace la ligne par :
    rep = rep - ::prod( alpha , proj );

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Par défaut
    Bonjour,

    C'est bien ça merci beaucoup !!
    Cependant je ne comprends pas pourquoi il y a ce problème de visibilté, les deux méthodes ont le même nom mais pas la même signature donc d'après ce que j'avais compris jusqu'ici le compilateur devrait pouvoir faire la difference?
    Merci encore en tout cas!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Sans voir la déclaration des fonctions en cause, difficile à dire.
    La signature d'une fonction dépend de son nom, l'ordre et le type des paramètres.
    Si le compilo a accès à 2 fonctions avec la même signature - ce qui est déjà source d'erreur pour le programmeur -, il choisira celle étant le plus proche en portée (namespace local avant global), éventuellement sortira un warning dans le meilleur des cas, pour indiquer qu'il y a embrouille.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Par défaut
    merci pour votre réponse mais la signature n'est pas la meme justement:

    l'une est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vecteur prod(double alpha, vecteur vec);
    l'autre est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vecteur creuse::prod(vecteur vec)

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Le système cherche un nom indépendamment de la visibilité.
    si plusieurs, le plus 'proche' est choisi (p.e. choix parmi les classes de base, choix du namespace)
    puis dans la liste des possibilités trouvées à ce niveau, les paramètres sont résolus.
    Si plusieurs restent éligibles, on prend celui nécessitant le 'moins' de conversions (s'il n'est finalement pas accessible il y aura erreur)
    Il y a eu une évolution de la norme car la simple recherche sur la signature amènait des cas trompeurs.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/03/2009, 13h36
  2. [AJAX] [XAJAX] Lancer une fonction JS dans une fonction AJAX
    Par sixieme-sens dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/12/2008, 15h26
  3. Réponses: 1
    Dernier message: 25/10/2007, 21h25
  4. Réponses: 10
    Dernier message: 18/04/2007, 17h17
  5. [VBA-E] Une fonction Excel dans une fonction VBA
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/07/2006, 10h21

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