Bonjour à tous,

Programme en général :

Le programme que j'ai écrit est un programme de jeux Pile ou face. L'utilisateur rentre p ou f et grace aux fonctions "aléatoires" du C on génére pile ou face.

Problème realloc() : [RESOLU]

On nous a demandé d'optimiser l'espace mémoire, on doit stocker le tirage et les propositions du pile ou face, ce que je fais grâce a un pointeur. J'utilise malloc() au départ :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
/* Allocation de tab_tirage et tab_proposition d'une taille mémoire d'un char.
*/
tab_tirage =  malloc( sizeof(char));	// Le retour du malloc pourrait être caster (void*) mais c'est inutile.
	if (tab_tirage == NULL)
	{
		printf("MALLOC : Erreur d'allocation\n");
		exit(1);
	}
tab_proposition =  malloc( sizeof(char));
	if (tab_proposition == NULL)
	{
		printf("MALLOC : Erreur d'allocation\n");
		exit(1);
	}
Et a chaque fois que l'utilisateur re-lance une pièce je realloc ces deux vecteurs d'une case :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
 
/* 
A chaque fois que l'utilisateur lance une nouvelle piece on allonge notre vecteur de 1 case (de taille char) pour stocker le résultat. 
*/
 
void alloueMemoire(char*tab_tirage,char *tab_proposition){
 
/* /!\ realloc() renvoie un nouveau pointeur, problème ?
*/
 
	tab_tirage = realloc((char*)(tab_tirage),cpt_lancePiece* sizeof(char));	
	if (tab_tirage == NULL)
	{	
		printf("REALLOC : Erreur d'allocation\n");
		exit(1);
	}
 
	tab_proposition = realloc((char*)(tab_proposition),cpt_lancePiece* sizeof(char));
	if (tab_proposition == NULL)
	{
		printf("REALLOC : Erreur d'allocation\n");
		exit(1);
	}
 
}
J'ai consulté de nombreux forums d'aide et ils donnaient des solutions diverses et variées mais qui n'ont pas résolu mon problème.
Ha oui... le problème justement, c'est que au bout de 24 lancé (virtuelle) de pièce, par conséquent au bout de 24 realloc() j'ai une erreur de segmentation.
Il parait que ce n'est pas trop conseillé de reallocé autant mais bon sinon que faire ? Mais ce qui m'interresse c'est surtout de savoir pourquoi ca ne va pas.

Solution : Quelques améliorations dans la fonction realloc en cas de cr@sh ! Mon problème se situait au niveau de la variable pieceLance qui ne valait, lors du premier passage, 1. Donc la fonction re-alloc ré-allouait seulement 1 case (inutile & inefficace).


Problème 2 : Vider le buffer clavier.
[RESOLU]

Ce n'est pas vraiment un problème plutot quelque chose d'agacant.
A un moment donné je demande à l'utilisateur d'entré P ou F :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
 
	char buffer=0;		// Variable locale à la fonction lancePiece.	
 
// Vérification de l'entrée de l'utilisateur.
 
	while (buffer != 70 && buffer != 80 && buffer != 102 && buffer != 112 )
	{
		printf("Quelle est votre proposition ? <Pour pile taper p ou f pour face> : ");
		clean_stdin();
		buffer = getchar();
	}
Fonction clean_stdin(), venant de la faq de ce forum.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
 
void clean_stdin(void)
{
    int c;
 
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}
Lorsque l'utilisateur se trompe, n'entre rien et clique directement sur enter, lorsqu'il va essayer de re-entré p ou f il devra l'entré 2 fois de cette facon :

p <enter> p <enter>

Comment puis-je arranger ca ?

Solution : Nouvelle fonction LireClavier();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
int LireClavier(void)
{
  int car,c;
  car = c = getchar();
  while (c != '\n' && c != EOF)c = getchar();
  return car;
}
Merci d'avoir lu mon post et de vos prochaines aides =)

Bye bye