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
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
A voir également:
- Passage en paramètre d'un gchar* [C]
- Netflix paramètre compte - Guide
- Passage qwerty azerty - Guide
- Remettre parametre usine pc - Guide
- Parametre windows - Guide
- Changer parametre dns - Guide
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
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);
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
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 ?
Peut tu copier directement ton code a partir de l'appel de ta fonction principale stp ?
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
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 !
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 !
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
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)
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)
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
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:
Dans mon header, j'ai le propotype de cette fonction, qui n'est en fait qu'une écoute. Ce qui donne donc forcément :
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:
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 ;-)
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 ;-)
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
20 juin 2011 à 11:46
Répond a ma réponse plus bas stp :p
Je commence a comprendre ton prog je crois ;)
Je commence a comprendre ton prog je crois ;)
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
20 juin 2011 à 11:21
bah en fait après lecture, je peux te trier tout ça comme ça (ce qui sera lisible):
(Le traitementBoutonGen étant mon prog principal ).
Après pour la fonction traitementFichierDesConnections, dis moi si tu veux son corps aussi.
#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.
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
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 ?
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 ?
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
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:
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::
Par contre, si dans le programme "princiaple", je fais pas tous ces trucs:
La le programme ne bug pas.
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.
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
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+
Bon là je dois y aller, mais je reviens dans une heure et je te tiens au courant.
A+
20 juin 2011 à 13:30
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 ! =)
20 juin 2011 à 14:16