Passage en paramètre d'un gchar* [C]

Résolu/Fermé
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 - 20 juin 2011 à 11:00
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 - 20 juin 2011 à 14:16
Bonjour,
J'aimerais passer une variable de type gchar* (pareil que le char*) en paramètre à un sous programme, mon soucis, c'est que ça plante (à l'exécution).
En fait, je veux ouvrir ce fichier à partir du nom d'un autre fichier ayant le même nom mais pas la même extension. (Je sais pas si c'est très clair, bref vous comprendrez avec le code:
Je veux donc récupérer la variable cheminFichierPro:
le prototype du sous-prgramme:
int NouvelleEqui(char * cheminFichierFil, typeTableauConnection tableauConnections, char * cheminFichierPro, typeTableauDefinitionConnecteur tableauDefinitionConnecteur);


dans ma fonction principale:
        gchar* cheminFichierPro;
        int size,iExtension;
        cheminFichierPro = cheminFichierFil;
        iExtension=size=strlen(cheminFichierPro)-1;
        while(iExtension>size-3)
        {
            cheminFichierPro[iExtension]='\0';
            iExtension--;
        }

        cheminFichierPro = strcat(cheminFichierPro, "PRF");
        printf("%s", cheminFichierPro);


puis l'appel de ma fonction:
nb_connections = NouvelleEqui(cheminFichierFil, tableauConnections, cheminFichierPro, tableauDefinitionConnecteur);


et enfin, le code du sous-programme :
int NouvelleEqui(char * cheminFichierFil, typeTableauConnection tableauConnections, char * cheminFichierPro, typeTableauDefinitionConnecteur tableauDefinitionConnecteur)
{
    int nbnbnb = traitementFichierDesConnections(cheminFichierFil, tableauConnections);
    printf("%s", cheminFichierPro);

    //traitementFichierDefinitionConnecteurs (cheminFichierPro, tableauDefinitionConnecteur);

    return nbnbnb;
}


Le programme me retourne bien le 1er printf de ce chemin, mais le programme ne répond plus après celui-ci (donc j'imagine, lors du passage de mon paramètre.) Sachant que ma fonction traitementFichierDesConnecteur fonctionne très bien.
Qu'elqu'un saurait-il résoudre mon problème s'ill vous plait.
En vous remerciant !
sheeps.
A voir également:

5 réponses

kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
20 juin 2011 à 12:04
cheminFichierPro = cheminFichierFil

Ici deja, attention:
Situons nous dans la memoire:
le pointeur cheminFichierfil pointe sur la case memoire 0001 par exemple.
Ensuite te crée un pointeur cheminFichierpro qui pointe pas encore.
Lorsque tu fai "cheminFichierPro = cheminFichierFil" tu dit a ton programme: Le pointeur cheminFichierpro va pointer sur la case memoire 0001 (case sur laquelle pointe cheminFichierfil).
Autrement dit: Lorsque tu modifie cheminfichierpro, tu modifie aussi cheminfichierfil.
Si tu ne souhaite pas modifier les 2 remplace:
cheminFichierPro = cheminFichierFil;
par
cheminFichierPro = strdup(cheminFichierFil);
1
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 13:30
Ah oui, bien vu.
En effet, ça modifiait mon cheminFichierFil, ce qui avait pour conséquence une boucle infinie dans le traitement de celui-ci, d'où le plantage, vu que je ne lisais pas le bon fichier.

Merci beaucoup et bonne continuation ! =)
0
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
20 juin 2011 à 14:16
De rien ;) Bonne chance pour ton programme !
0
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
Modifié par kalfy le 20/06/2011 à 11:11
Quel est le type de cheminfichierfil ?
Peut tu copier directement ton code a partir de l'appel de ta fonction principale stp ?
0
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 11:18
Salut et merci.
Euh mon code fais dans les 2000 lignes sur ce fichier là, tu penses que ça peut provenir d'ailleur? (si oui il vaudrait mieux que tu me cite des endroits précis à te copier, dans un soucis de lecture du post ^^)
Le type de cheminFichierFil est un gchar* aussi, sauf que lui est en variable globale (étant donné que je le récupère à partir de l'interface graphique)
(Au passage, je sais pas pourquoi j'ai mis des char* dans le prototype du sous prog, mais bon ça marche quand même en thérorie.)

PS : Sinon je pourrais essayer de mettre ce chemin de fichier en global aussi, mais c'est un peu la solution bourrine. J'essaye quand même pour voir si ça marche.

Merci de t'interresser à mon problème en tout cas !
0
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
20 juin 2011 à 11:28
Honettement j'ai pas travailler avec les globals, j'ai plutôt tendance a faire un structure principale et a filer son adresse au fonctions.
J'aimerai le la ligne ou tu appel la fonction que tu dis "principal" dans ton post, la fonction "principale" complete du type:
char *tafonction(type1 nom, type2 etc...)
{
contenu
}
Dans cette fonction normallement tu appel la fonction secondaire il me semble ? donc j'aimerai la voir aussi stp (appel + fonction)
0
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 11:40
Alors je vais tenter l'explication (attention c'est pas mon fort ^^)
Donc ce que j'appelle ma fonction principale est "TraitementBoutonGen" qui est le traitement d'un bouton GTK de mon interface graphique. Donc, dans mon main (la vue), j'ai mon bouton en écoute:
g_signal_connect(G_OBJECT(BoutonGen), "clicked", G_CALLBACK(TraitementBoutonGen), NULL);


Dans mon header, j'ai le propotype de cette fonction, qui n'est en fait qu'une écoute. Ce qui donne donc forcément :
void TraitementBoutonGen(GtkWidget* pWidget);


Les données que je récupère de ma vue à mon modèle sont tous en extern, à l'image de cheminFichierFil, comme ceci dans mon header:
extern gchar* cheminFichierFil;


Après, dans ma fonction TraitementBoutonGen, je peux récupérer donc ces données (vu qu'elles sont en extern)

Le cas de cheminFichierPro est différent car, sa valeur n'est pas récupéré dans la vue, mais déterminée à partir de cheminFichierFil. Il est donc déclaré dans TraitementBoutonGen, modifié à partir de cheminFichierFil et passé en paramètre à ma fonction nouvelleEqui, et là intervient mon problème.

Voilà, je pense finalement que mon explication est pas mal ;-)
0
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
20 juin 2011 à 11:46
Répond a ma réponse plus bas stp :p
Je commence a comprendre ton prog je crois ;)
0
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 11:21
bah en fait après lecture, je peux te trier tout ça comme ça (ce qui sera lisible):

#include "generateur.h"
//chemin du fichier des connections
    gchar* cheminFichierFil;

Isolement isolement;
Continuite continuite;
    //test du nombre de lignes
    int NB_LIGNES;

int traitementFichierDesConnections(char * cheminFichierFil, typeTableauConnection tableauConnections);

int NouvelleEqui(char * cheminFichierFil, typeTableauConnection tableauConnections, char * cheminFichierPro, typeTableauDefinitionConnecteur tableauDefinitionConnecteur);

void TraitementBoutonGen(GtkWidget* pWidget)
{

    cheminFichierFil = g_locale_to_utf8(gtk_entry_get_text(GTK_ENTRY(EntryFil)),-1, NULL, NULL, NULL);


//***********************************************************************************************************
//commentaire
//***********************************************************************************************************
        int nb_connections;
        int *pnb_exceptions = (int *)malloc(sizeof(int));
        *pnb_exceptions = 0;
        typeTabManuel tabManuel;
        typeTableauPConnection tableauPConnection;
        typeTableauConnection tableauConnections;
        typeTableauDefinitionConnecteur tableauDefinitionConnecteur;

        //nomfichier pro mais la prf vu que provisoire
        //chemin du fichier des définitions de connecteurs
        gchar* cheminFichierPro;
        int size,iExtension;
        cheminFichierPro = cheminFichierFil;
        iExtension=size=strlen(cheminFichierPro)-1;
        while(iExtension>size-3)
        {
            cheminFichierPro[iExtension]='\0';
            iExtension--;
        }

        cheminFichierPro = strcat(cheminFichierPro, "PRF");
        printf("%s", cheminFichierPro);

        //*******************************************************************************

        nb_connections = NouvelleEqui(cheminFichierFil, tableauConnections, cheminFichierPro, tableauDefinitionConnecteur);


(Le traitementBoutonGen étant mon prog principal ).

Après pour la fonction traitementFichierDesConnections, dis moi si tu veux son corps aussi.
0
kalfy Messages postés 118 Date d'inscription samedi 18 juin 2011 Statut Membre Dernière intervention 22 août 2011 3
Modifié par kalfy le 20/06/2011 à 11:44
Si je comprend bien le but de ton programme est de recuperer a partir d'un
char *totoextension = "toto.txt" un char *totowithoutext = "toto." c'est sa ? En partant du principe que tu aura uniquement des extensions d'une taille de 3 char, donc si tu a un X.docx sa marche plus.
C'est apres la recuperation de totowithouttext que sa bug ou tu n'arrive pas a l'avoir ?
0
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 11:51
Oui, c'est ça (pour la première partie). En fait mon programme a besoin d'un fichier en entrée (ce sera toujours la même extension de 3 caractères qui sera "FIL"), mais aussi d'un autre fichier qui portera le même nom de fichier mais aura l'extension .PRF.

Donc je récupère son chemin, lui retire ses 3 caractères finaux et écris "PRF" à la fin.

Là ou ça bug, est en fait dans le passage de paramètre étant donné que:
        gchar* cheminFichierPro;
        int size,iExtension;
        cheminFichierPro = cheminFichierFil;
        iExtension=size=strlen(cheminFichierPro)-1;
        while(iExtension>size-3)
        {
            cheminFichierPro[iExtension]='\0';
            iExtension--;
        }

        cheminFichierPro = strcat(cheminFichierPro, "PRF");
        printf("%s", cheminFichierPro);


Le printf me retourne bien ce que je veux. Par contre le programme freeze après. Ce qui veux dire que je n'ai pas le 2eme printf dans mon sous programme::
int NouvelleEqui(char * cheminFichierFil, typeTableauConnection tableauConnections, char * cheminFichierPro, typeTableauDefinitionConnecteur tableauDefinitionConnecteur)
{
    int nbnbnb = traitementFichierDesConnections(cheminFichierFil, tableauConnections);
    printf("%s", cheminFichierPro);

    //traitementFichierDefinitionConnecteurs (cheminFichierPro, tableauDefinitionConnecteur);

    return nbnbnb;
}


Par contre, si dans le programme "princiaple", je fais pas tous ces trucs:
   gchar* cheminFichierPro;
        int size,iExtension;
        /*cheminFichierPro = cheminFichierFil;
        iExtension=size=strlen(cheminFichierPro)-1;
        while(iExtension>size-3)
        {
            cheminFichierPro[iExtension]='\0';
            iExtension--;
        }

        cheminFichierPro = strcat(cheminFichierPro, "PRF");*/
        cheminFichierPro = "chemin banal de randonnee par exemple";
        printf("%s", cheminFichierPro);


La le programme ne bug pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cap'tain sheeps Messages postés 447 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 1 octobre 2014 10
20 juin 2011 à 12:03
Ah, il y a du nouveau: On dirait que ça vient du strcat : quand je met seulement cette ligne en commentaire, ça marche.

Bon là je dois y aller, mais je reviens dans une heure et je te tiens au courant.
A+
0