CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] STL : que choisir?

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 10:40:49

Hello,

j´ai qq soucis sur la manière de procéder à la construction de mon programme.
Brièvement mon but :
Des objets peuvent être lachés du haut de la fenêtre jusqu´en bas. On peut lancer plusieurs objets en même temps (c-a-d avant que le précédent ai touché le sol). Une fois à terre, l´objet disparait.

Bon, alors, j´ai une classe "game", qui gère l´affichage des données et les touches du clavier. Donc lorsque j´appuie espace, un objet se crée et tombe.
J´ai pensé à un tableau dynamique, et je me suis dit que la stl remplirait bien ce rôle.
Seul ennui, je ne sais qu´utiliser.
Pour mon dernier projet (un tetris), j´avais utilisé queue, mais la c´est plus chaud, vu qu´à chaque frame, je dois pouvoir accéder à tous les objets n´ayant pas touché le sol. Quand à ceux qui l´auraient atteint, je dois les supprimer.
Donc queue n´a vraiment pas l´air efficace dans ce cas...
J´ai jeté un coup d´oeil à list, mais je ne sais comment supprimer les anciennes données devenus inutiles, je pense que c´est possible...
Est-ce une bonne solution que d´utiliser list, si non, pouriez vous me donner une alternative svp, si oui, pouriez vous m´indiquer comment supprimer les données svp?

Ensuite je prévoyais de créer une classe "launch" ou je créerais un objet pour chaque élément de ma liste. Est-ce bien util de créer une classe pour la gestion du projectile laché (nouvelles coordonnées de l´objet sur le plan, et renvoyer un signal pour la destruction de l´élément de la liste si l´objet touche le sol, et par conséquent la destruction de l´objet launch (je sais pas si c´est clair pour vous la :-p ) ).

Voila, si vous pouviez m´éclairer un peu (je me débrouille avec ce que j´ai en ce moment, les bouquins arrivent :p)
Merci d´avance :)

LGV
LGV
Niveau 28
29 janvier 2006 à 13:37:13

dans la mesure ou tu vas acceder a tous tes blocs en train de tomber, probablement dans l´ordre ou tu les as crees, un std::list<> fera partfaitement l´affaire.
Un std::vector<> serait egalement adapte ; le choix est plus conceptuel qu´au chose. Disons que le vector est efficace pour un acces aleatoire ; cf. Effective STL pour d´eventuels details. Mais a ce niveau, ces deux containers repondront a ta demande.

" je dois pouvoir accéder à tous les objets n´ayant pas touché le sol"
c´est contradictoire avec ton enonce ; dans ton container ne devrait y avoir QUE des blocs n´ayant pas touche le sol.. vu qu´ils sont detruits quand ils arrivent en bas de la fenetre.

pour la doc :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/LIST_list.asp#list
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/VECTOR_vector.asp#vector

"je prévoyais de créer une classe "launch""
mis a part dans le cas d´un Functor, un telle appelation est qqpeu contraire a l´optique POO, ou des ACTIONS agissent sur des OBJETS ; dans ton cas, une class Emitter avec un methode Emit(blabla) faisant exactement la meme chose serait plus intuitive.

godrik
godrik
Niveau 30
29 janvier 2006 à 13:38:52

une liste chainée smble correspondre parfaitement a tes besoins.

Je ne suis pas pleinement convaincu par ta classe launch... mais je n´ai pas une vision d´ensemle de ton programme, peut etre sa présence se justifie t´elle...

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 13:53:36

Wow! Merci pour les liens LGV ! :)

Ensuite je vois que toi et godrik n´êtes pas trop d´accord avec ma classe, mais je ne comprend pas ce qu´est une classe emitter par rapport à ma classe launch? (en fait je patoge la lol)

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 14:10:29

(ma question précédente tient tjrs mais j´en profite pour en poser une autre)

Lorsque je compile mon projet, mais que je demande au compilo d´indiquer toutes les warnings, j´ai des truc du style :

game.h: In constructor `game::game()´:
game.h:32: warning: `game::quit´ will be initialized after
game.h:29: warning: `float game::v0´
game.cpp:7: warning: when initialized here

game.ccp ligne 7 ca me donne :

game::game():
quit(false),v0(1),b_launch(false)
{

Est-ce faux?

Mon programme me fait la même chose qu´il y a qq temps avec un précédent prog. Il quitte au lancement lorsqu´il y a un certain nombre de variables déclarées dans ma classe (très peu de variables). (la dernière fois j´avais mis 2 "==" au lieu d´1) . Cette fois ci il y a pas d´erreur du genre, j´ai donc décidé de faire marcher ce debugger mais la, dans la fenetre debug, ca s´arrete à "segment fault" et rien ne se passe.

Sur un programme de deux lignes :
int main()
{
int test=3;
cout << test << endl;
test+=4;
cout << test << endl;
return 0;
}
Si je met un breakpoint sur le 2e cout (ou le premier), j´ai une fenetre dos qui s´ouvre et rien à faire (par contre jai une erreur windows car jarrive pas à fermer cette fenetre).

Qqn pourrait-il m´aider svp?
merci encore :-)

dnob700
dnob700
Niveau 10
29 janvier 2006 à 15:15:31

tu utilise Dev C++ ?

la fenêtre MS-DOS qui s´ouvre est celle de ton programme. Et tu ne peut rien faire car il est arrété sur un breakpoint.
Par contre dans la fenêtre de ton débogueur (dev c++ ?) il doit y avoir ou bien des boutons type "continuer", "pas-à-pas", etc. Ou bien des commande à taper (si tu utilise un truc type gdb).

Entre autre, regarde dans les différent onglets de la fenêtre Dev C++ s´il n´y a pas des choses qui t´aurait échappé (lorsque ton programme se bloque sur le point d´arret).

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 15:29:47

Pardon, javais oublié de préciser, je travail sous code::blocks mais en fait, je voulais déjà commencer par tester qq chose de facil que je n´arrivais pas à résoudre, j´ai donc pris ceci :

void ShowList(list<int>& L)
{
list<int>::iterator I;
for(I=L.begin();I!=L.end();I++)
{
cout << "element : " << *I << endl;
if(*I==6)
{
L.erase(I);
cout << "element : " << *I << "supprime" << endl;
}
}
}

int main()
{
list<int> L;
L.push_front(5);
L.push_back(7);
L.push_front(19);
L.push_back(6);
ShowList(L);
return 0;
}

Pour tester "erase", seul ennui, c´est que le programme s´arrête après avoir supprimé ce que l´itérateur pointait.
Jai mis run to cursor sur L.erase(I) et j´obtient dans ma fenetre dos :
element : 19
element : 5
element : 7
element : 6

Ensuite j´ai les boutons : continue, step over, step into, step out.
si je met continue, j´arrive dans une boucle infinie qui m´affiche un nombre immense positif et un nombre immense négatif.
(avant d´avoir écrit mon précédent post ça ne me faisait pas ça en fait).
Je pense que c´est à peu près normal je crois...
Seul ennui, je vois pas comment utiliser mon programme pour une application sdl :(

En passant, si qqn avait une idée du problème lors de l´erasage ce serait sympa de m´aider :)
merci

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 16:16:50

Ok, comme ça ça marche :
void ShowList(list<int>& L)
{
list<int>::iterator I;
for(I=L.begin();I!=L.end();I++)
{
cout << "element : " << *I << endl;
}
}

int main()
{
list<int> L;
L.push_front(5);
L.push_back(7);
L.push_front(19);
L.push_back(6);
ShowList(L);
L.remove(6);
ShowList(L);
return 0;
}

godrik
godrik
Niveau 30
29 janvier 2006 à 18:05:30

bon, pour tes warnings c´est classique en C++ ca.
class toto
{
int a;
int b;

toto()
:b(12), a(b+1)
{}
};

le constructeur a uin comportement non définit.
en effet bien que tu ai ecris: b(12, a(b+1) le compilateur fera a(b+1), b(12) parceque c´est l´ordre dans lequel tes variables sont déclaré dans ta classe.
(ceci est bien expliqué dans effective C++ de scott meyers d´ailleurs)

if(*I==6)
{
L.erase(I);
cout << "element : " << *I << "supprime" << endl;
}
je n´ai pas la stl sous la main, mais ej ne suis pas su que ca ait vraiment du sens ce que tu écris la...
puisque tu as erase l´itérateur, je ne penses pas que tu ait encore le droit de l´utiliser...

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 18:10:03

(ceci est bien expliqué dans effective C++ de scott meyers d´ailleurs)

Je l´ai commandé hier^^ :-p

Pour l´itérateur oui, j´ai pensé que c´était la raison pour laquelle le programme s´arretait. remove est plus adapté à ce que je voulait :)

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 19:26:53

Décidément...
J´ai voulu adapter le code ci dessus pour mon programme, mais ça commence super mal... ca fais 1h que j´essaie de trouver mon erreur.
Dans ma classe game, en private, j´ai mis ceci :
list<int,int> objet;
et j´ai la fameuse erreur : iso c++ forbids declaration of list with no type
expected ; before < token

pourtant j´ai bien fait l´include :

  1. include <list>

D´ou cela peut il provenir?
merci :)

LGV
LGV
Niveau 28
29 janvier 2006 à 21:15:36

une std::list est un template sur UN SEUL element ; il te faut utiliser une structure de donnees intermediaire qui contiennent toutes tes infos (si tu n´as que 2 int, un Pair<> peut faire l´affaire, sinon une class ou struct maison sera parfait)
Et surtout evite de stocker des objets dans des listes ! stockes y des pointeurs vers tes objets, en regle generale.

Virtuality
Virtuality
Niveau 8
29 janvier 2006 à 21:46:27

Ok, je pense que je vais opter pour une structure, je savais pas.
Seul ennui, c´est que :
list<int> objet;
Même erreur, iso c++ forbids...

sinon pour les pointeurs, ca risque pas d´être embétant, car en fait je vous explique :
Je lance mon projectile avec la formule de balistique suivante :
y=(g*x^2)/(2*v0^2)
Pour ceci j´ai besoin de la vitesse à laquelle le projectile est laché (à l´horizonte donc alpha=0) ainsi que de la position X depuis laquelle celui ci est laché.

Je prévoyais qu´à chaque lancé de projectile, on fait un ajout dans la liste avec comme paramètre v0 et x.
Et ensuite, j´accède à la classe launch qui connait les coordonnées du projectile et fait les calculs sur la trajectoire.
Bon, c´est la que ca joue plus trop, je sais pas comment accéder à ma classe launch depuis ma list.
Tout ça pour également en revenir au fait, qu´utiliser des pointeurs dans ma liste me semble quelque peu fastidieux, mais la j´arrive meme plus à formuler mes mots, je suis perdu :(
Si vous comprenez et que c´est un peu trop faux, merci de me corriger (j´essaie de corriger ce que vous me dites mais certaines choses me dépassent navré).
merci d´avance

dnob700
dnob700
Niveau 10
29 janvier 2006 à 22:51:33

Si tu stocke tes données dans une petite structure (juste quelques variables), tu peut les stocker directement dans la liste. Tu perd un peu de temps à les recopier, mais tu y gagne en simplicité.

Par cotnre si il s´agit de classe avec des constructeur/destructeur, etc. il faut commencer à faire attention car d´une part ça peut prendre beaucoup de temp, et d´autre part, le résultat peut différer de ce que tu voulais.

Virtuality
Virtuality
Niveau 8
30 janvier 2006 à 18:14:36

Merci dnob700 pour ta réponse, en effet, j´ai juste 3 variables int à faire passer (et pas des immenses).
J´ai opté pour la structure :-)))

Par contre ça bug tjrs, je n´arrive pas à compiler mon programme, surement une autre erreur qui fait que ça bug la...
Je vais encore regarder.
++

JeanYvesYves
JeanYvesYves
Niveau 10
30 janvier 2006 à 18:17:31

quelle erreur de compilation as tu ?
S´il ne reconnait pas list, c´est qu´il manque un namspace std, ou un std:: préfixé :)

Virtuality
Virtuality
Niveau 8
30 janvier 2006 à 18:20:44

iso c++ forbids declaration of list with no type
expected ; before < token

si je met le std c´est encore pire :p)

Virtuality
Virtuality
Niveau 8
30 janvier 2006 à 18:22:06

J´ai rien dit! en fait le std me donnait qq chose de faut quand javais mes deux int (incorrect).
j´ai réessayé mtn avec un seul ça marche lol:P
Ca compile mais le prog quitte direct (comme une précédente fois).
Une erreur qq part que je n´arrive à cerner.
Mais ça viendra :-p

JeanYvesYves
JeanYvesYves
Niveau 10
30 janvier 2006 à 18:25:13

le prog quitte en plantant ?
essaie de lancer en mode débug :)

Sinon, peut etre quitte t il parce qu´il a fini ?
Met un system("pause"); a la fin pour etre sur que ce n´est pas ça :)

Sinon, peut etre que ta liste a lancé une exception (tu as fait quelque chose qu´il ne fallait pas dedans)
Essaie de désactiver les appels de la fonction "showlist" par exemple

Attention : la fonction showlist que je reconnais que tu utilisaos est faite uniquement pour les int :)
Tu ne peux pas faire un cout d´une structure apres un itérateur :)

D´une façon générale, si tu as

list<truc> L;

si tu mets un itérateur I dessus, alors I te renverra un "truc" :

truc T = *I;

Virtuality
Virtuality
Niveau 8
30 janvier 2006 à 18:47:46

J´essaie le mod débug, mais sur ce projet je n´y arrive pas :
Selecting target: default
Compiling: done
Starting debugger: done
Adding source dir: D:\C++\test\
Adding file: test.exe
Changing directory to: release
Program received signal (SIGSEGV)
Segmentation fault

et ca stop la....
Il s´agit dun projet sdl, et en plus je suis sous code::blocks (il gère tout seul le pause pour les projets consol).
En fait, si je retire une variable, (un int par ex) dans ma classe game, le jeu continue son cours, mais apparemment, à partir d´une certaine taille, ça s´arrête....
ca m´avait déja fait ça à cause d´un "==" au lieu dun "=" dans le constructeur de cette meme classe, mais la je vois pas déquivalent :(

Pour le showlist, c´était juste un test sur un autre projet, la c´est tout à fait différent (et ce n´est pas ca qui bug vu que si je met en commentaire tous ce qui concerne la list ça me fais pareil).
merci :)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware