[C/C++] Insérer des valeurs dans un vector

Le côté programmation du développement d'un jeu vidéo.

Messagepar Nieluj » 28 Aoû 2011, 18:56

Je n'ose pas trop ouvrir un nouveau sujet pour une question à la con :00000029:

Il est bien possible d'insérer un élément dans un vector avec push_back lorsque le programme tourne ? Je demande ça parce que mon application plante lors d'une ligne de ce genre:

Code: Tout sélectionner
//***********************************************************************
//Méthode : ATTACKWITHBALL
//-----------------------------------------------------------------------
//Definition :
//***********************************************************************
void Player::AttackWithBall()
{
    EnergyBall* enball = new EnergyBall( this->environment, this );
    this->environment->AddPhysicObject( enball ); //ligne qui bug
}
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar thesus » 28 Aoû 2011, 19:25

Code: Tout sélectionner
vector<GObject*>* groupe=new vector<Element*>();
groupe->clear();
groupe->push_back(unElement);


ça doit être un problème d'initialisation, si le vecteur n'est pas un pointeur il ne faut pas oublier le "clear()" qui va initialiser le vecteur, sans ça il est impossible d'insérer le moindre objet.
Avatar de l’utilisateur
thesus
Hello World, I'm new !
 
Messages: 198
Inscription: 29 Déc 2008, 14:14

Messagepar Gavos » 28 Aoû 2011, 20:53

Non, il n'est pas nécessaire de faire un clear() sur un nouveau vector avant de l'utiliser, cette méthode ne fait que vider le vector (qui est déjà vide). Encore une fois il faut des détails pour pouvoir t'aider (le code de AddPhysicObject()). À moins que this->environment ne soit pas initialisé ?

Par ailleurs je splitte la discussion, il n'y a pas de honte à avoir et le sujet n'a rien à voir avec ce qui précède.
Gavos
 
Messages: 1089
Inscription: 19 Mar 2005, 13:00

Messagepar Nieluj » 28 Aoû 2011, 22:44

Merci Gavos, c'est juste que je pose beaucoup de questions en ce moment.

En fait je suis en train de mettre en place le système des attaques dans mon moteur. En l'occurence c'est une boule d'energie que le player peux utiliser.

AttackWithBall fait la chose suivante:

1 ) Création d'un objet EnergyBall ( descendance: PhysicObject -> Weapon -> EnergyBall )

2 ) Ajout de l'élément EnergyBall dans le vecteur qui gère les éléments physiques par la méthode:

Code: Tout sélectionner
//***********************************************************************
//Méthode : ADDPHYSICOBJECT
//-----------------------------------------------------------------------
//Definition :
//***********************************************************************
void Environment::AddPhysicObject( PhysicObject* _element )
{
    this->physxObjects.push_back( _element );
}


Le programme plante lorsque je tente de lancer une boule d'energie. En mettant la ligne de code suivante en commentaire, il n'y a pas de plantage:

Code: Tout sélectionner
this->environment->AddPhysicObject( enball ); //ligne qui bug
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar thesus » 28 Aoû 2011, 23:08

Gavos a écrit:Non, il n'est pas nécessaire de faire un clear() sur un nouveau vector avant de l'utiliser, cette méthode ne fait que vider le vector (qui est déjà vide).


C'est exact, mais il me semble que ça l'initialise aussi. (enfin je sais plus trop mais il me semble que ça plante si c'est pas un pointeur mais directement un objet, ou l'inverse...)

@Nieluj : Le plantage c'est un "segment fault" ? (code block dit les erreurs de plantage en debug). Si oui c'est un accès à une variable non initialiser, mais c'est peut être pas le vecteur qui est en tord, mais peut-être "enball" ou un de ses sous membres.
Avatar de l’utilisateur
thesus
Hello World, I'm new !
 
Messages: 198
Inscription: 29 Déc 2008, 14:14

Messagepar Mokona » 29 Aoû 2011, 07:45

Commenter la ligne et faire marcher le programme ne signifie pas que c'est à cet endroit que ça plante. Utilise un debuggueur pour t'en assurer.

En effet, il est possible que ce soit le code qui parcours ton vector<> et gère les éléments que tu y as ajouté qui en soit la cause. Pas d'élément ajouté, pas de bug, un élément ajouté, bug.

Suivant ce que tu fais dans EnergyBall avec this->environment, il faut se méfier aussi. Si tu ne fais que le stocker et tu ne l'utilises que plus tard, alors il n'est peut-être pas valide et tu ne le détectes pas tout de suite.

Plusieurs possibilités donc.
Mokona
Hello World, I'm new !
 
Messages: 1686
Inscription: 13 Mar 2005, 13:00

Messagepar teto » 29 Aoû 2011, 10:30

Pour utiliser le debugger sous cb:
http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks

tu cliques à gauche au niveau des numéros de ligne pour ajouter un breakpoint (ca ajoute un Rond rouge) et ensuite tu avances pas à pas (F7/MAJ F7 je crois,de ttes manière t'as les boutons correspondants sur la barre du haut).

Parfois en utilisant le debugger, ton programme va marcher (et inversement le debugger peut faire planter qque chose qui marche en release), souvent c'est du à des variables non initialisées.

As-tu pensé à faire "Rebuild all" ? des fois le programme s'emmêle les pinceaux et link des fichiers objets pas à jour.
Avatar de l’utilisateur
teto
 
Messages: 1168
Inscription: 26 Juil 2005, 19:02
Localisation: /home/Paris

Messagepar Nieluj » 04 Sep 2011, 15:56

Et hop une couche supplémentaire d'ennuis:

Sur les conseils de certains je suis donc passé de devc++ à code::block. Après avoir configuré l'IDE pour l'utilisation de SDL, je tente de compiler:

Code: Tout sélectionner
Process terminated with status 3 (0 minutes, 0 seconds)


La technique dans ces cas là, c'est le debugger ?
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Mokona » 04 Sep 2011, 17:29

Il n'y a que ça comme message dans la sortie ?

Est-ce que tu as bien configuré un compilateur ?
Mokona
Hello World, I'm new !
 
Messages: 1686
Inscription: 13 Mar 2005, 13:00

Messagepar Nieluj » 04 Sep 2011, 17:36

Code: Tout sélectionner
Checking for existence: C:\Users\Julien\Desktop\2DEngine\2DEngine\bin\Release\2DEngine.exe
Executing: "C:\Users\Julien\Desktop\2DEngine\2DEngine\bin\Release\2DEngine.exe"  (in C:\Users\Julien\Desktop\2DEngine\2DEngine\.)
Process terminated with status 3 (0 minutes, 0 seconds)
 


C'est bien ce qui m'embête... Du coup, je ne sais pas trop comment réagir.

Pour le compiler j'ai choisis celui par défaut c'est à dire GNU GCC.
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar thesus » 04 Sep 2011, 18:17

C'est pas en Debug qu'il faudrait le compiler ?

Executing: "C:\Users\Julien\Desktop\2DEngine\2DEngine\bin\Release\2DEngine.exe" (in C:\Users\Julien\Desktop\2DEngine\2DEngine\.)

Project -> Proprieties -> Build Target -> Executing working dir : mettre "bin\Debug" (ou bin\Release pour la release)
Avatar de l’utilisateur
thesus
Hello World, I'm new !
 
Messages: 198
Inscription: 29 Déc 2008, 14:14

Messagepar teto » 04 Sep 2011, 18:17

un code 3 ou 5, j'ai déjà eu, je ne sais plus si c'est exception ou pointeur non initialisé.
Tu peux essayer de commenter du code pour savoir d'ou ca vient puis apres lancer le debugger pour faire tourner le programme pas à pas. Regarde les valeurs des variables, si ca correspond bien à ce que t'attends (y a mm une option de codeblocks qui quand tu selectionnes une variable avec le pointeur t'affiches la structure dans une tooptip)
Avatar de l’utilisateur
teto
 
Messages: 1168
Inscription: 26 Juil 2005, 19:02
Localisation: /home/Paris

Messagepar Nieluj » 14 Sep 2011, 17:08

Salut,

Juste pour donner des nouvelles: J'ai depuis réglé les petits soucis que j'avais avec Code::Block par contre je n'ai pas pris le temps de régler le soucis qui m'a fait ouvrir ce topic à la base. Je vous tiendrai au courant lorsque ce sera résolu ;).
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Nieluj » 15 Sep 2011, 11:51

Donc après quelques tests, il semblerait bien que l'application plante au moment de l'insertion de l'élément dans le vecteur.

Voilà plus de détails:

-Le vecteur contient des éléments de type 'PhysicObject'.
-Lorsque j'ajoute un élément de type PhysicObject::Weapon::EnergyBall ça plante.
-Lorsque je fais exactement la même chose avec un élément de type PhysicObject::Monster ça fonctionne.

J'imagine donc qu'il y a un soucis vers la classe Weapon...
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Nieluj » 15 Sep 2011, 12:21

Problème résolu. C'était à cause de données manquantes dans EnergyBall attendues par PhysicObject... Ca m'apprendra à coder plus proprement.
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 11 invités

cron