Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/12/2012, à 21:58

Bat_Tuc

gestion mémoire C

Bonjour
j'ai un programme dans lequel j'execute plusieurs fois ( plusieurs milliers de fois ..) une fonction.
Or dans cette fonction je définie et initialise plusieurs variable.
Ma question est la suivante.
Faut il que je fasse un free sur ces variables ou se fera t'il automatiquement lors de mon return ?
de plus n ' étant pas tres bon dans la gestion de la mémoire, j'ai du mal a comprendre comment marche un free ..
est ce seulement sur les pointeurs ?
J'ai des erreurs de compilation quand je fais un free sur un int .
Pourquoi ?


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#2 Le 04/12/2012, à 22:02

Bat_Tuc

Re : gestion mémoire C

int Cycle (int CagnotteDepart){ // return 1 si faillite
	int nbJoueurs,i,j,SommegainJ,indiceSemaine;
	int* ChoixForm,* tirage,*grilleJoueur;
	for(indiceSemaine=1;indiceSemaine<157;indiceSemaine++){
		nbJoueurs=Nbjoueurs(2000,(((indiceSemaine-1)%52)+1));
		ChoixForm=ChoixFormule(nbJoueurs,g,TablForm);
		tirage=Tirage(0,g,0); // grille gagnante
		SommegainJ=0;// gain des joueurs pour le tirage			
			for(j=0;j<3;j++){
				for(i=0;i<ChoixForm[j];i++){
					grilleJoueur=Tirage(j,g,1);
					SommegainJ+=gain(j,NbBonNumero(3,grilleJoueur,tirage));
					free(grilleJoueur);
				}
			}				
		CagnotteDepart+=gainEnt(SommegainJ,Coutfixe(nbJoueurs),ChoixForm);
		free(ChoixForm);
		free(tirage);
		if(CagnotteDepart<0) return 1;
	}
	return 0;
}

si ca peut aider ..


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#3 Le 05/12/2012, à 11:27

claudius01

Re : gestion mémoire C

Bonjour,

- Si les 2 méthodes ChoixFormule() et Tirage() allouent respectivement un pointeur int * qu'elles retournent, je dirais oui.
- Quelle est précisément l'erreur de compilation sur les free() ?
- Sinon, pour info. les 2 variables g et TablForm ne sont pas déclarées ;-(


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 05/12/2012, à 17:25)

Hors ligne

#4 Le 05/12/2012, à 19:03

Bat_Tuc

Re : gestion mémoire C

claudius01 a écrit :

- Sinon, pour info. les 2 variables g et TablForm ne sont pas déclarées ;-(

Variable Global ;-)


en rajoutant ceci

free(nbJoueurs);
free(i);
free(j);
free(SommegainJ);
free(indiceSemaine);

apparrait cette erreur

projet2.c: In function ‘Cycle’:
projet2.c:178:1: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
In file included from projet2.c:2:0:
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
projet2.c:179:1: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
In file included from projet2.c:2:0:
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
projet2.c:180:1: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
In file included from projet2.c:2:0:
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
projet2.c:181:1: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
In file included from projet2.c:2:0:
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
projet2.c:182:1: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
In file included from projet2.c:2:0:
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
claudius01 a écrit :

- Si les 2 méthodes ChoixFormule() et Tirage() allouent respectivement un pointeur int * qu'elles retournent, je dirais oui.

mes fonctions ChoixForm et Tirage retourne bien un int *


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#5 Le 06/12/2012, à 11:18

claudius01

Re : gestion mémoire C

Bonjour,

- Ok pour les variables globales...
- Maintenant, pourquoi vouloir libérer les 5 variables automatiques (nbJoueurs, i, j, SommegainJ et indiceSemaine) et qui plus est de type int
  => le message d'erreur "expected ‘void *’ but argument is of type ‘int’" est vraiment explicite...

- cf. http://rperrot.developpez.com/articles/c/allocationC/ et http://www.manpagez.com/man/3/free/

- Pour finir

Bat_Tuc a écrit :

mes fonctions ChoixForm et Tirage retourne bien un int *

... oui mais, on ne sait toujours pas si ce sont des variables globales ou le résultat d'une allocation par calloc(), malloc(), realloc(), etc. J'ose espérer que ce ne sont pas des variables locales auxdites fonctions...


Cordialement, A+
--
Claudius

Hors ligne

#6 Le 14/12/2012, à 22:36

chaoswizard

Re : gestion mémoire C

Bonjour,

Houalalala le massacre !

Quelques idées en vrac :

  • Pour la gestion mémoire, il n'est nécessaire d'allouer soi-même la mémoire que si on ne sait pas à l'avance (avant la compilation) le nombre d'éléments (tableau) que l'on va manipuler. Sinon, il suffit de définir les variables de façon statique et elles seront automatiquement détruites à la fin d'un bloc.

  • Il ne faut libérer la mémoire que si elle a été allouée : un malloc (ou calloc) = un free.

  • Pour un type primitif, il est sans doute plus simple de le retourner par valeur que par pointeur.

Et les exemples qui vont avec :

void afficherTableau( int *tableau, int taille )
{
	/* Il n'est pas nécessaire d'allouer dynamiquement cet entier
	 * il sera détruit automatiquement à la sortie de la fonction
	 */
	int i;
	
	for( i = 0 ; i < taille ; ++i )
	{
		printf( "%d = %d\n", i, tableau[ i ] );
	}
}
int *creerTableau( int taille )
{
	int *tableau;
	
	/* Il n'est pas possible, a la compilation, de savoir
	 * la taille que fera le tableau, il faut donc l'allouer 
	 * dynamiquement.
	 * Il faudra bien penser à libérer la mémoire plus tard avec free
	 */
	tableau = malloc( taille * sizeof( int ) );
	return tableau;
}

Pour le reste, il vaut sans doute mieux aller lire un tuto sur le fonction des pointeurs et la gestion de la mémoire !

Dernière modification par chaoswizard (Le 14/12/2012, à 22:40)


Ubuntu ==> Debian ==> Archlinux

Hors ligne