[c++] surcharge de mémoire ?
Forum Programmation : [c++] surcharge de mémoire ?
Bonjour j'utilise les librairie SDL et FMod en c++, je suis sous windows et compile avec dev c++:
Je compile ce programme mais au bout d'une dizaine de seconde il ne fonctionne plus correctement et met 4 ans a s'éteindre.
J'ai donc penser a une surcharge de la mémoire vive, mais a vrai dire je ne vois pas où dans mon code cela peut foirer ( je suis plutot débutant ... ).
Voici mon code:
Code :
|
J'ai remarquer une nette amélioration lorsque j'enlevais la ligne:
'if (SDL_PollEvent (&event) && event.type==SDL_QUIT)break;'
C'est d'ailleur la seule ligne de mon programme que je ne comprend pas et je pense que c'est le coeur de mon probleme.
Quelqu'un saurait il m'expliquer ce que c'est ?
salut,
je connais pas beaucoup SDL, mais d'après ce que je vois dans le prog, charger un bmp à chaque boucle sans vider celui d'avant, ca doit pas lui faire beaucoup de bien
Penser à voir les tutos, ca peut aider!
Répondre à coca25
SDL_PollEvent c'est pour récupérer un évènement (souris clavier par exemple).
Dès qu'un évènement est lancé, la fonction se débloque et continue. C'est alors que tu traite l'évènement qui est renvoyé en paramètre.
Dans ton code, tu utilises 2 fois SDL_PollEvent (dans le main et input).
Enlève celui qui est dans "input", et fait passer le event en paramètre de input (par pointeur, pas par valeur !).
Message édité par CRicky le 11-07-2007 à 22:50:06
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Woua diou j'avais préciser débutant !
En tout cas merci bcp, vos deux réponses vont m'aider je fais quelques bricoles et vous répond ensuite merci encore !
Ouais j'ai donc un peu regarder:
J'ai donc déclarer 2 fois: SDL_Event event;
Apres je dois t'avouer avoir une notion tres vague des pointeurs, j'ai lu des trucs dessus sur internet mais n'est pas super bien compris... Par contre je comprend ce que tu veux dire, au lieu dans l'input de faire une condition en trop je peux l'enlever, et juste importer la valeur de event a chaque fois que j'appelle justement input (?).
Ma question est donc comment puis-je rendre event, pointeur ? ( parce que en tant que valeur, et sans la condition ca marche pas mal ) et comment je le fais passer en parametre ?
Ensuite faut-il liberer mon image avec SDl ?
Et pour finir, que veut dire "if (SDL_PollEvent (&event) && event.type==SDL_QUIT)break;"
En tout cas merci pour vos réponse je progresse bien plus vite comme ca !
* Les pointeurs ne sont que des adresses mémoire.
La mémoire d'un PC (la RAM), n'est qu'une suite d'octets numérotés de 0 à beaucoup (on va dire par exemple 2^32). Ce numéro s'appelle une adresse mémoire. Quand tu écrit une variable (un "int" par exemple, avec la valeur 30), tu écris sur 4 octets dans un endroit en mémoire réservé par l'OS. Cet endroit, c'est à une adresse mémoire déterminée par l'OS (par exemple, au hasard, sur l'octet n°200000).
donc lorsque tu manipules ton "int", tu manipules la valeur (30). Lorsque tu manipules son pointeur "int *", tu manipule une adresse mémoire. En fait un pointeur c'est juste le numéro de l'adresse mémoire utilisée.
pour déclarer un pointeur, il faut ajouter une étoile, pour indiquer que c'est un type "adresse mémoire" et pas le type même:
Code :
|
Lorsque tu as une variable que tu manipule par valeur, il faut utiliser le "&variable" pour en récupérer l'adresse. Lorsque tu as un pointeur (donc une adresse mémoire), il faut utiliser "*variable_pointeur" pour récupérer le contenu de l'adresse mémoire (la valeur).
Code :
|
Pourquoi passer par des pointeur et pas directement la valeur ? C'est simple. En C, lorsque qu'on fait passer une variable par valeur, le programme fait une copie de cette valeur en mémoire (la copie a donc une nouvelle adresse mémoire). Donc, lorsqu'on modifie la copie, on ne modifie pas l'original. Lorsqu'on passe l'adresse mémoire en paramètre, on est sûr de toucher à la valeur originale. Dans le cas du SDL, mieux vaut passer la structure par pointeur, car on ne sait pas forcément comment SDL gère le type SDL_Event.
"if (SDL_PollEvent (&event) && event.type==SDL_QUIT)break;"
c'est équivalent à ceci:
retour = SDL_PollEvent (&event); /* Fonction qui se débloque sur un nouvel évenement souris ou clavier et retourne une valeur non nulle lorsqu'il y a effectivement un évènement (ça pourrait être une erreur) */
if (retour && event.type==SDL_QUIT) /* Teste si un évènement a bien été reçu et si c'est une évènement indiquant que le programme doit se terminer (par exemple quand on clique sur la croix d'une fenêtre) */
break; /* Arrête la boucle infinie, donc ça sort de la boucle, le programme continue son exécution, arrive à la fin du main, et donc le programme s'arrête */
Ceci est obligatoire, car tu fais une boucle infinie (avec le while(1)), et donc pour terminer le programme, il faut arrêter la boucle (c'est bête un ordinateur, et ça le restera toujours
).
| Citation : Ensuite faut-il liberer mon image avec SDl ? |
Oui, ça libère de la mémoire. Supprime là si ton programme se termine (c'est-à-dire après la boucle infinie). Et si jamais, à un moment, tu es sûr de ne plus utiliser cette image (comme par exemple, dans un jeu où l'on changerait de niveau), alors il faut la libérer. S'il y a trop de mémoire, ça peut faire ralentir ton processus (surtout si ça tourne sous windows
), alors il ne faut pas négliger le fait de librer une ressource qui n'est plus utilisée.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Ok merci pour l'explication, mais ce changement me pose probleme. Primo,
SDL_Event * event, il aime pas, en fait il ne reconnais plus "event" ducoup j'ai des erreurs du type:`type' has not been declared. dans la fonction input. Deplus, ici je déclare "event" dans la fonction input ducoup il ne sait plus ce qu'est "event" dans la main !
J'ai donc du rater qqch ...
sinon enlève ta variable locale du main et n'utilise que la variable globale.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Il y a 1567 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
