Bonjour,

Lors de la réalisation d'un exercice, je suis tombé sur une erreur que je ne comprend pas.

J'ai trouvé la solution, mais je n'en comprend pas la raison.

J'ai donc une fonction de type int depuis laquelle je retourne une valeur:

Le prototype de ma fonction

Code : Sélectionner tout - Visualiser dans une fenêtre à part
int init_stGestMsg(int *pRC);
L'appel depuis le main

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
	if (init_stGestMsg(&pRC) == GM_ERROR)
	{
		puts(GM_INIT_ERROR);
	}
	else
	{
		puts(GM_INIT_OK);
	}

et la fonction
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
 
int init_stGestMsg(int *pRC)
{
 
 
	// -------------------------------------------------------------------------------------------------------
	// Initialisation des variables
	etGestMsg stGestMsg = {NULL, 0, 5};
 
	stGestMsg.dTailleBlocMax = stGestMsg.dTailleBloc;
 
	// -------------------------------------------------------------------------------------------------------
	// Création du tableau de messages TabMsg
	if ((stGestMsg.tTabMsg = malloc(stGestMsg.dTailleBloc * sizeof(char*))) == NULL)
	{
		return GM_ERROR;
	}
	else
	{
		return GM_OK;
	}
 
}

jusque la tout va bien..

Mais en relisant l'exercice demandé par le prof, je m’aperçois qu'il demande à ce que la fonction soit de type void.

du coup j’édite le type de la fonction avec un void et je fais les modif dans la fonction comme ceci

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
void init_stGestMsg(int *pRC)
{
 
 
	// -------------------------------------------------------------------------------------------------------
	// Initialisation des variables
	etGestMsg stGestMsg = {NULL, 0, 5};
 
	stGestMsg.dTailleBlocMax = stGestMsg.dTailleBloc;
 
	// -------------------------------------------------------------------------------------------------------
	// Création du tableau de messages TabMsg
	if ((stGestMsg.tTabMsg = malloc(stGestMsg.dTailleBloc * sizeof(char*))) == NULL)
	{
		*pRC = GM_ERROR;
	}
	else
	{
		*pRC = GM_OK;
	}
 
}
et j'ai l'erreur dans le main dont je parlais et que je ne comprend pas ou il souligne ma fonction en rouge et me dit que "l'expression doit avoir un type arithmétique ou pointeur"

La solution que j'ai trouvé est d'ajouter une * apres le void dans le prototype

Code : Sélectionner tout - Visualiser dans une fenêtre à part
void * init_stGestMsg(int *pRC);
et de faire de même dans le fichier de la fonction évidemment..

En chipotant, je me rend compte que c'est a cause de l'inclusion de l'appel de fonction dans mon If
Code : Sélectionner tout - Visualiser dans une fenêtre à part
if (init_stGestMsg(&pRC) == GM_ERROR)
que cela pose problème, et que si j'appelle la fonction en dehors du If, je n'ai pas besoin de rajouter l'* après le void..

Et c'est la qu'est ma question.. Pourquoi???