Je suis débutant en c++.
Pour la première fois j'utilise des classes. Le programme fonctionne mais quand je regarde l'occupation mémoire, plus je crée d'objet, plus la mémoire est utilisée alors que les objets sont détruits (du moins je crois).
J'ai pas du tout comprendre !
Il ya deux classes;
Code de la première
c_affiche::c_affiche (SDL_Surface *p_ecran, const char *texte, int abscise, int ordonnee, int taille, int a, int b, int c)
{
p_police = TTF_OpenFont ("arial.ttf", taille);
SDL_Color couleur = {a,b,c};
position.x = abscise;
position.y = ordonnee;
p_texte = TTF_RenderText_Blended (p_police, texte, couleur);
SDL_BlitSurface (p_texte, NULL, p_ecran, &position);
SDL_Flip (p_ecran);
SDL_FreeSurface (p_texte);
}
c_affiche::~c_affiche ()
{
}
Code de la deuxième
// La classe clavier permet de sélectionner que les touches alphabétiques du clavier.
// La touche frappée est affichée à l'écran par l'intermédiaire d'un objet de la classe affiche
c_clavier::c_clavier (SDL_Surface *p_ecran, char tc_du_nom [], int qs) // qs ne sert à rien pour l'instant...
{
a = 'A'; // Variables qui servent de limite, seules les touches du clavier compris entre a et z fonctionneront
z = 'B';
enboucle = 1; // Variable pour la boucle while
i = 0; // Sert comme indice pour le tableau de caractères tc_du_nom
while (enboucle)
{
SDL_WaitEvent (&event);
SDL_EnableUNICODE(1);
switch(event.type)
{
case SDL_QUIT:
exit(0);
break;
case SDL_KEYDOWN:
if (event.key.keysym.unicode == SDLK_RETURN) // Accolade du if EVENEMENT, j'donne des p'tit nom pour m'aider
{
enboucle = 0;
break;
}
else
{
if ( event.key.keysym.unicode > a && z < event.key.keysym.unicode) // si la touche est entre a et z
{
tc_du_nom [i] = event.key.keysym.unicode ;
// Création d'un objet qui affichera les touches frappées
c_affiche o_ecrit (p_ecran, tc_du_nom,224,224,20);
i++;
if (i==10) // Limitation du mot à 10 lettres
{
enboucle = 0;
break;
}
}
break;
} // Accolade du if EVENEMENT
} // Accolade du Switch
} // Accolade du while
}
c_clavier::~c_clavier ()
{
}
Si vous voulez le code complet à télécharger
Question:
Ais-je bien construit la chose ? ou j'ai rien compris au classe.
théoriquement ton constructeur est correct mais on ne sait pas ce qu'il est censé faire... donc on peut pas te dire plus en détail ce que tu devrais faire. Par contre tes destructeurs sont... vides si tu as des allocation dynamiques ou pointeurs qui sont utilisé(e)s durant l'exécution de ta class n'oublie pas les delete...
Cependant il est normal que ta consommation de mémoire augmente je pense... même si les objets sont détruits il me semble qu'il reste quand même de la mémoire utilisée...
__________________________
............ Curtis: RTS 3D .............. ......
........... TeamMoteurProg...........
Au départ pour m'entrainer et comprendre le c++, j'ai fait un petit programme qui n'utilisait que des fonctions. La consommation mémoire était stable. Maintenant je veux refaire le même programme en utilisant les classes dont on vante tant les mérites. (J'en suis même pas à faire des patrons de classes). Sauf que dans mes essais (2 jours que je suis dessus) j'ai remarqué que la consommation augmentait et cela me contrarie (faut dire que je suis susceptible comme garçon) et maintenant si j'en venais au fond du problème (j'ai aussi un côté vieille pie)
Pour répondre à rainbow
Je veux que mon constructeur affiche le texte passé en argument (comme le faisait mes fonctions)
genre: c_affiche o_ecrit (p_fenetre, "lolo",124,124,20);
Et au joie je vois apparaître lolo sur mon écran. Et de la mémoire utilisé (snif)
Le destructeur est vide pour l'instant parceque je voulais qu'en détruisant l'objet ce qui était affiché disparaisse mais rien qu'en mettant SDL_FreeSurface ...Le programme bugge (orthographe !?).
Je mets le main au cas ou...
int main(int argc, char *argv[])
{
// Initialisation de la sdl
SDL_Init (SDL_INIT_VIDEO);
SDL_Event event;
TTF_Init ();
// Création de la fenêtre principale
SDL_Surface *p_fenetre;
p_fenetre = SDL_SetVideoMode (800,600,32, SDL_HWSURFACE);
SDL_WM_SetCaption ("Le jeu", NULL);
SDL_FillRect (p_fenetre, NULL, SDL_MapRGB (p_fenetre ->format,50,60,68));
SDL_Flip (p_fenetre);
char t[10]= {0};
for (int i = 0; i<1;i++) // Boucle d'aucune utlité en soi sauf qu'un objet y est créé puis normalment détruit à la fin de la boucle
{
c_affiche o_verd (p_fenetre, "lolo",124,124,20); // Création de l'objet qui affiche lolo
SDL_Delay (4000);
} // C'est à ce moment là que j'espère la libéralisation de la mémoire occupée par l'objet !
SDL_FillRect (p_fenetre, NULL, SDL_MapRGB (p_fenetre ->format,50,60,68)); // On efface l'écran
SDL_Flip (p_fenetre);
c_clavier o_mimi (p_fenetre, t ,300); // Création de l'objet . L'utilisteur entre un texte (10 mots max), le texte est affiché
SDL_Delay (4000); // Pour avoir le temps d'admirer mon oeuvre
TTF_Quit ();
SDL_Quit ();
return EXIT_SUCCESS;
// Un programme fort intéressant, n'est-il pas ?
}
J'vais regarder un peu les delete (c'est un passage du livre que j'ai pas trop vu encore)
tu peux toujours appeler ton destructeur après ta pause si tu veux...
for (int i = 0; i<1;i++) // Boucle d'aucune utilité en soi sauf qu'un objet y est créé puis normalement détruit à la fin de la boucle
{
c_affiche o_verd (p_fenetre, "lolo",124,124,20); // Création de l'objet qui affiche lolo
SDL_Delay (4000);
o_verd.~c_affiche();
}
et dans ton destructeur rajoute un delete pour chaque pointeur ;)
__________________________
............ Curtis: RTS 3D .............. ......
........... TeamMoteurProg...........
Pas trop marché avec les delete. Mais c'est pas grave. Pour l'instant la classe marche. Quand je m'y connaitrait un peu mieux, je reviendrais sur ce problème.
Merci pour ton aide