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 :

probleme avec les références


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut probleme avec les références
    Bonjour,
    Je suis occupé d'écrire une classe
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Class abcd{
    	private:
    		char* nom;
    		int r, v, b;
    	public:
    		...// les getter setter,...
    		void Save(std::ofstream&) const;
     
    }
    et j'essayes de faire une methode save
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void abcd::Save(ofstream &fichier) const{
    	fichier.write(getNom(), sizeof(getNom()));
    	fichier.write((char*) &getRouge(), sizeof(getRouge())); // cette ligne pause probleme	
    }
    j'ai également tenté
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.write((char*) &(getRouge()), sizeof(getRouge()));
    mais cela ne fonctionnes pas je suis obligé de décrarer une variable tmp et puis d'en récupérer l'adresse
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tmp = getRouge();
    	fichier.write((char*) &tmp, sizeof(getRouge()));
    Pourquoi?
    merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Pourquoi?
    À vue de nez, cela semble logique ... mais je peux me tromper.

    Lorsque tu appelles ton accesseur getRouge(), le retour va être stocké dans une variable temporaire (le RVO ne fonctionne pas parce que tu ne stockes pas ce retour)
    Et tu prends l'adresse de cette variable temporaire Quand cette variable va-t-elle être détruite ? juste après l'appel de ton accesseur getRouge() ? après l'appel de la fonction write ?

    Avec une vraie variable, on sait qu'elle sera détruite à la fin du bloc

  3. #3
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Je ne sais pas j'aurais dis apres la fin de l'execution de la ligne donc getRouge retourn la valeur qui est disponible jusqu'a la fin de l'execution de la ligne donc jusqu'a la fin du write dans ce cas si

  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
    getRouge devrait fonctionner, effectivement il y a une variable temporaire qui sera détruite après l'appel au write. Vu que c'est un int, ça passe jusque là. Reste ensuite le cast brutal en char*, lui peut ne pas passer et faire des choses bizarres, faut tester.
    Par contre fichier.write(getNom(), sizeof(getNom())); ne va certainement pas écrire le contenu de nom ne serait-ce que parce que, à moins d'avoir un nom composer de 1 caractère à la limite, sizeof(getNom()) ne retourne certainement pas ce qui est espéré..
    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 expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Le truc est que la méthode demande un char* =>ostream& write (const char* s, streamsize n);.

    Donc sauf erreur de ma part je suis obligé de faire un casting.
    Quand au fichier.write((char*)&getRouge(), sizeof(getRouge())); il me mets cette erreur lorsque j'essayes de compiler.

    Nom : download.png
Affichages : 273
Taille : 49,0 Ko

    idem si je rajoute les parenthèses &(getRouge())

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Pourquoi faire des char* en C++ alors que tu as std::string ?

    Pourquoi utiliser des getters à l'intérieur d'une fonction membre quand tu pourrais directement accéder à la donnée membre ?

    Pourquoi ne pas nous montrer le corps de getRouge() ? Je présume qu'elle renvoie r, qui aurait peut-être dû s'appeler rouge du coup ?

    Enfin, pourquoi ne pas utiliser l'opérateur << de ton ofstream pour écrire dans le fichier et ainsi te simplifier grandement la vie ? Voir http://www.cplusplus.com/doc/tutorial/files/

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

Discussions similaires

  1. problemes avec les références
    Par saeba357 dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2009, 14h52
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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