Win Api : L'utilisation du menu fait planter le programme - C - Programmation
Marsh Posté le 13-09-2006 à 20:21:58
acryline a écrit : ALors pour les plus courageux j'ai mis mon code (programme pas terminé) ici |
Ne compile pas. 111 warnings, c'est pas sérieux...
|
J'ai ajouté ça :
|
et ça compile. Trop cool le petit serpent !
Marsh Posté le 13-09-2006 à 20:31:22
ReplyMarsh Posté le 13-09-2006 à 20:35:13
Oui
#define LBS_COMBOBOX 0x8000
je l'avais aussi ajouté... mais ça bogue toujours
Je vais voir les warning avec Visual déjà... T'as pas tort
Marsh Posté le 13-09-2006 à 20:44:14
acryline a écrit : Mais avec code::Blocks je n'ai pas de warning . |
Essaye avec -Wall -Wextra -O2
Marsh Posté le 14-09-2006 à 12:10:40
Emmanuel Delahaye a écrit : Essaye avec -Wall -Wextra -O2 |
Je viens d'essayer ces options dans code::blocks et j'ai toujours :
Citation : |
Dans Visual en revanche c'est comme tu dis... plus de 130 warnings !
Edité :
Je viens d'enlever les warnings hormis les warnings qui n'acceptent pas strncpy à la place de strncpy_s et strncat à la place de strncat_s.
Le bogue reste et j'obtiens le message suivant dans code::Blocks
Citation : |
Adresse du code avec les warnings en moins : ici
Marsh Posté le 14-09-2006 à 15:57:57
ReplyMarsh Posté le 14-09-2006 à 16:26:49
anordem a écrit : Salut! |
Voilà j'ai inclu l'exécutable dans le fichier rar mis en lien dans mon message précédent.
Marsh Posté le 14-09-2006 à 18:45:09
Merci.
Bon, après quelques rapides tests, je pense que le problème se trouve au niveau de cette fonction:
Code :
|
Plus précisèment, le paramètre test provoque une violation d'accès qui vient, je pense, d'un problème de manipulation du pointeur.
C'est la seule erreur que j'ai eu, et en corrigeant les droits en écriture, le programme fonctionne.
Ceci dit, il y a quand même quelques problèmes d'affichage et de rafraichissement.
Marsh Posté le 14-09-2006 à 18:55:22
anordem a écrit : Merci.
|
Merci c'est très sympa d'avoir cherché le problème, j'essaie de corriger demain et je donne des nouvelles, là j'arrête. En fait je n'avais pas corrigé tous les avertissements.Ce bogue m'a obligée à le faire et ce n'est pas plus mal.
Marsh Posté le 15-09-2006 à 07:24:23
Voilà maintenant j'ai nettoyé tous les warnings (sauf ceux qui me signalent une variable inutilisée dans quelques fonctions).
J'ai également remplacé le pointeur sur la variable "test" par la variable elle-même qui est, cette fois, retournée. Mais le problème reste.
Voici le code tout propre ici avec l'exécutable correspondant.
La personne qui m'a conseillée de venir exposer mon problème ici m'a parlé de la pile mais ne savait pas trop comment faire. Qu'en pensez-vous ? Que dois-je faire ?
Merci
Marsh Posté le 15-09-2006 à 08:23:44
acryline a écrit : Voici le code tout propre ici avec l'exécutable correspondant. |
J'appelle pas ça propre. Je te conseille de travailler sous Code::Blocks avec les options -Wall -Wextra -O2. (je l'ai déjà dit ou je deviens gateux ?)
Je mets en gras les bugs graves à corriger proprement et en connaissance de cause.
Citation : Project : Acryline |
Marsh Posté le 15-09-2006 à 08:50:25
J'ai mis les option -Wall -Wextra (pour mon code::Blocks c'est -W) et -02 et la liste des warnings qui restent est :
Code :
|
Pour ce qui est de
Code :
|
J'ai ajouté
Code :
|
Marsh Posté le 15-09-2006 à 10:02:01
acryline a écrit : J'ai mis les option -Wall -Wextra (pour mon code::Blocks c'est -W) et -02 et la liste des warnings qui restent est : |
Attention, c'est pas 02, mais O2 ('O' comme Optimizer).
Marsh Posté le 15-09-2006 à 10:11:26
Emmanuel Delahaye a écrit : Attention, c'est pas 02, mais O2 ('O' comme Optimizer). |
J'ai fait comme ça :
Marsh Posté le 15-09-2006 à 10:27:17
acryline a écrit : J'ai fait comme ça : |
OK.
Marsh Posté le 15-09-2006 à 13:41:51
Bon, c'est sûr que si tes modifications génèrent de nouvelles erreurs, on n'a pas fini!
Le problème vient de cette fonction :
Code :
|
Tu affectes des valeurs ([i]coorT[i].cx=10) à une structure qui n'existe pas (ECRIRE * coorT=NULL;).
Alors que dans le précédent code, tu l'avais déclaré comme ça :
Code :
|
Donc, fait attention quand tu corriges ton code, prend ton temps.
Marsh Posté le 15-09-2006 à 14:19:38
anordem a écrit : Bon, c'est sûr que si tes modifications génèrent de nouvelles erreurs, on n'a pas fini!
|
Oui c'est pas faux !!
Quand j'ai écrit ça je n'y croyais pas du tout, en fait c'est complètement NULL (et il y en a d'autres je crois??) Bon, pour ma défense, il y a pas mal de temps que je trime pour trouver l'erreur alors à force je disjoncte .
Mais, cette déclaration n'est pas l'origine du mal.
J'ai donc décidé de reprendre tout depuis le début en laissant de côté la décoration. Je fais d'abord la trame du programme et après je mettrai les rideaux, les fleurs, les coussins...
En revanche si quelqu'un trouve le couac ça serait bien !
Merci pour vos réponses Emmanuel Delahaye et Anordem !
Marsh Posté le 15-09-2006 à 15:03:14
acryline a écrit : |
Qu'est ce qui te permet d'affirmer ça?
Cette fonction est appelée à chaque fois que la fenêtre principale doit être redessinée. Donc, entre autre à chaque fois qu'on utilise le menu.
Le code compilé de la ligne donne ça :
|
Si tu ne comprends pas l'asm, je t'explique.
Le code signifie qu'on veut placer la valeur 10 à l'adresse 0. Hors l'adresse 0 est inaccessible au programme. Cela génère donc une violation d'accès.
Ensuite, on veut placer la valeur 65 à l'adresse 4 et là aussi, ça provoque une violation d'accès.
Tout simplement parce que le compilateur a compris que le tableau de structure coort se trouve à l'adresse 0x00000000 suite à ta déclaration
Code :
|
Donc selon la déclaration de ta structure
Code :
|
Pour coort[0] :
cx se trouve à l'adresse 0, cy à l'adresse 4 et texte à l'adresse 8.
Pour coort[1] :
cx se trouve à l'adresse 60, cy à l'adresse 64 et texte à l'adresse 68.
60 = taille de cx + taille de cy + taille de texte + alignement sur 32 bits = 4 + 4 +50 + 2
Il est fort possible qu'il y ait d'autres erreurs, mais comme je ne peux pas continuer l'exécution du programme après celle-ci, j'ai du mal à comprendre comment tu peux être sûr que ton problème est ailleurs...
acryline a écrit : |
Donc de quel couac parles tu ?
Dans tous les cas, je pense que c'est une bonne idée de reprendre ton code dans son ensemble.
Et n'hésite pas à prendre des notes et mettre tes idées au clair avant de coder.
Bon courage!
Marsh Posté le 15-09-2006 à 15:16:07
Ok ! j'envoie le code en lien avec ECRIRE coorT[30] correctement déclaré.
Je l'affirmais parce que je crois l'avoir déjà corrigé ce matin et ça n'avait rien changé. Je vais revoir ça maintenant.
Edité : ça a l'air de marcher ... je reviens.
Edité : Bon ça ne plante plus mais le programme se ferme après chaque commande via le menu... je regarde ce qui se passe et si je n'y arrive pas je remets le code ici (à++)
Marsh Posté le 17-09-2006 à 07:44:49
Vite un petit mot pour terminer le sujet : je ne suis pas arrivée à faire en sorte que le programme ne se ferme après chaque commande. Il faut dire que je n'ai pas beaucoup essayé.
Tous ça a eu au moins le mérite de me faire chercher, j'ai vu des options de compilation, je sais maintenant qu'il faut corriger TOUS les warnings et surtout je me suis mise à remanier mon code de façon bcp plus propre !
Donc au final c'est très positif.
Merci encore à Anordem et à Emmanuel Delahaye. J'aurai sans doute encore besoin de vos connaissances
...et qui sait un jour, à force de me tromper, donc d'apprendre, je pourrais aider un débutant ?
Marsh Posté le 17-09-2006 à 12:16:36
acryline a écrit : |
Mais, tu là déja fait plusieur fois
Marsh Posté le 13-09-2006 à 17:22:27
Bonjour,
dernier recours avant de tout recommencer mon programme depuis le début...
Je vais essayer d'exposer le problème mais ça ne va pas être simple. Tout d'abord j'ai un code assez long,
et ne sachant pas du tout d'où vient le bogue je ne vais pas recopier tout le code ici.
J'ai créer une fenêtre principale avec un menu que je définis dans une fonction.
Le programme s'ouvre correctement, aucune erreur n'est signalée.
Mais lorsque j'utilise certaines commandes du menu le programme plante. Par exemple le passage d'un affichage à un autre en passant pas le menu fait planter le programme et cela ne se produit pas si j'utilise un bouton "fermer" qui utilise pourtant exactement le même processus (même fonction de fermeture).
J'ai déjà tout regardé tout discéqué, je ne trouve pas ... help !
ALors pour les plus courageux j'ai mis mon code (programme pas terminé) ici
Merci !
Message édité par acryline le 13-09-2006 à 17:33:13