Bonsoir,
Après avoir relu différentes parties du cours C de ZdS et effectué quelques recherches, je ne trouve pas la soultion à mon problème.
J’ai fait un petit gestionnaire d’erreurs qui intègre une allocation dynamique d’une chaine de caractères. Une fonction est chargée de cela, une autre fonction qui gère l’affichage verra sa variable assignée du retour de la fonction allouante.
L’allocation dynamique se passe correctement, sa libération de même, aucun segfault, aucune erreur et aucun warning de la part de GCC, ni même de la part de GDB (Pas utilisé Valgrind pour voir une fuite )
Seulement, lorsque la fonction d’affichage de l’erreur rentre dans la danse, elle affiche une chaîne vide
Cette chaîne dynamiquement allouée passe par argument dans un sprintf()
ou il y est copié une autre chaîne de caractère.
Voici le code:
errorsHandler.c (Le header ne contient que des prototypes et une enum
)
/*
SHADOW MAN - SOURCE CODE
AUTHOR: P4RADOX
BEGIN DATE: 12/17/2018
LICENSE: GNU GPLv3
FILE: errorsHandler.c
*/
#include "errorsHandler.h"
char* allocateMsg()
{
char* msg = NULL;
msg = malloc(sizeof(char) * 0x200);
if(msg == NULL)
return NULL;
else
return msg;
}
void freeMsg(char* msgText)
{
free(msgText);
}
void displayError(enum errorType errType)
{
char* errorMsg = allocateMsg();
if(errorMsg == NULL)
fprintf(stderr, "[MEMORY]\terrorsHandler message allocation failed !\n");
else
{
sprintf(errorMsg, SDL_GetError()); /*
Refers to the first SDL error encountered in case of fallback to avoid only SDL MessageBox display error
occured after what interest us due to SDL last error handling system.
*/
/*
Enum will determinate which error type is: SDL for SDL2 troubleshooting or GAME for game troubleshooting like bas image path.
SDL MessageBox will fail if it can't display itself, so we're displaying instead errors in stderr (Fallback)
*/
switch(errType)
{
case SDL:
if(SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Shadow Man - SDL Error", errorMsg, NULL) < 0)
{
fprintf(stderr, "[SDL]\tCan\'t display messagebox: %s\n", SDL_GetError());
fprintf(stderr, "[SDL]\t%s\n", errorMsg);
}
break;
case GAME:
if(SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Shadow Man - Game Error", errorMsg, NULL) < 0)
{
fprintf(stderr, "[SDL]\tCan\'t display messagebox: %s\n", SDL_GetError());
fprintf(stderr, "[GAME]\t%s\n", errorMsg);
}
break;
default:
break;
}
freeMsg(errorMsg);
}
}
Merci d’avance ! (Moi, je vais bercer mon cerveau au lit car il commence à penser à des solutions farfelues et pas propres…)