Page 1 sur 1
Un problème bizarre
Publié : dim. 08/mai/2005 19:59
par Polo
Salut !
J'ai un problème bizarre, je vais essayer de vous expliquer ça :
J'ai créé une userlib avec une fonction.
ça marche très bien quand je fais :
par contre quand je fais ça, ça plante sans dire pourquoi
Code : Tout sélectionner
code....
Procedure test()
mafonction()
endprocedure
test()
code...
Comme vous pouvez le voir, la seule différence, c'est qu'au début j'appelle la fonction normalement, et dans le deuxième test je l'appelle dans une procédure (et dans cette procédure il n'y a que l'appel de la fonction).
Alors, comme ça revient au même, je me demande quand même pourquoi ça marche pas
Je sais, ça peut être plus éclairant si je postait le code, mais je ne le poste pas

En tout cas ça m'embête bien ce truc...
Publié : dim. 08/mai/2005 21:07
par julien
ça doit venir de ta userlib

Publié : dim. 08/mai/2005 21:18
par Polo
Pas possible
Je m'en doute, que ça vient de ma lib, mais pourquoi ça marche en dehors d'une procédure et pas à l'intérieur

Publié : dim. 08/mai/2005 21:26
par julien
sans code..difficile. comment as tu déclaré tes procedures (.dll toute ?) utilise tu les threads...?

Publié : dim. 08/mai/2005 21:36
par Polo
J'utilise pas de thread, sinon, pour la déclaration des procédures je vois pas trop de quoi tu parles ?
Et ma lib est faite en C, si ça peux aider

Publié : lun. 09/mai/2005 16:43
par Dr. Dri
Peut être un conflit au niveau de la pile (au pif)
mais bon je pourrais pas en dire plus :s
étant donné que l'appel dans une fonction est problèmatique, c'est le seul lien que je vois... mais bon en même temps j'ai pas le niveau pour y voir grand chose ^^
Dri

Publié : lun. 09/mai/2005 17:54
par Anonyme2
Tu as un message d'erreur ou non de windows ?
Ca plante ou non ? etc
Si c'est une erreur de pile windows le signale. Par contre si tout se ferme sauvagement sans message, là ça craint (peut-être une prière mais je doute

).
Ta procédure utilise des variables locales, globales, une valeur de retour, des paramètres ?
L'appel d'une procedure en PureBasic va sauvegarder les registres ebp, esp, edi, esi, ecx et ebx puis les restaure à la fin. PB initialise toutes les variables locales à 0 dans la procedure et "alloue" de la place sur la pile pour les variables locales et également pour les paramètres car PB réécrit les paramètres sur la pile.
Elle fait quoi ta procedure (je ne pige pas beaucoup le C)
Publié : lun. 09/mai/2005 18:02
par Polo
ça plante, et j'ai le message qui demande d'envoyer un rapport d'erreur...
Ta procédure utilise des variables locales, globales, une valeur de retour, des paramètres ?
pour les trucs locals/globals je sais pas trop... mais il y a une valeur de retour et des paramètres.
L'appel d'une procedure en PureBasic va sauvegarder les registres ebp, esp, edi, esi, ecx et ebx puis les restaure à la fin. PB initialise toutes les variables locales à 0 dans la procedure et "alloue" de la place sur la pile pour les variables locales et également pour les paramètres car PB réécrit les paramètres sur la pile.
Euh, si tu le dis

Je comprend pas grand chose, là, l'asm et moi...
Elle fait quoi ta procedure (je ne pige pas beaucoup le C)
Beaucoup de trucs

Non, sérieux, je peux pas vraiment résumer ce qu'elle fait

Publié : lun. 09/mai/2005 18:26
par Anonyme2
mets au moins sur le forum le code complet de l'appel de t commande (change de nom si tu veux pas que l'on sache ce que tu fais) et la procedure avec l'appel de la commande de ta librairie avec tous les paramètres et comment tu retournes ton résultat dans les 2 cas
Publié : lun. 09/mai/2005 18:33
par Polo
Euh d'ailleurs, il y a un fichier exp créé dans le répertoire Compilers lors de la compilation, qui ne se supprime pas automatiquement après

C'est quoi ça encore ?? Pourtant c'est pas une dll que je fais, c'est bien un exe...
Publié : lun. 09/mai/2005 18:37
par Polo
ben... Je l'ai déjà mis, enfin voila mon code complet :
Celui qui marche
Code : Tout sélectionner
OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget,"Test")
MyFunction(WindowID(0),0,0,400,300,0,0)
Repeat
EventID.l = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
End
Celui qui marche pas :
Code : Tout sélectionner
OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget,"Test")
Procedure test()
MyFunction(WindowID(0),0,0,400,300,0,0)
EndProcedure
test()
Repeat
EventID.l = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
End
Publié : lun. 09/mai/2005 18:44
par Polo
Euh, j'ai trouvé le problème...
C'est tout con, comme d'habitude...
j'avais oublié le _stdcall
Je vois pas trop ce que ça change, mais ça marche maintenant
