1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : avril 2014
    Messages : 10
    Points : 7
    Points
    7

    Par défaut Récupérer une valeur calculée dans un autre .cpp

    Bonjour,

    Mon problème est sans doute redondant mais étant donné que je suis novice en C++ je n'arrive pas à trouver de solution qui me convienne. Du coup j'en profite pour m'excuser en avance des erreurs de syntaxe, techniques et même très générales sur ce langage.

    Je modifie actuellement un programme pour étoffer un peu le software et pour cela j'ai besoin de récupérer dans des données dans l'interface utilisateur. Je souhaiterais que la fonction créée retourne une valeur je la crée en int dans l'en-tête de telle sorte que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class: MaClasse:public
    {
      public slots:
        int MaFonction(int);
      }
    }
    Puis dans le .cpp je rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaClasse::MaFonction(int){
     int Var1= boxVar1->value();
     return Var1;
    }
    Enfin dans un autre .cpp j'appelle cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int Var2
    int Var3=MaClasse().MaFonction(Var2);
    Il y a sans doute beaucoup d'erreurs ici mais je ne vois pas comment récupérer Var1. (En réalité il y en aurait plusieurs mais ce n'est pas tellement un problème majeur pour moi actuellement de retourner un tableau).
    Puis-je d'ailleurs éviter de passer par Var2 et Var3 (j'imagine qu'il y a largement de quoi optimiser ça)
    Vous avez le droit d'être choqués

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 825
    Points : 15 680
    Points
    15 680

    Par défaut

    Je ne vois pas ton soucis, la valeur de var1 est retournée par la fonction, donc à l'appel, var3 contient la valeur de var1.

    Comme ta fonction n'utilise pas son argument, tu peux la définir sans. En faisant ainsi, tu peux te passer de var2.
    Par contre, var1 est un détail de la fonction, elle n'existe pas pour le code appelant.

    Pour aller plus loin, les variables sont des vues de l'esprit.
    Toutes les variables constantes n'ont aucun prix sur l'optimisation, le compilateur se débrouille déjà très bien avec.
    Et dans le code compilé, il n'y a pas de variables à proprement parler.
    Seules existe en mémoire des variables locales actuellement accessible (la pile) et celles allouées à part (le tas).
    L'espace des variables locales est recyclé très régulièrement (à chaque fonction).

    Ce qui coûte en mémoire, ce sont les grosses allocations, les allocations sur le tas jamais libérées (les fuites mémoires).
    Ce qui coûte en rapidité, ce sont les opérations, et cela s'optimise en changeant d'algorithme (pour réduire les complexités) et en simplifiant les calculs.


    Par contre, plusieurs choses dans ta syntaxe me font penser que ce n'est pas que du C++, comme le public slot:, par exemple.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2015
    Messages : 49
    Points : 40
    Points
    40

    Par défaut

    Du public slot c'est bel et bien du C++, si bien sur notre chèr ami utilise la (meilleure) bibliothèque Qt.

    mais en ce qui concerne le reste du code je ne saurais dire. la façon dont tu declares les classes ou bien ta façon de faire de l'heritage, je suis vraisemblablement choqué .

    Mais en admettant que ce soit du C++ (meme si j'en doute aussi sérieusement) je dirais que pour avoir la main sur une autre variable qui se trouve dans un autre fichier, il y'a la possibilité d'utiliser le mot clé extern. je pense que lui c'est un héritage du C. renseignes toi dessus. mais sinon tu peux tout simplement te créer des headers et y mettre les prototypes de tes fonctions à l'interieur puis tu fais des includes. mais je pense que le mot clé extern suffit s'il s'agit juste d'une variable.

    Mais sinon moi personnellement je ne peux me permettre de trop commenter ton code parce que le coté syntaxe c'est pas vraiment trop ça.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : avril 2014
    Messages : 10
    Points : 7
    Points
    7

    Par défaut

    Merci de vos réponses rapides !

    Oui oui c'est bien sous Qt ! M'enfin du peu que je connais de C++ ça me paraît en être quand même.

    mais en ce qui concerne le reste du code je ne saurais dire. la façon dont tu declares les classes ou bien ta façon de faire de l'heritage, je suis vraisemblablement choqué .
    Je n'en doute pas une seconde.

    Je ne vois pas ton soucis, la valeur de var1 est retournée par la fonction, donc à l'appel, var3 contient la valeur de var1.
    Oui mais ça ne fonctionne pas dans mon cas. Le problème doit plutôt venir de la valeur qui s'affecte à boxVar1 du coup, sans doute dans le .ui qu'il faut que je regarde. Mais surtout que ça fonctionne pour d'autres fonctions plus ou moins similaires mais je n'arrive pas à reprendre le même mécanisme...

    il y'a la possibilité d'utiliser le mot clé extern
    De ce que j'ai compris en fouillant un peu ça me sert à déclarer une fonction que je peux utiliser partout à ma guise mais pas la valeur. Ce qui m'intéresse ici c'est que la valeur qui m'est retournée dans un fichier .cpp soit lisible dans un autre. Après oui si la fonction est définie pourquoi pas mais je n'y arrive pas en tout cas. De toute façon avec le extern j'ai un beau illegal storage

    mais sinon tu peux tout simplement te créer des headers et y mettre les prototypes de tes fonctions à l'interieur puis tu fais des includes
    Je vais essayer ça peut-être du coup mais ça me paraît compliqué pour une petite chose que je veux faire en fait. M'enfin merci beaucoup du moins ça me fait avancer et essayer d'autres choses !

  5. #5
    Membre expérimenté
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 378
    Points : 1 664
    Points
    1 664

    Par défaut

    Bonjour,

    Ton problème vient du fait que tu essaies de mélanger deux rôles différents dans ta fonction et que, ainsi, tu t'emmêles les pinceaux.

    Admettons que ta variable boxVar1 soit un pointeur vers un QSpinBox. (Ce n'est peut-être pas son type, mais le raisonnement serait le même avec un autre.)

    Si tu veux simplement récupérer l'état de ton QSpinBox, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int MaClasse::GetValeurDeMonQSpinBox() {
        return boxVar1->value();
    }
    Il n'y a aucune raison que MaClasse::GetValeurDeMonQSpinBox ait un paramètre et encore moins qu'elle soit un slot.

    Mais si tu veux qu'une fonction soit appelée automatiquement chaque fois que ton QSpinBox change de valeur, là, par contre, il faut bien créer un slot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MaClasse
    {
    public slots:
        void FonctionAppeleeQuandMonQSpinBoxChangeDeValeur(int nouvelleValeur);
    };
    et connecter le signal void QSpinBox::valueChanged(int i) de ton QSpinBox au slot de ton objet.
    Ce slot n'a aucune raison de retourner une valeur, donc le type de retour est void.

    Note qu'un signal peut être connecté à plusieurs slots et que ces slots n'ont pas forcément besoin d'être dans MaClasse.

    Pour aller plus loin, il faut apprendre les notions de signaux et de slots de Qt, par exemple avec cette page : http://doc.qt.io/qt-5/signalsandslots.html

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : avril 2014
    Messages : 10
    Points : 7
    Points
    7

    Par défaut

    Merci beaucoup ! Le soucis n'était pas exactement là finalement, j'ai déclaré dans une autre en-tête sous struct et ça fonctionne, je récupère bien ce que je veux maintenant !

    En tout cas merci pour le temps passé et le lien !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2013, 11h46
  2. [XL-2003] Récupérer une valeur calculée sur un sheet pour le renvoyer dans une listbox
    Par Thierry2B dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/01/2011, 09h55
  3. Réponses: 2
    Dernier message: 22/05/2007, 16h15
  4. Réponses: 0
    Dernier message: 22/05/2007, 12h06
  5. Réponses: 2
    Dernier message: 11/12/2004, 21h20

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