begin process at 2013 05 23 11:44:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Résultat surprenant


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Résultat surprenant

mercredi 4 juillet 2012 à 20:54:52 | Résultat surprenant

thomas71

Membre Club
Bonjour,

j'ai écrit ce code afin de m'entraîner à utiliser les classes. Cependant, il produit un résultat inattendu et je n'arrive pas à trouver l'origine du problème. Le code est le suivant :

Code C/C++ :
#include <iostream>
#include <cmath>

using namespace std;

class point
{
public:
    point(int abscisse, int ordonnee)
    {
        x = abscisse;
        y = ordonnee;
    };
    int abscisse() {return x; }
    int ordonnee() {return y; }

private:
int x;
int y;
};

class segment
{
  public:
    segment(point a, point b)
    {
        debut = &a;
        fin = &b;
    };

    double l1()
    {
        return debut->abscisse();
    }

 double l2()
    {
        return debut->ordonnee();
    }

 double l3()
    {
        return fin->abscisse();
    }

 double l4()
    {
        return fin->ordonnee();
    }

  private:
  point * debut;
  point * fin;
};

int main()
{
    point a(1,2), b(3,4);
    segment ab(a,b);
    cout << "Abscisse de a : " << a.abscisse() << ", ordonnee de a : " << a.ordonnee() << endl;
    cout << "Abscisse de b : " << b.abscisse() << ", ordonnee de b : " << b.ordonnee() << endl;
    cout << "Longueur de [ab] : " << ab.l1() << " " << ab.l2() << " " << ab.l3() << " " << ab.l4();
    return 0;
}


J'obtiens ceci en sortie :
Code :
Abscisse de a : 1, ordonnee de a : 2
Abscisse de b : 3, ordonnee de b : 4
Longueur de [ab] : 4.61813e+006 2 3 4


Normalement, il devrait retourner : Longueur de [ab] : 1 2 3 4

Merci de votre aide!
mercredi 4 juillet 2012 à 21:43:56 | Re : Résultat surprenant

yann_lo_san

Salut,

tu passes des "point" valeurs qui sont détruits à l'accolade fermante du constructeur,
tu devrais essayer ceci :

Code C/C++ :
segment(point* a, point* b)
{
    debut = a;
    fin = b;
};


et

Code C/C++ :
point a(1,2), b(3,4);
segment ab(&a, &b);


Mais il serait plus propre d'utiliser des références :

Code C/C++ :
segment(const point& a, const point& b)
{
    debut = new Point(a.abscisse(), a.ordonnee());
    fin = new Point(b.abscisse(), b.ordonnee());
};

// et utiliser un destructeur

~segment()
{
    if(debut) delete debut;
    if(fin) delete fin;
} 



bye...
mercredi 4 juillet 2012 à 22:30:09 | Re : Résultat surprenant

thomas71

Membre Club
Merci pour ton aide mais en fait je me demande pourquoi ce problème se produit pour a.abscisse() et pas pour b.abscisse()...
mercredi 4 juillet 2012 à 23:02:04 | Re : Résultat surprenant

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Bonjour.

Tout d'abord:
- Évite les "using namespace", voir: [ Lien ]
- Met une majuscule au classe et un _ devant les attributs de classe (genre "int _x;")
- cmath ne te sert à rien ici.
- Évite de coder dans un header, directement dans ta classe.

yann_lo_san t'as déjà décrit l'origine du problème, je n'y reviendrais donc pas. Il est, de manière générale, dangereux de prendre l'adresse d'une valeur temporaire.

je me demande pourquoi ce problème se produit pour a.abscisse() et pas pour b.abscisse()..


Coup de chance, ça dépend de l'état de la mémoire à un instant t. Une valeur détruite ne l'est pas pour de vrai, elle est marquée comme étant réinscriptible. Si par chance aucun processus n'a réécrit par dessus, tu auras la bonne valeur (mais aucune garantie forte).


@yann_lo_san: Pas tout à fait d'accord avec deux choses (vraiment des petits détails, ton explication étant tout à fait correcte):


segment(const point& a, const point& b)
{
debut = new Point(a.abscisse(), a.ordonnee());
fin = new Point(b.abscisse(), b.ordonnee());
};


Dans ce cas, autant laisser "point a" en arguemnt et mettre comme attributs des "point" au lieu de "point*". La gestion est alors automatique pour un résultat similaire à ce que tu proposes.


~segment()
{
if(debut) delete debut;
if(fin) delete fin;
}


Les "if" ne servent à rien ici. "delete 0" est tout à fait valide et ne fait rien. delete est une fonction qui vérifie déjà si le pointeur est nul.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 5 juillet 2012 à 13:21:09 | Re : Résultat surprenant

yann_lo_san

Salut,

tout à fait d'accord avec toi CptPingu.

2 questions simples à se poser pour l'agrégation :

- Vais-je modifier l'état de l'objet dans ma classe ?
- Dois-je copier l'objet pour que les changements d'état n'affectent pas l'objet original "venu de l'extérieur".

D'ou le choix entre pointeur, référence constante et référence non constante, et la prise de décision quant à la copie d'un objet.

Attention au "gros objets" copiés sur la pile.

hummm... gros objets, pile..., intéressant comme concept.

bye...


Cette discussion est classée dans : int, return, ab, abscisse, ordonnee


Répondre à ce message

Sujets en rapport avec ce message

que des boucles. [ par pratix ] Salut à tous.Je post mon prg cherchenbr modifié (voir sujet précédent ''int main" ).Programme compilé avec visual C++ 06. ( zéro erreur )j'ai essay AIDEZ MOI scp problème de texture bmp avec glaux [ par progundeath ] aidez moi svp g un big problème que j'arrive pas à résoudre mais bon je ne suis qu'un newbie d'autres le résoluront en 10 secondes enfin j'espère donc cosinus [ par anek971 ] Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.Et en faite c juste pr une verification car mon progra steganographie C [ par trypon ] Bonjour je programme sous ggcc (LINUX) et j'ai un petit pb avec mon programme j'arrive a mettre un texte dans l'image mais pas à faire le contrairela scanf() [ par clb ] bonjour à tous,j'ecris par exemple :int fonction(){ if(true) return 0; else return -1}dans main, si cette fonction retourne 0,alors j'appli je ne comprends pas mon code n'affiche pas ma grille...de morpion [ par nicoworld ] Voilà ben le .exe m'affiche pas ma grille cje ne comprends pas!!!!si quelqu'un peut me dire pourquoi????voilà le code://MORPION 10*10 :#include int ve probleme reallocation memoire vecteur [ par savoyard ] double *b;//fction allocation memoire: (permet d'allouer pas obligatoirement à partir de b[0] mais d ou on veut:double *dvector(int nl,int nh){double 2 return d'une fonction [ par Silver360 ] Hello tout le monde!Je voulais savoir s'il est possible qu'une fonction retourne 2 paramètres ( dans le genre int int mafonction() ) ou si je dois fai récursivité et factorielle!!! [ par cabarrus ] salut je veux écrire un programme qui calcule et renvoie le résultat factorielle en utilisant la récursivité de n'importe qu'elle nombre entier voici ressources et API !!!! [ par Xs ] salut !voila, pour me simplifier la tache, j'utlise les ressources pour creer une boite de dialog (sous VC++ 6).mais j'obtiens, lors de la compilation


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales