Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 mars 2007
-
26 déc. 2006 à 15:35
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
26 déc. 2006 à 17:19
Bonjour et joyeuses fêtes a tous ^^
J'ai un problème. J'ai une fonction qui vient lire des paramètres dans un fichier de configuration. Celle ci vient remplir une structure dont je revoie le pointeur. Voici le code
struct param
{
int success ;
char * temp;
char * csv;
char * dir;
int com;
int baudrate ;
};
test = fopen("c:\\test.txt", "w");
fprintf(test, "%s", pInitParam->csv);
fclose(test);
}
Ces deux fonctions sont dans des fichiers différents. Lors de la compilation, je n'ai aucune erreur. Cependant quand je lance le programme
j'obtient un message d'erreur handle exception ....access violation
Je ne vois pas trop d'ou ca vient
Dans la fonction appellante, je teste juste la valeur retourné en l'inscrivant dans un fichier ( je developpe une appli sous glade, et j'ai pas de console pour visualiser les erreurs)
(la partie glade n'est pas interressante et n'intervient pas dans l'erreur)
clempar55
Messages postés59Date d'inscriptionsamedi 1 janvier 2005StatutMembreDernière intervention 4 avril 2007 26 déc. 2006 à 16:31
Je pense avoir trouvé l'erreur. Elle se situe dans la fonction apellée:
struct param load ;
struct param *pLoad ;
pLoad = &load;
En fait ce n'est pas ce code qui est défaillant, c'est plutôt le fait que ta fonction retourne
pLoad.
En effet,
load
est un objet créé statiquement, ce qui signifie qu'il sera détruit à la sortie de la fonction dans laquelle il a été créé, ici
setting(). Donc ensuite, dans la fonction apelante, pInitParam pointera vers une zone memoire qui a été libérée: il va donc y avoir une erreur.
je suggererai donc de remplacer
struct param load ;
struct param *pLoad ;
pLoad = &load;
par
struct param *pLoad ;
pLoad = malloc(sizeof(struct param));
Ainsi pLoad pointera vers une zone memoire créé dynamiquement, et qui ne sera donc pas detruite è la fin de setting(). Le revers de la médaille est qu'il faudra libérer manuellement la memoire après utilisation de la variable par
free(pLoad );
En esperant avoir résolu ce problème, je vous souhaite de
Bonnes fêtesde fin d'année !
MadMax1024
Messages postés95Date d'inscriptionlundi 25 décembre 2006StatutMembreDernière intervention25 juillet 2008 26 déc. 2006 à 15:46
A premiere vue ton code est assé complexe et je ne sui pas un pro.
Ton erreur est assé courante dans ce type d'application elle vient du fait du manque
d'allocation mémoire.
A un certun moment de ton code un pointeur ne trouve
aucun bloc mémoire pour pointer.
Désolé pour ne pas te dire où se trouve le pointeur(s) défaillant(s).
MadMax1024
Messages postés95Date d'inscriptionlundi 25 décembre 2006StatutMembreDernière intervention25 juillet 2008 26 déc. 2006 à 16:01
Tu dis que tu programme sous glad je ne connais pas cet outil mais
est ce que tu peus mettre en commentaire certaines lignes de ton programme.
Si oui je te propose de mettre en commantaire les lignes de code qui sont appelées jusqua remonter à la soucres de ton problème.
Mais je pense que tu la déja fait!!
MadMax1024
Messages postés95Date d'inscriptionlundi 25 décembre 2006StatutMembreDernière intervention25 juillet 2008 26 déc. 2006 à 16:22
Normalemnt la fonction te renoi l'adresse du pointeur.
je ne pense pas que sa soit un probleme d'héritage
car chaque pointeurs à une adresse mémoire unique si ils sont allouées correctement.
Su tu teste seulement la valeur renvoyé par pInitParam->csv sans faire de fprintfque ce passe t-il ?
Dans tt les cas ton probleme est donc dans la fonction setting()
Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 mars 2007 26 déc. 2006 à 16:53
Ouaou je m'emerveille devant ma betise :D
Merci à vous pour vos réponses.
Petite question subsidiaire
mon pLoad = malloc( sizeof( struct param)); est effectué dans une fonction et appellé par d'autre. Je ne dois pas détuire pLoad avant tout ce qui doit être fait est fait ^^.
si dans ma fonction appellante je déclare
struct param * pointeur;
pointeur = setting( );
et que je fais free(pointeur)
est ce que ca libère le pLoad ( ce qu'il pointe en mémoire) ?