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 :

Déclarer des instances dans une boucle


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2010
    Messages : 97
    Points : 71
    Points
    71
    Par défaut Déclarer des instances dans une boucle
    bonjour,
    j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for(int i=0;i<10;i++)
    	{	
    	W.add(   StaticImmovable( Window,rm.getMultiFrameAdr("right") )   );
    	}
    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
     
    bool World::add(StaticImmovable& Blk)
    {	
    	try{
    	if(incre>=xBlocks*yBlocks)
    	{
    		throw out_of_range("Out of Range");return false;}
    	else 
    	{wrd[ incre/xBlocks ][ (incre%xBlocks) ]=&Blk.myAnimation();//return object Animation
    	incre++;
    	return true;}
    	}
    	catch(std::out_of_range const& e)
    	{cout<< "World::add : " << e.what() << endl;}
     
    }
    Au fait je doit remplir un vecteur<Animation*> par l'objet animation de chaque instance de StaticImmovable.(role de la fct add)
    Mais après des testes j'ai découverts que toutes les case du vecteur contiennent la même adresse.

    quelqu'un peu me dire la solution ?!

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Plusieurs problèmes au bout de code que tu nous présentes :
    • Voici la signature de ta fonction : bool World::add(StaticImmovable& Blk). Ta fonction prend une référence (non constante) et voici ton appel : W.add( StaticImmovable( Window,rm.getMultiFrameAdr("right") ) );. Cet appel est invalide. On ne peut pas prendre la référence d'un objet temporaire (en C++11, on aurait pu utiliser une rvalue reference mais ce n'est pas notre soucis ici). Il te faut soit passer le paramètre par valeur soit par référence constante.
    • throw out_of_range("Out of Range"); : une fonction lance une exception lorsqu'elle ne peut pas réaliser le service attendu par ceux qui l'ont appelés. L'exception a pour objectif de transmettre aux appelants ce problème. Pas pour transporter l'erreur dans la fonction. L'utilisation de ton throw dans un bloc global try/catch ressemble plutôt à un méchant goto qui ne s'assume pas.
    • return false; ce code n'est jamais exécuté car toutes les lignes de code qui se trouvent dans le même bloc après un throw ne sont pas exécutées. Le throw transmet l'exécution au catch correspondant (modulo l'exécution des destructeurs en remontant la pile).
    • &Blk.myAnimation() tu stockes l'adresse d'un objet retournée par une fonction. Rien que ça me fait dire qu'il y a un problème de conception au delà de problème éventuel d'implémentation.
    • Si je rajoute que Blk est un objet temporaire qui sera détruit aussi tôt sorti de la fonction (ou au moins de la boucle appelante au dessus), brrr, ça me fait des frissons dans le dos.

    Je pense que ton problème vient de &Blk.myAnimation(). En terme d'implémentation, il manque des informations pour savoir à quel point c'est problématique : il faudrait la classe StaticImmovable ou au moins son constructeur, myAnimation et tout ce qui pourrait s'y rapporter.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2010
    Messages : 97
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Plusieurs problèmes au bout de code que tu nous présentes :
    • Voici la signature de ta fonction : bool World::add(StaticImmovable& Blk). Ta fonction prend une référence (non constante) et voici ton appel : W.add( StaticImmovable( Window,rm.getMultiFrameAdr("right") ) );. Cet appel est invalide. On ne peut pas prendre la référence d'un objet temporaire (en C++11, on aurait pu utiliser une rvalue reference mais ce n'est pas notre soucis ici). Il te faut soit passer le paramètre par valeur soit par référence constante.
    • throw out_of_range("Out of Range"); : une fonction lance une exception lorsqu'elle ne peut pas réaliser le service attendu par ceux qui l'ont appelés. L'exception a pour objectif de transmettre aux appelants ce problème. Pas pour transporter l'erreur dans la fonction. L'utilisation de ton throw dans un bloc global try/catch ressemble plutôt à un méchant goto qui ne s'assume pas.
    • return false; ce code n'est jamais exécuté car toutes les lignes de code qui se trouvent dans le même bloc après un throw ne sont pas exécutées. Le throw transmet l'exécution au catch correspondant (modulo l'exécution des destructeurs en remontant la pile).
    • &Blk.myAnimation() tu stockes l'adresse d'un objet retournée par une fonction. Rien que ça me fait dire qu'il y a un problème de conception au delà de problème éventuel d'implémentation (malgré le nom StaticImmovable qui me fait soupçonner un type plein de variable statique constante).
    • Si je rajoute que Blk est un objet temporaire qui sera détruit aussi tôt sorti de la fonction (ou au moins de la boucle appelante au dessus), brrr, ça me fait des frissons dans le dos.

    Je pense que ton problème vient de &Blk.myAnimation(). En terme d'implémentation, il manque des informations pour savoir à quel point c'est problématique : il faudrait la classe StaticImmovable ou au moins son constructeur, myAnimation et tout ce qui pourrait s'y rapporter.
    -Merci Pour ta réponse 3DArchi

    c'est vrai le try catch devrait passer aux appelants , sauf que je déteste écrire à chaque fois le block try catch si je souhaite utiliser une méthode rapportant une erreur (add ici).[je sais que c'est du programmation merdeuse mais puisque le projet n'est qu'un mini projet de mrd alors je fait n'importe quoi)

    pour le return false merci pour la remarque j'ai pas fait attention

    pour la constructeur StaticImmovable voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    StaticImmovable::StaticImmovable(sf::RenderWindow& RW,Scene& NewAnim)
    {TheAnimation=new Animation(&NewAnim,false,false,0.f);
    TheAnimation->SetRenderW(RW);
    }
    Et pour la méthode add j'ai déja essayé de faire ce que vous m'avez proposer mais je fini tjr avec L'erreur :
    impossible de convertir un pointeur 'this' de 'const StaticImmovable' en 'StaticImmovable &'

    Enfin je ne suis qu'un débutant en C++ alors si vous voulez bien réexpliqué la différence entre passer un obj constant ou non constant.

    Merci et Merci encore

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Cette erreur veut dire que tu tentes d'appeler StaticImmovable::add() d'un objet de type StaticImmovable qui est const (en lecture seule si tu préfères).

    Quand un objet est const, seules ses fonctions membres marquées const sont appellables. Les fonctions membre const ne peuvent pas modifier l'état de l'objet (sauf les objets membres marqués mutable).

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par ADBows Voir le message
    sauf que je déteste écrire à chaque fois le block try catch si je souhaite utiliser une méthode rapportant une erreur
    Et est-ce que tu aimes appeler une fonction qui pousse unj cas d'erreur sous le tapis et te demander pendant des heures pourquoi ton programme fait n'import quoi? De deux choses l'une:
    1. ta fonction peut rattraper l'erreur en local --> l'exception ne sert à rien et ne devrait PAS être lancée
    2. soit elle ne peut pas rattraper l'erreur, dans ce cas l'exception sert à signaler le problème au code appelant parce qu'ayant le contexte du traitement il saura quoi faire de cette erreur. Note qu'à mon avis parfois planter est la bonne solution, car planter sur exception non-catchée (c'est à dire arrêter le traitement (avec libération des ressources si tu conçois/codes comme il faut) en rapportant une erreur) c 'est mal, mais continuer le massacre dans un état indéfini c'est encore pire, surtout si le résultat du traitement affecte des données persistantes.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Ingénieur R&D
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 6
    Points
    6
    Par défaut sagesse
    Citation Envoyé par ADBows Voir le message
    [je sais que c'est du programmation merdeuse mais puisque le projet n'est qu'un mini projet de mrd alors je fait n'importe quoi)
    Si tu n'est pas rigoureux dans les petits projets, comment pourras-tu l'être dans les grands ?

    Avec les petits projets, tu peux plus facilement te permettre d'être perfectionniste. Le but, c'est d'apprendre.

    Pour en avoir noté pas mal, je peux te dire que rien qu'une jolie indentation, des noms de variables corrects, etc., c'est comme une copie propre, ça ne garantit rien, mais ça met le prof de bonne humeur :-)

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

Discussions similaires

  1. [MySQL] récupérer les dimensions des images dans une boucle while
    Par Navyel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/08/2007, 11h09
  2. [FPDF] tracer des lignes dans une boucle
    Par marielaure2805 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/06/2007, 14h17
  3. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52
  4. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

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