SOS déblocker pgm C (en gtk+)!!
Fermé
mumberea
-
Modifié par mumberea le 21/12/2011 à 09:11
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 - 22 déc. 2011 à 09:38
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 - 22 déc. 2011 à 09:38
A voir également:
- SOS déblocker pgm C (en gtk+)!!
- Minidwep-gtk ✓ - Forum Logiciels
- GTK Selfimage - Télécharger - Divers Utilitaires
- Not loading module "atk-bridge": the functionality is provided by gtk natively. please try to not load it. ✓ - Forum Autres distributions Linux
7 réponses
matthoffman
Messages postés
405
Date d'inscription
lundi 24 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2013
47
Modifié par matthoffman le 21/12/2011 à 09:30
Modifié par matthoffman le 21/12/2011 à 09:30
MainWindow *fenetre; fenetre->pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
Il n'y a pas un truc qui te choque ici ?
Un indice:
MainWindow *fenetre = NULL; // Toujours initialiser ses pointeurs ;) fenetre->pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
Alors tu vois toujours pas ? :)
as-tu au moins pris le temps de compiler et d'exécuter ce code?
je crois bien que non.
en initialisant ce pointeur : MainWindows *fenêtre=NULL, le compilateur m'envoi un message d'erreur.
Je sais bien qu'il faut toujours initialiser une variable avant de l'utiliser, mais là ca me donnais un message d'erreur. J'ai donc laisser pcq tout va bien sans initialisation. La preuve en est que en enlevant les instructions à problème (celle que j'ai écris en gras) l'interface apparaît sans message d'erreur et se ferme aussi sans problèmes.
ce qui confirme bien que le problème réside au niveau des instructions écrites en gras
je crois bien que non.
en initialisant ce pointeur : MainWindows *fenêtre=NULL, le compilateur m'envoi un message d'erreur.
Je sais bien qu'il faut toujours initialiser une variable avant de l'utiliser, mais là ca me donnais un message d'erreur. J'ai donc laisser pcq tout va bien sans initialisation. La preuve en est que en enlevant les instructions à problème (celle que j'ai écris en gras) l'interface apparaît sans message d'erreur et se ferme aussi sans problèmes.
ce qui confirme bien que le problème réside au niveau des instructions écrites en gras
matthoffman
Messages postés
405
Date d'inscription
lundi 24 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2013
47
21 déc. 2011 à 11:10
21 déc. 2011 à 11:10
Incroyable !! Je suis la pour aider la personne et on m'envoie valser:
Ou est ce que je t'ai dit que je t'avais donne la solution ? Je t'ai donne un indice pour que tu trouves la solution par toi meme.
Donc je vais te repondre sur le meme ton:
"as-tu au moins pris le temps de lire tes cours et d'apprendre le C ?"
Je crois bien que non
Si tu avais appris a programmer correctement en C et non pas comme un porc, tu saurais qu'on ne dereference jamais un pointeur NULL.
Maintenant la encore je ne t'ai pas ecrit ta ligne de code qui corrigera parce que ta reponse ne me plait pas du tout, donc j'arrete de suivre ce topic.
Bon vent.
Ou est ce que je t'ai dit que je t'avais donne la solution ? Je t'ai donne un indice pour que tu trouves la solution par toi meme.
Donc je vais te repondre sur le meme ton:
"as-tu au moins pris le temps de lire tes cours et d'apprendre le C ?"
Je crois bien que non
Si tu avais appris a programmer correctement en C et non pas comme un porc, tu saurais qu'on ne dereference jamais un pointeur NULL.
Maintenant la encore je ne t'ai pas ecrit ta ligne de code qui corrigera parce que ta reponse ne me plait pas du tout, donc j'arrete de suivre ce topic.
Bon vent.
milles excuse matthofffman pour tous ce que j'ai écris. Mon intension n'était pas telle.
Je dois avouer que je viens d'apprendre à peine le C, ce qui fais que j'accuse beaucoup de lacunes dans la notion de pointeur.
Mercis pour la lumière que tu m'a apporté.
C'est gentil!
Je dois avouer que je viens d'apprendre à peine le C, ce qui fais que j'accuse beaucoup de lacunes dans la notion de pointeur.
Mercis pour la lumière que tu m'a apporté.
C'est gentil!
matthoffman
Messages postés
405
Date d'inscription
lundi 24 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2013
47
Modifié par matthoffman le 21/12/2011 à 15:35
Modifié par matthoffman le 21/12/2011 à 15:35
Je ne sais pas si tu as resolu ton probleme du coup, le probleme est que tu utilises un pointeur qui n'est tu n'as pas alloue en memoire.
Lorsque tu declares un pointeur sans l'initialiser a NULL, ton pointeur va pointer n'importe ou dans ta memoire, donc ton pointeur ne sera pas vide mais il contiendra des trucs present a une adresse memoire au pif.
D'ou l'interet de toujours initialiser ses pointeurs a NULL, pour eviter ce genre de problemes. Au moins tu seras sur d'avoir un segfault si tu dereferences un pointeur NULL ;). C'est donc ca l'indice que je te donnais.
Pour en revenir a ton probleme, ce que tu fais c'est donc ceci:
- Tu declares un pointeur qui pointe au pif dans ta memoire, tu y fous des donnees ne sachant meme pas comment ces donnees sont stockees vu que tu ne sais pas vraiment quel espace tu utilises avec ton pointeur non initalise.
- Ensuite tu utilises ces donnees qui ont du se stocker n'importe comment du coup.
Ce qui mene a tes lignes en gras, puisque concretement c'est la que tu fais usage de ton pointeur. Donc oui tu ne te gourais pas le programme plante sur tes lignes en gras, mais le probleme est anterieur !
Donc enfin la reponse:
Le malloc() va te permettre d'allouer une case en memoire de la bonne taille et bien formatee pour accueillir une variable du type MainWindow
Le free() est tres important !! Il permet de liberer la memoire, sinon la memoire que tu auras allouee pour ton pointeur ne seras plus accessible jusqu'au reboot de ta machine ... Ce qui est tres porc, surtout si tu manipules 36000 pointeurs, en gros en 2 secondes l'ordi fume parce que t'as plus de RAM qui peut etre accessible ^^.
Le fenetre = NULL; est juste une securite pour que tu t'apercoives de ton erreur si jamais tu veux le derefencer par la suite, et retomber dans ton erreur ou tu comprends pas ce qu'il se passe.
Je te conseille de lire ca si tu veux en savoir plus (notamment la partie initialisation d'un pointeur qui te paraitra peut etre plus claire que mon explication):
https://www.commentcamarche.net/contents/116-les-pointeurs-en-langage-c
Voila, je terminerais sur le fait que j'ai par principe de faire comprendre les choses aux gens que j'aide, je donne pas juste 2 lignes de code, "soit heureux avec ca, ca marche". Et puis 2 semaines plus tard tu reposteras ici ne comprenant pas ce qui se passe, alors que ton probleme etait similaire.
Voila pourquoi je voulais que tu t'apercoives toi meme de ton erreur.
PS: Eh oui j'ai quand meme repondu, je ne suis pas un jeune ptit con aigri ^^
Lorsque tu declares un pointeur sans l'initialiser a NULL, ton pointeur va pointer n'importe ou dans ta memoire, donc ton pointeur ne sera pas vide mais il contiendra des trucs present a une adresse memoire au pif.
D'ou l'interet de toujours initialiser ses pointeurs a NULL, pour eviter ce genre de problemes. Au moins tu seras sur d'avoir un segfault si tu dereferences un pointeur NULL ;). C'est donc ca l'indice que je te donnais.
Pour en revenir a ton probleme, ce que tu fais c'est donc ceci:
- Tu declares un pointeur qui pointe au pif dans ta memoire, tu y fous des donnees ne sachant meme pas comment ces donnees sont stockees vu que tu ne sais pas vraiment quel espace tu utilises avec ton pointeur non initalise.
- Ensuite tu utilises ces donnees qui ont du se stocker n'importe comment du coup.
Ce qui mene a tes lignes en gras, puisque concretement c'est la que tu fais usage de ton pointeur. Donc oui tu ne te gourais pas le programme plante sur tes lignes en gras, mais le probleme est anterieur !
Donc enfin la reponse:
MainWindow *fenetre = NULL; // Toujours initialiser ses pointeurs ;) fenetre = malloc(sizeof (struct MainWindow)); fenetre->pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); ... free(fenetre); fenetre = NULL; return EXIT_SUCCESS;
Le malloc() va te permettre d'allouer une case en memoire de la bonne taille et bien formatee pour accueillir une variable du type MainWindow
Le free() est tres important !! Il permet de liberer la memoire, sinon la memoire que tu auras allouee pour ton pointeur ne seras plus accessible jusqu'au reboot de ta machine ... Ce qui est tres porc, surtout si tu manipules 36000 pointeurs, en gros en 2 secondes l'ordi fume parce que t'as plus de RAM qui peut etre accessible ^^.
Le fenetre = NULL; est juste une securite pour que tu t'apercoives de ton erreur si jamais tu veux le derefencer par la suite, et retomber dans ton erreur ou tu comprends pas ce qu'il se passe.
Je te conseille de lire ca si tu veux en savoir plus (notamment la partie initialisation d'un pointeur qui te paraitra peut etre plus claire que mon explication):
https://www.commentcamarche.net/contents/116-les-pointeurs-en-langage-c
Voila, je terminerais sur le fait que j'ai par principe de faire comprendre les choses aux gens que j'aide, je donne pas juste 2 lignes de code, "soit heureux avec ca, ca marche". Et puis 2 semaines plus tard tu reposteras ici ne comprenant pas ce qui se passe, alors que ton probleme etait similaire.
Voila pourquoi je voulais que tu t'apercoives toi meme de ton erreur.
PS: Eh oui j'ai quand meme repondu, je ne suis pas un jeune ptit con aigri ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mercis d'avoir éclairer ma lanterne en ce qui concerne l'allocation dynamique. Je connais cette théorie, mais je me suis toujours demander dans quelle cas il fallait allouer dynamiquement une adresse à une variable.
en revanche, il y a un autre problème, le prototype de la fonction malloc() est :
void* malloc(sizeof(typeVariable));
Le type de sortie étant un "pointeur sur n'importe quel type variable (notamment le type de ma variable).
Seulement voilà, il y a un message d'erreur disant exactement:
error: invalid conversion from 'void*' to 'MainWindow*'
je continue d'y réfléchir, si tu as un peu de temps, j'apprécierai que tu y jette un coup d'oeil!
en revanche, il y a un autre problème, le prototype de la fonction malloc() est :
void* malloc(sizeof(typeVariable));
Le type de sortie étant un "pointeur sur n'importe quel type variable (notamment le type de ma variable).
Seulement voilà, il y a un message d'erreur disant exactement:
error: invalid conversion from 'void*' to 'MainWindow*'
je continue d'y réfléchir, si tu as un peu de temps, j'apprécierai que tu y jette un coup d'oeil!
matthoffman
Messages postés
405
Date d'inscription
lundi 24 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2013
47
21 déc. 2011 à 17:00
21 déc. 2011 à 17:00
Ok tu peux me dire quel compilateur (et sa version tu utilises ?), et aussi quelle est l'extension de ton fichier ?
Dans tous les cas tu peux faire un dynamic cast mais en general faut eviter donc j'attends ta reponse et si le pb ne vient pas du compilateur alors tu auras toujours une solution de secours au moins, ecrit ca:
Dans tous les cas tu peux faire un dynamic cast mais en general faut eviter donc j'attends ta reponse et si le pb ne vient pas du compilateur alors tu auras toujours une solution de secours au moins, ecrit ca:
fenetre = (MainWindow *) malloc(sizeof (struct MainWindow));
Bingo!!!
Il compile sans erreur et tourne à merveille!! Mercis pour tous le temps passé sur mon petit problème...Au faite, c'est quoi ce (MainWindow *) ? dans
fenetre = (MainWindow *) malloc(sizeof (struct MainWindow));
Comprend mon ignorance en C, je ne suis qu'un novice.
Il compile sans erreur et tourne à merveille!! Mercis pour tous le temps passé sur mon petit problème...Au faite, c'est quoi ce (MainWindow *) ? dans
fenetre = (MainWindow *) malloc(sizeof (struct MainWindow));
Comprend mon ignorance en C, je ne suis qu'un novice.
matthoffman
Messages postés
405
Date d'inscription
lundi 24 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2013
47
22 déc. 2011 à 09:38
22 déc. 2011 à 09:38
Comme je l'ai dit dans mon post precedant c'est un dynamic cast (cast explicite), en gros tu indiques au compilateur que de toute facon le type que tu vas donner sera de type MainWindow*.
Mais comme je te l'ai dit precedemment, normalement il ne faut pas faire ca ! Encore moins pour un malloc(). Si le compilateur te sort une erreur c'est surement que tu utilises un compilateur C++.
Je te conseille donc de plutot utiliser un compilateur C.
Si tu preferes rester avec ton compilateur C++ alors tu peux laisser le dynamic cast, mais bon c'est moche !
Mais comme je te l'ai dit precedemment, normalement il ne faut pas faire ca ! Encore moins pour un malloc(). Si le compilateur te sort une erreur c'est surement que tu utilises un compilateur C++.
Je te conseille donc de plutot utiliser un compilateur C.
Si tu preferes rester avec ton compilateur C++ alors tu peux laisser le dynamic cast, mais bon c'est moche !