gribix1 Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 slt alors je debute en c (et j adore), je viens de terminer les tutos de m@teo21 (qui sin géniaux) et j'ai eu l envie de me lancer ds un plus "grand" projet. j'essaye de faire un petit lecteur audio. maintenat passons a mon probleme il est simple et chiant: je lance mon programme , jusque la tt va bien et je me demande combien ca prend de memoire donc ctrl-alt-delete et la surprise je voit que la memoire vive utiliser par mon programme ne fait qu augmenter!! c'est assez embetant puisque a un certain moment mon ordi commence a "ralentir" et donc ce programme devient inutilisable j espere que vous aves compris je vais maintenat vous mon trer mon code c assez long je vous previens #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <SDL/SDL_ttf.h> #include <FMOD/fmod.h> #include <dirent.h> #include <sys/types.h> #include "interface_graphique.h" #include "player.h" int main(int argc, char *argv[]) { FSOUND_Init(44100, 32, 0); SDL_Init(SDL_INIT_VIDEO); interface_graphique(); SDL_Quit(); FSOUND_Close(); return EXIT_SUCCESS; } #include <stdlib.h>#include <stdio.h>#include <SDL/SDL.h>#include <SDL/SDL_image.h>#include <SDL/SDL_ttf.h>#include <FMOD/fmod.h>#include <dirent.h>#include <sys/types.h>#include "interface_graphique.h"#include "player.h"#define DELAI_RAFRAICHISSEMENT 25// pointeurs et variables necessaire au multiples foncyions du dossierSDL_Surface *frequence = NULL, *ecran = NULL, *frequence_rouge = NULL, *temps = NULL, *restant = NULL, *titre_chanson = NULL;SDL_Rect positionFond, positionFrequence, position;TTF_Font *police = NULL, *police14 = NULL;SDL_Color couleurNoire = {0, 0, 0};float *spectre = NULL;double resultat = 0.0;long duree = 00, tempsQuiReste = 0, ratio = 0, playPause = 0, nbFichier = 0, debutChaine = 2;char tempsChanson[10] = "", tempsRestant[10] = "", title_chanson[150] = "";char* title;int isPlaying = 0, deja = 0;//fonction initialisationvoid interface_graphique(){ TTF_Init();//initialiastion TTF // initialisation des SDL surface SDL_Surface *fond = NULL, *barre_de_titre = NULL, *audioball_codename = NULL,*triball = NULL, *play = NULL; SDL_Surface *stop = NULL, *active = NULL, *baffle = NULL, *barreTemps = NULL, *barreDAvancement = NULL, *barreSon = NULL; SDL_Surface *son = NULL, *retour = NULL, *suivant = NULL, *change = NULL, *bibliotheque = NULL, *quitter = NULL; SDL_Surface *pause = NULL, *play_pause = NULL; SDL_Event event; // SDL evenement initialisation //SDL initialisation des position SDL_Rect positionBarreDeTitre, positionaudioball, positiontriball, positionplay, positionstop, positionactive; SDL_Rect positionbaffle, positionBarreTemps, positionBarreDAvancement, positionBarreSon, positionSon, positionRetour; SDL_Rect positionSuivant, positionChange, positionBibliotheque, positionQuitter, positionTemps, positionRestant; //variables int continuer = 1; long test = 1, tempsActuel = 0, tempsPrecedent, fin = 0, avancementAutoBarreTemps = 0; //definiton des positions positionFond.x = (1280 / 2) - (1000 / 2); positionFond.y = 1024 - 125; positionBarreDeTitre.x = positionFond.x + 130; positionBarreDeTitre.y = positionFond.y + 5; position.x = positionBarreDeTitre.x + 20; position.y = positionBarreDeTitre.y + 6; positionaudioball.x = 1280/2 - 100; positionaudioball.y = 1024/2 - 200; positiontriball.x = 1280/2 + 110; positiontriball.y = 1024/2 - 150; positionplay.x = positionFond.x + 3; positionplay.y = positionFond.y + 32; positionstop.x = positionFond.x + 68; positionstop.y = positionFond.y + 22; positionactive.x = positionFond.x + 108; positionactive.y = positionFond.y + 57; positionbaffle.x = positionFond.x + 538; positionbaffle.y = positionFond.y + 77; positionBarreTemps.x = positionFond.x + 159; positionBarreTemps.y = positionFond.y + 77; positionBarreDAvancement.x = positionFond.x + 161; positionBarreDAvancement.y = positionFond.y + 89; positionBarreSon.x = positionFond.x + 580; positionBarreSon.y = positionFond.y + 30; positionSon.x = positionFond.x + 572; positionSon.y = positionFond.y + 27; positionRetour.x = positionFond.x + 2; positionRetour.y = positionFond.y + 95; positionSuivant.x = positionFond.x + 58; positionSuivant.y = positionFond.y + 95; positionChange.x = positionFond.x + 920; positionChange.y = positionFond.y + 22; positionBibliotheque.x = positionFond.x + 855; positionBibliotheque.y = positionFond.y + 32; positionQuitter.x = positionFond.x + 960; positionQuitter.y = positionFond.y + 57; positionTemps.x = positionFond.x + 126; positionTemps.y = positionFond.y + 82; positionRestant.x = positionFond.x + 495; positionRestant.y = positionFond.y + 82; //chargement fenetre ecran = SDL_SetVideoMode (1280, 1024, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN); SDL_WM_SetCaption ("version de recherche d un programme de lecture audio", NULL); //chargement des images fond = IMG_Load ("fond.bmp"); SDL_SetColorKey(fond, SDL_SRCCOLORKEY, SDL_MapRGB(fond->format, 253, 215, 215)); barre_de_titre = IMG_Load ("barre_de_titre.bmp"); SDL_SetColorKey(barre_de_titre, SDL_SRCCOLORKEY, SDL_MapRGB(barre_de_titre->format, 253, 215, 215)); SDL_SetAlpha(barre_de_titre, SDL_SRCALPHA, 128); audioball_codename = IMG_Load ("audioball_codename.bmp"); triball = IMG_Load ("triball.bmp"); SDL_SetColorKey(triball, SDL_SRCCOLORKEY, SDL_MapRGB(triball->format, 253, 215, 215)); play = IMG_Load ("play.bmp"); SDL_SetColorKey(play, SDL_SRCCOLORKEY, SDL_MapRGB(play->format, 255, 255, 255)); SDL_SetAlpha(play, SDL_SRCALPHA, 200); stop = IMG_Load ("stop.bmp"); SDL_SetColorKey(stop, SDL_SRCCOLORKEY, SDL_MapRGB(stop->format, 255, 255, 255)); SDL_SetAlpha(stop, SDL_SRCALPHA, 200); active = IMG_Load ("active.bmp"); SDL_SetColorKey(active, SDL_SRCCOLORKEY, SDL_MapRGB(active->format, 255, 255, 255)); SDL_SetAlpha(active, SDL_SRCALPHA, 200); baffle = IMG_Load ("baffle.bmp"); SDL_SetColorKey(baffle, SDL_SRCCOLORKEY, SDL_MapRGB(baffle->format, 255, 255, 255)); barreTemps = IMG_Load ("barre_temps.bmp"); SDL_SetColorKey(barreTemps, SDL_SRCCOLORKEY, SDL_MapRGB(barreTemps->format, 255, 255, 255)); SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 200); barreDAvancement = SDL_CreateRGBSurface(SDL_HWSURFACE, 328, 1, 32, 0, 0, 0, 0); SDL_FillRect(barreDAvancement, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); barreSon = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 75, 32, 0, 0, 0, 0); SDL_FillRect(barreSon, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); son = IMG_Load ("son.bmp"); SDL_SetColorKey(son, SDL_SRCCOLORKEY, SDL_MapRGB(son->format, 255, 255, 255)); SDL_SetAlpha(son, SDL_SRCALPHA, 200); retour = IMG_Load ("retour.bmp"); SDL_SetColorKey(retour, SDL_SRCCOLORKEY, SDL_MapRGB(retour->format, 255, 255, 255)); SDL_SetAlpha(retour, SDL_SRCALPHA, 200); suivant = IMG_Load ("suivant.bmp"); SDL_SetColorKey(suivant, SDL_SRCCOLORKEY, SDL_MapRGB(suivant->format, 255, 255, 255)); SDL_SetAlpha(suivant, SDL_SRCALPHA, 200); change = IMG_Load ("change.bmp"); SDL_SetColorKey(change, SDL_SRCCOLORKEY, SDL_MapRGB(change->format, 255, 255, 255)); SDL_SetAlpha(change, SDL_SRCALPHA, 200); bibliotheque = IMG_Load ("bibliotheque.bmp"); SDL_SetColorKey(bibliotheque, SDL_SRCCOLORKEY, SDL_MapRGB(bibliotheque->format, 255, 255, 255)); SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 200); quitter = IMG_Load ("active.bmp"); SDL_SetColorKey(quitter, SDL_SRCCOLORKEY, SDL_MapRGB(quitter->format, 255, 255, 255)); SDL_SetAlpha(quitter, SDL_SRCALPHA, 200); play_pause = IMG_Load ("play.bmp"); SDL_SetColorKey(play_pause, SDL_SRCCOLORKEY, SDL_MapRGB(play_pause->format, 255, 255, 255)); SDL_SetAlpha(play_pause, SDL_SRCALPHA, 200); pause = IMG_Load ("pause.bmp"); SDL_SetColorKey(pause, SDL_SRCCOLORKEY, SDL_MapRGB(pause->format, 255, 255, 255)); SDL_SetAlpha(pause, SDL_SRCALPHA, 200); //chargement des polices police = TTF_OpenFont("arial.ttf", 12); police14 = TTF_OpenFont("arial.ttf", 14); //ouverture boucle principale while (continuer) { frequence = IMG_Load ("frequence.bmp"); SDL_SetAlpha(frequence, SDL_SRCALPHA, 160); frequence_rouge = IMG_Load ("frequence_rouge.bmp"); SDL_SetAlpha(frequence_rouge, SDL_SRCALPHA, 160); nbFichier = nombreDeFichier(); SDL_PollEvent(&event);// chargement de SDL evenement switch(event.type)//condition des differents evenement... { case SDL_QUIT: continuer = 0; break; case SDL_MOUSEMOTION://...par rapport a la position de la souris if (event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93) { SDL_SetAlpha(play, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 73 && event.button.x <= positionFond.x + 111 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64) { SDL_SetAlpha(stop, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 112 && event.button.x <= positionFond.x + 130 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79) { SDL_SetAlpha(active, SDL_SRCALPHA, 255); } else if (event.button.x >= positionBarreTemps.x && event.button.x <= positionBarreTemps.x + 35 && event.button.y >= positionBarreTemps.y && event.button.y <= positionBarreTemps.y + 20) { SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 255); } else if (event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y + 1 >= positionSon.y && event.button.y <= positionSon.y + 14) { SDL_SetAlpha(son, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) { SDL_SetAlpha(retour, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 59 && event.button.x <= positionFond.x + 76 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) { SDL_SetAlpha(suivant, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 862 && event.button.x <= positionFond.x + 919 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93) { SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 925 && event.button.x <= positionFond.x + 963 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64) { SDL_SetAlpha(change, SDL_SRCALPHA, 255); } else if (event.button.x >= positionFond.x + 964 && event.button.x <= positionFond.x + 982 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79) { SDL_SetAlpha(quitter, SDL_SRCALPHA, 255); } else { SDL_SetAlpha(play, SDL_SRCALPHA, 200); SDL_SetAlpha(stop, SDL_SRCALPHA, 200); SDL_SetAlpha(active, SDL_SRCALPHA, 200); SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 200); SDL_SetAlpha(son, SDL_SRCALPHA, 200); SDL_SetAlpha(retour, SDL_SRCALPHA, 200); SDL_SetAlpha(suivant, SDL_SRCALPHA, 200); SDL_SetAlpha(quitter, SDL_SRCALPHA, 200); SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 200); SDL_SetAlpha(change, SDL_SRCALPHA, 200); } break; case SDL_MOUSEBUTTONDOWN://...si on clique if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 159 && event.button.x <= positionFond.x + 459 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) {//POSITION PISTE positionBarreTemps.x = event.button.x - 14; controle_position(positionFond.x, event.button.x, ratio); } else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 460 && event.button.x <= positionFond.x + 487 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) {//POSITION PISTE positionBarreTemps.x = positionFond.x + 444; controle_position(positionFond.x, event.button.x, ratio); } else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 157 && event.button.x <= positionFond.x + 158 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) {//POSITION PISTE positionBarreTemps.x = positionFond.x + 173; controle_position(positionFond.x, event.button.x, ratio); } else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 89) {//VOLUME positionSon.y = event.button.y - 7; controle_volume(positionFond.y, event.button.y); } else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 90 && event.button.y <= positionFond.y + 108) {//VOLUME positionSon.y = positionFond.y + 91; controle_volume(positionFond.y, event.button.y); } else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 23 && event.button.y <= positionFond.y + 26) {//VOLUME positionSon.y = positionFond.y + 27; controle_volume(positionFond.y, event.button.y); } else if (test == 1 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93) {//PLAY INITIALISATION initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; deja = 1; } else if (test == 2 && debutChaine < nbFichier - 1 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 59 && event.button.x <= positionFond.x + 76 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) {//SUIVANT action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; debutChaine++; initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; } else if (test == 2 && debutChaine > 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) {//RETOUR action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; debutChaine--; initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; } else if (test == 2 && debutChaine == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) {//RETOUR CHANSON 1 action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; } else if (test == 2 && debutChaine > 2 && duree >= 20000 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114) {//retour action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; deja = 0; initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; deja = 1; } else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93 ) {//PLAY-PAUSE action_play(); if ( playPause == 1) { play = play_pause; playPause = 0; } else { play = pause; playPause = 1; } } else if (event.button.x >= positionFond.x + 73 && event.button.button == SDL_BUTTON_LEFT && event.button.x <= positionFond.x + 111 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64) {//STOP action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; deja = 0; } else if (event.button.x >= positionFond.x + 964 && event.button.button == SDL_BUTTON_LEFT && event.button.x <= positionFond.x + 982 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79) { continuer = 0; } break; case SDL_KEYDOWN://...avec le clavier switch (event.key.keysym.sym) { case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */ continuer = 0; break; } break; } tempsActuel = SDL_GetTicks();// ici on fait la pause de 25 ms pour decharger le proceceur if (tempsActuel - tempsPrecedent < DELAI_RAFRAICHISSEMENT) { SDL_Delay(DELAI_RAFRAICHISSEMENT - (tempsActuel - tempsPrecedent)); } tempsPrecedent = SDL_GetTicks(); SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));// effaçage de l écran isPlaying = playing ();//est-ce en lecture ?? //chargement du titre if (test == 2) sprintf(title_chanson, "%s", titre()); titre_chanson = TTF_RenderText_Blended(police14, title_chanson, couleurNoire); if (duree == fin && debutChaine < nbFichier - 1 && deja == 1)//la chanson est fini? on passe a la suivante alors { debutChaine++; action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; initialisation(test, debutChaine); play = pause; playPause = 1; test = 2; } else if (duree == fin && debutChaine == nbFichier - 1)//la chanson est finie et c'est la derniere alors STOP { action_stop(); test = 1; positionBarreTemps.x = positionFond.x + 159; play = play_pause; playPause = 0; debutChaine = 2; deja = 0; } if (test == 2)// si la chanson est demare, alors on lance les fonctions suivantes, ki servent a voir le temps total et accompli de la musique { fin = fin_musique(); duree = duree_musique(); } ratio = fin /328;//calcul du ratio tempsQuiReste = fin - duree;//analyse du temps restant if ( test == 2)//positionnement automatique de la barre d'avancement { avancementAutoBarreTemps = duree / (fin/300); positionBarreTemps.x = positionFond.x + 173 - 14 + avancementAutoBarreTemps; } // blitage des surfaces SDL_BlitSurface(fond, NULL, ecran, &positionFond); SDL_BlitSurface(barre_de_titre, NULL, ecran, &positionBarreDeTitre); SDL_BlitSurface(audioball_codename, NULL, ecran, &positionaudioball); SDL_BlitSurface(triball, NULL, ecran, &positiontriball); SDL_BlitSurface(play, NULL, ecran, &positionplay); SDL_BlitSurface(stop, NULL, ecran, &positionstop); SDL_BlitSurface(active, NULL, ecran, &positionactive); SDL_BlitSurface(baffle, NULL, ecran, &positionbaffle); SDL_BlitSurface(barreDAvancement, NULL, ecran, &positionBarreDAvancement); SDL_BlitSurface(barreTemps, NULL, ecran, &positionBarreTemps); SDL_BlitSurface(barreSon, NULL, ecran, &positionBarreSon); SDL_BlitSurface(son, NULL, ecran, &positionSon); SDL_BlitSurface(retour, NULL, ecran, &positionRetour); SDL_BlitSurface(suivant, NULL, ecran, &positionSuivant); SDL_BlitSurface(change, NULL, ecran, &positionChange); SDL_BlitSurface(bibliotheque, NULL, ecran, &positionBibliotheque); SDL_BlitSurface(quitter, NULL, ecran, &positionQuitter); if (test == 2)//si chanson en cours, alors on affiche le temps restant et accompli { position_temps_chanson(duree, fin); position_temps_restant(tempsQuiReste); } else if (test == 1)//sinon on affiche 00:00 { temps = TTF_RenderText_Blended(police, "00:00", couleurNoire); restant = TTF_RenderText_Blended(police, "00:00", couleurNoire); } if (test == 2)//si la chanson est en cours, alors on affiche le spectre sonore { affichage(); } SDL_BlitSurface(temps, NULL, ecran, &positionTemps);//on blite ces deux surface du temps SDL_BlitSurface(restant, NULL, ecran, &positionRestant); SDL_BlitSurface(titre_chanson, NULL, ecran, &position); SDL_Flip(ecran);// et enfin on affiche l écran } //on libere la memoire Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 Tu devrais isoler et desactiver des pan de code et voir si tu a tjrs la meme fuite memoire ou pas. Tu devrais pouvoir resserrer la recherche petit a petit jusqu'a trouver le pan de code qui fuit. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 +1 Tu peux aussi vérifier les éventuels warnings à la compil (tu compiles avec -g -ansi -pedantic ? Au moins -g, c'est le minimum). Sinon electric fence permet de gérer les problèmes de programmes mal concus qui "fonctionnent" par chance (due à la pagination de la mémoire (avec des pages de 4ko souvent)) Lien vers le commentaire Partager sur d’autres sites More sharing options...
gribix1 Posté(e) le 25 août 2006 Auteur Partager Posté(e) le 25 août 2006 je vien de remarque que lorsue je retire la fonction de lecture audio, la memoire augmente, mais moin vite donc d apres moi il devrais avoir un probleme de liberation memoire, voous en penser quoi? si c 'est ca j ai deja essayer plusieur changement mais rien n y fait. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 nope dans un programme, la taille en mémoire doit finir par atteindre un état stable, si ça ne fait qu'aughmenter, c'est qu'il y a toujours une fuite. on a pas la fin de ton code (avec les libérations justement) c'est un peu chaud pour t'aider Lien vers le commentaire Partager sur d’autres sites More sharing options...
gribix1 Posté(e) le 25 août 2006 Auteur Partager Posté(e) le 25 août 2006 oups y a eu un petit probleme en effet est ce que le forum n accepte pas plus de x lignes bon c 'est rien voici la fin //on libere la memoire SDL_FreeSurface(ecran); SDL_FreeSurface(fond); SDL_FreeSurface(barre_de_titre); SDL_FreeSurface(audioball_codename); SDL_FreeSurface(triball); SDL_FreeSurface(play); SDL_FreeSurface(stop); SDL_FreeSurface(active); SDL_FreeSurface(baffle); SDL_FreeSurface(barreTemps); SDL_FreeSurface(barreDAvancement); SDL_FreeSurface(barreSon); SDL_FreeSurface(son); SDL_FreeSurface(retour); SDL_FreeSurface(suivant); SDL_FreeSurface(quitter); SDL_FreeSurface(bibliotheque); SDL_FreeSurface(change); SDL_FreeSurface(frequence); SDL_FreeSurface(frequence_rouge); SDL_FreeSurface(temps); SDL_FreeSurface(restant); SDL_FreeSurface(titre_chanson); liberation_memoire(); TTF_CloseFont(police);//et on ferme la police et ttf TTF_Quit(); } void affichage()//fonction qui gère le spectre { long a = 0, b = 600, c = 0, d = 0, e = 0; spectre = FSOUND_DSP_GetSpectrum(); while(d < 8) { positionFrequence.x = positionFond.x + b; while ( a < 64) { resultat = resultat + spectre[e]; a++; e++; } resultat = resultat / 64; if (resultat <=0.01 && resultat > 0.001) { test_c(96); } else if ( resultat > 0.01 && resultat <= 0.020) { test_c(96); test_c(85); } else if ( resultat > 0.020 && resultat <= 0.035) { test_c(96); test_c(85); test_c(74); } else if ( resultat > 0.035 && resultat <= 0.055) { test_c(96); test_c(85); test_c(74); test_c(63); } else if ( resultat > 0.055 && resultat <= 0.080) { test_c(96); test_c(85); test_c(74); test_c(63); test_c(52); } else if ( resultat > 0.08 && resultat <= 0.105) { test_c(96); test_c(85); test_c(74); test_c(63); test_c(52); test_c(41); } else if ( resultat > 0.105 && resultat <= 0.125) { test_c(96); test_c(85); test_c(74); test_c(63); test_c(52); test_c(41); test_c_rouge(30); } else if ( resultat > 0.125 && resultat <= 0.250) { test_c(96); test_c(85); test_c(74); test_c(63); test_c(52); test_c(41); test_c_rouge(30); test_c_rouge(19); } else if ( resultat > 0.250 && resultat <= 1.0) { test_c(96); test_c(85); test_c(74); test_c(63); test_c(52); test_c(41); test_c_rouge(30); test_c_rouge(19); test_c_rouge(8); } resultat = 0; a = 0; b = b + 30; d++; } } void position_temps_chanson (long milliseconde, long fin)//fonction qui calcul ou en est la chanson et l affiche en mm:ss { long seconde = 0, minute = 0, time = 0; time = milliseconde / 1000; minute = time / 60; seconde = time % 60; if (minute < 10 && seconde > 9) { sprintf(tempsChanson, "0%d:%d", minute, seconde);; } else if (minute > 9 && seconde < 10) { sprintf(tempsChanson, "%d:0%d", minute, seconde); } else if (minute < 10 && seconde < 10) { sprintf(tempsChanson, "0%d:0%d", minute, seconde); } else { sprintf(tempsChanson, "%d:%d", minute, seconde); } temps = TTF_RenderText_Blended(police, tempsChanson, couleurNoire); } void position_temps_restant (long milliseconde)//idem sauf ke c'est ce qu'il en reste { long seconde = 0, minute = 0, time = 0; time = milliseconde / 1000; minute = time / 60; seconde = time % 60; if (minute < 10 && seconde > 9) { sprintf(tempsRestant, "0%d:%d", minute, seconde); } else if (minute > 9 && seconde < 10) { sprintf(tempsRestant, "%d:0%d", minute, seconde); } else if (minute < 10 && seconde < 10) { sprintf(tempsRestant, "0%d:0%d", minute, seconde); } else { sprintf(tempsRestant, "%d:%d", minute, seconde); } restant = TTF_RenderText_Blended(police, tempsRestant, couleurNoire); } void test_c (long c) { positionFrequence.y = positionFond.y + c; SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence); } void test_c_rouge (long c) { positionFrequence.y = positionFond.y + c; SDL_BlitSurface(frequence_rouge, NULL, ecran, &positionFrequence); } #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <SDL/SDL_ttf.h> #include <FMOD/fmod.h> #include <dirent.h> #include <sys/types.h> #include <string.h> #include "interface_graphique.h" #include "player.h" #define THE_DIR "testMusique" FSOUND_STREAM *musique = NULL; FSOUND_SAMPLE *titre_de_la_chanson = NULL; struct dirent * dirData; long i = 0; void action_play() { if (FSOUND_GetPaused(1)) // Si la chanson est en pause FSOUND_SetPaused(FSOUND_ALL, 0); // On enlève la pause else // Sinon, elle est en cours de lecture FSOUND_SetPaused(FSOUND_ALL, 1); // On met en pause } long initialisation(long action, long j) { DIR * TheDir; TheDir = opendir(THE_DIR); i = telldir (TheDir); seekdir (TheDir, i + j); dirData = readdir(TheDir); char chaine2[150] = "testMusique/"; strcat(chaine2, dirData->d_name); musique = FSOUND_Stream_Open(("%s", chaine2), 0, 0, 0); FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1); FSOUND_Stream_Play(FSOUND_FREE, musique); closedir(TheDir); return 2; } void action_stop() { FSOUND_Stream_Stop(musique); FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0); FSOUND_Stream_Close(musique); } void liberation_memoire() { FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0); FSOUND_Stream_Close(musique); } void controle_volume(long positionFond_y, long positionSouris_y) { long x = 0, volume = 0; x = positionSouris_y - 23 - positionFond_y; x = 85 - x; volume = 3*x; FSOUND_SetVolume(FSOUND_ALL, volume); } long duree_musique() { long temps = 0; temps = FSOUND_Stream_GetTime (musique); return temps; } long fin_musique() { long temps = 0; temps = FSOUND_Stream_GetLengthMs (musique); return temps; } void controle_position (long positionFond, long positionSouris, long ratio) { long x =0, position = 0; x = positionSouris - 163 - positionFond; position = x * ratio; FSOUND_Stream_SetTime (musique, position); } long nombreDeFichier() { DIR * TheDir; struct dirent * dirData; long w =0; TheDir = opendir(THE_DIR); if (TheDir) { while(dirData = readdir(TheDir)) { w++; } printf("\n\n\n %ld", w); closedir(TheDir); } return w; } int playing () { return FSOUND_IsPlaying (FSOUND_ALL); } char* titre() { return FSOUND_Sample_GetName (FSOUND_Stream_GetSample (musique)); } voila j ai pas bcp de commentaires j espere que vous comprendrai je veux bien vous envoyer le programme suffit de me donner votre email merci d avance ps: desole pour la lourdeur du code donc si par la meme occasion vous avez des idées pour le reduire elles sont les bien venues. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 Sinon electric fence permet de gérer les problèmes de programmes mal concus qui "fonctionnent" par chance (due à la pagination de la mémoire (avec des pages de 4ko souvent)) Tu pourrai expliquer un peu ? ca m'interresse. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 25 août 2006 Partager Posté(e) le 25 août 2006 http://perens.com/FreeSoftware/ElectricFence/ Le principe (en résumé vite faite) c'est d'utiliser un malloc qui alloue ta mémoire à la fin de chaque page (de 4ko... ou pas rappelons le), comme ça, même si tu n'utilise moins de 4 ko, dès que ton programe a une erreur typique qui ammène à un segfault, ça plante direct et pas aléatoirement (vu que la prochaine page ne t'appartient pas). Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 26 août 2006 Partager Posté(e) le 26 août 2006 en gros, quand tu déborde, tu ne peux pas écraser de variables puisqu'il n'y en a pas juste derriere. Par contre, vu que tu changes de page, comme le dit theo, tu risque uniquement de violer un acces resreint. De fait, tu as un programme beaucoup moins aléatoire gribix1, ton code est quand même sacrément GruikGruiiiik... exemple : spectre = FSOUND_DSP_GetSpectrum(); while(d < 8) { positionFrequence.x = positionFond.x + b; while ( a < 64) { resultat = resultat + spectre[e]; a++; e++; } ... pourquoi pas plus simplement int a; for( a = 0; a < 64; resultat += spectre[a++] ); tu utilises deux variables, là où une seule suffit (c'est très condensé, mais l'idée est là ) d'autre part, je crois que tu ne libère jamais spectre, pourtant tu dois appeler affichage() un paquet de fois Lien vers le commentaire Partager sur d’autres sites More sharing options...
gribix1 Posté(e) le 26 août 2006 Auteur Partager Posté(e) le 26 août 2006 alor merci pour ces racourci lorinc : mes deux variables sont necessaire car il y en a une ki est remise a 0 pas l autre par contre je doit libérer spectre??? c juste un pointeur sur float pas un surface au autre chose, enfin si je doit kan meme, comment?? tsubasaleguedin: je comprend pas electric fence sinon si mon code est un peut GruikGruiiiik , ben c paske je debute j ai pas encore (dutt) les reflexe du genre , mais j'aprend^^ merci de m aider meme si je compren pas bien tt^^ Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 26 août 2006 Partager Posté(e) le 26 août 2006 ben je serais tenté de dire que quand tu fais ça : spectre = FSOUND_DSP_GetSpectrum(); si l'appel SDL ne te renvoie pas NULL, il a alloué de l'espace pour spectre, vu que ce n'est pas toi qui l'a fait... donc, free() !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
gribix1 Posté(e) le 26 août 2006 Auteur Partager Posté(e) le 26 août 2006 j ai l impression que ca augmente moin vite mais ca augmente tjs j ai essayer de faire free() avec d autre variable mais j ai des erreurs Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.