Pointeur structure & héritage

[Résolu]
Signaler
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
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 ;
};

struct param *setting()
{
    FILE * access ;
    FILE * test;
   
    char * settings = "C:\\Documents and Settings\\Kurpeus\\Bureau\\Visual Projects\\settings.ini";

    char * data = malloc(sizeof(data)*255);
    char * temp = malloc(sizeof(temp)*255);
    char * csv = malloc(sizeof(csv)*255);
    char * dir = malloc(sizeof(dir)*255);
    char * com = malloc(sizeof(com)*8);
    char * baudrate = malloc(sizeof(baudrate)*16);

    char*  end ;

    long n;

    struct param load ;
    struct param *pLoad ;
    pLoad = &load;

    // Lecture des paramètres de configuration :
                   if((access fopen( settings, "r")) NULL)
    {
        // Le fichier n'existe pas
        pLoad->success = 0;
        return pLoad;
        }
    else
    {  
        // Fichier de conf trouvé
        pLoad->success = 1;

        // Lecture du fichier de configuration
        GetPrivateProfileString("files","temp", "", temp, 255, settings );
        GetPrivateProfileString("files","csv", "", csv, 255, settings );
        GetPrivateProfileString("files","dir", "", dir, 255, settings );
        GetPrivateProfileString("files","com", "", com, 8, settings );
        GetPrivateProfileString("files","baudrate", "", baudrate, 16, settings );

        // On initialise les variables pour les passer à la fênetre paramètre
        pLoad->temp = temp;
        pLoad->csv = csv;
        pLoad->dir = dir;

        // Conversion d'une chaine en un entier
        n = strtol(baudrate, &end, 10);
        pLoad->baudrate = n;

        n = strtol(com, &end, 10);
        pLoad->com = n;

        fclose(access);
        return pLoad;
        }
}

J'ai testé les valeurs pLoad->temp ect, elles sont bien initialisées. Maintenant voici la fonction appellante :

struct param
{
    int success ;
    char * temp;
    char * csv;
    char * dir;
    int com;
    int baudrate ;
};

int on_properties_activate(GtkMenuItem * menuitem,
                            gpointer user_data)
{
    GtkWidget *paramWindow;
    GtkWidget *entry1 ;
    GtkWidget *entry2 ;
    GtkWidget *entry3 ;

    FILE * test;

    struct param *pInitParam;

    paramWindow = create_paramWindow();

    pInitParam = setting();

    entry1 = lookup_widget(paramWindow, "entry1");

        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)

Merci d'avance

13 réponses

Messages postés
59
Date d'inscription
samedi 1 janvier 2005
Statut
Membre
Dernière intervention
4 avril 2007

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 !
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

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).
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

Joyeuse fête à toi aussi
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

A priori mon problème se trouve sur le pointeur suivant : pInitParam

test = fopen("c:\\test.txt", "w");
        fprintf(test, "%s", pInitParam->csv);
        fclose(test);

dans la fonction appellé :

je crée ma structure et un pointeur que renvoie la fonction :

    struct param load ;
    struct param *pLoad ;
    pLoad = &load;

je l'initialise

(...)

et je retourne le pointeur :
return pLoad;

dans la fonction appellé :
je crée un pointeur vers une structure 

    struct param *pInitParam;

J'attribue le pointeur retourné à mon pointeur courant
    pInitParam = setting();

et je teste sa valeur :
pInitParam->csv

voila, je fais mal un truc a ce niveau mais je vois pas trop. Peut etre que c'est plus clair comme ca
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

hmm la deuxième fonction est bien sur la fonction appellante, désolé pour l'erreur
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

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!!
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

Oui effectivement. Si je commente l'accès au contenu du pointeur fprintf(test, "%s", pInitParam->csv), le  programme ne plante pas.

Je me pose la question de comment donner à un pointeur l'adresse mémoire  d'un pointeur renvoyé par une fonction

par exemple pour affecter à un pointeur l'adresse d'un autre on fait :

pointeur1 = &pointeur2

maitenant quand on passe par une fonction
pointeur1 = &( fonction() );  // avec return pointeur2

ca ca ne marche pas ...

Donc la question est : est ce que la fonction donne bien l'adresse du pointeur2 à pointeur1 quand on fait
pointeur1 = fonction() ;

Est ce alors un problème d'héritage ?

Autrement, Glade n'est qu'on outil pour généré du code gtk pour faire une interface graphique.
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

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()
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

Désolé pour les fautes d'orthographes j'essaye de te répondre le plus rapidement possible
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

Je vois que tu à de l'expérience mon cher clempar.
Effectivement je n'avais pa vus cet alocation statique
Le principal est de trouver les soltutions
Messages postés
95
Date d'inscription
lundi 25 décembre 2006
Statut
Membre
Dernière intervention
25 juillet 2008

Bonne fête à tous
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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) ?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Oui