Visual C++ serait il fou ? - Programmation
Marsh Posté le 16-05-2001 à 16:54:22
Je ne connait pas le C++, mais ce genre de comportement me fait penser que l'appel de la fonction modifie la valeur !
Avec :
Code :
|
çà marche ?
[edit]--Message édité par Mara's dad--[/edit]
Marsh Posté le 16-05-2001 à 16:58:58
El_gringo a écrit a écrit : y a une erreur que je comprend pas du tout, est ce qu'on aurai pas le droit en c++ de faire ce que je fais !? voila mon code qui pose pb : long test = FDllAz70_map (session); if (FDllAz70_map (session) < 0) { CString messErreur; ..... ] grâce à test je vois que la fonction un long négatif (constante rendue par la fonction !) et pourtant, par le débugger, je vois que ça fait le contraire de la normale pour mon if : si je met <0 ça y entre pas (ça devrait) si je met >0 ça y entre (ça devrait pas !!) g l'habitude des caprices du C++, mais là il est complètement fou, non ???? |
1- es-tu sur que la fonction renvoi bien un long ?
2- es-tu sur que chaque appel renvoie la meme chose
-> essaie quand meme : if (test<0)... pour voir
Marsh Posté le 16-05-2001 à 16:59:46
non, mais de toute façon, je connais la fonction, elle renvois une constante qui n'change pas, c sur à 100%, je sais même qu'elle rend -555 à tout les coups (c juste une fonction de test, elle est faite pour ça !)
Marsh Posté le 16-05-2001 à 17:04:32
Bon alors une idée :
Dans le test x < 0 où x est un long, c'est quoi le type de 0 ?
Si c'est pas un long, c'est qu'il fait un cast sur x ou sur 0 pour faire la comparaison non ?
Je me souvient avoir vu des truc dans le genre dans un bouquin Java (que j'ai pas sous la main)...
Dites moi si je dis une grosse connerie ! J'le prendrai pas mal.
Marsh Posté le 16-05-2001 à 17:07:34
bahhh c'est juste ça, je croyais qu'il t'avait mordu. Il peut parfois être très méchant ce VC++.
Marsh Posté le 16-05-2001 à 17:11:31
BENB a écrit a écrit : 1- es-tu sur que la fonction renvoi bien un long ? 2- es-tu sur que chaque appel renvoie la meme chose -> essaie quand meme : if (test<0)... pour voir |
1- je suis sur à 100% (voir plus !) que la fonction rend -555 à chaque appel
2- quand je fait le if(test < 0) ça fonctionne, j'avais déja essayé, je demande plus ça par curiosité !
sinon, Mara's dad, c pas un grosse connerie ce que tu dis
...une pas très grosse, ms qd même !
La conversion est implicite pour un chiffre comme 0, qu'soit comparé à un short, un int ou un long c pareil !
Marsh Posté le 16-05-2001 à 17:33:08
El_gringo a écrit a écrit : 1- je suis sur à 100% (voir plus !) que la fonction rend -555 à chaque appel 2- quand je fait le if(test < 0) ça fonctionne, j'avais déja essayé, je demande plus ça par curiosité ! sinon, Mara's dad, c pas un grosse connerie ce que tu dis ...une pas très grosse, ms qd même ! La conversion est implicite pour un chiffre comme 0, qu'soit comparé à un short, un int ou un long c pareil ! |
non mais le resultat de ta fct lui il donne quoi si on le cast ?
Je ne pense pas que ce soit ca quand meme, car sous visual int=long donc je ne pense pas qu'il y ait de cast, et, -555 caste en short je pense que ca reste -555...
J'y avais pense... mais ca ne me parait pa resonnable
Par contre il peut y avoir des bugs dans les compilos...
Marsh Posté le 16-05-2001 à 17:35:09
LA QUESTION IDIOTE PAR EXCELLENCE !
tu n'as pas ajoute un ; a la fin de la ligne if ?, non sinon ca entrerait...
Marsh Posté le 16-05-2001 à 17:48:41
Problème de cast : c'est pas çà si "test < 0" passe . . .
Marsh Posté le 16-05-2001 à 17:58:01
Mara's dad a écrit a écrit : Problème de cast : c'est pas çà si "test < 0" passe . . . |
sauf si sa fct ne renvoie pas un long...
Marsh Posté le 16-05-2001 à 17:59:48
BENB a écrit a écrit : sauf si sa fct ne renvoie pas un long... |
Mais arrêtes d'etre lourd, 'faut que je le répète combient de fois que je suis sur à 100% que ma fonction rend un long négatif !
Marsh Posté le 16-05-2001 à 18:02:06
El_gringo a écrit a écrit : Mais arrêtes d'etre lourd, 'faut que je le répète combient de fois que je suis sur à 100% que ma fonction rend un long négatif ! |
Si je suis lourde, j'ai mes raisons
je parle de la declaration, du prototype de ta fonction.
Marsh Posté le 16-05-2001 à 18:02:32
BENB a écrit a écrit : LA QUESTION IDIOTE PAR EXCELLENCE ! tu n'as pas ajoute un ; a la fin de la ligne if ?, non sinon ca entrerait... |
J'aime pas tes aire supérieurs toi !
NON, y a pas de ; à la fin de la ligne du if ! (j'aurai un warning d'ailleur si y avait ça, tu devrais le savoir !)
Marsh Posté le 16-05-2001 à 18:04:26
BENB a écrit a écrit : Si je suis lourde, j'ai mes raisons je parle de la declaration, du prototype de ta fonction. |
Ma fonction est dans un dll de test qui fonctionne et qui me rend un long inférieur à 0, la preuve par le débugger:
avec
long test = maFonction(...);
if (test < 0)
{ ...
}
ça entre bien dans le if, c complètement fou comme truc !
Marsh Posté le 16-05-2001 à 18:11:26
El_gringo a écrit a écrit : Ma fonction est dans un dll de test qui fonctionne et qui me rend un long inférieur à 0, la preuve par le débugger: avec long test = maFonction(...); if (test < 0) { ... } ça entre bien dans le if, c complètement fou comme truc ! |
Tu ne veux absolument pas comprendre ce que je dis...
imaginons que ta fonction soit Toto maFonction()
avec class Toto
{
operator long()
{
return -555;
}
bool operator<(int)
{
return false;
}
bool operator>(int)
{
return true;
}
};
Bon c'est une caricature, mais c'est pour cela que j'insiste pour savoir ce que renvoie ta fonction reelement, le fait que test recoie -555 ne prouve en fait pas grand chose si il y a quelque chose de tordu derriere...
Marsh Posté le 16-05-2001 à 18:13:53
El_gringo a écrit a écrit : J'aime pas tes aire supérieurs toi ! NON, y a pas de ; à la fin de la ligne du if ! (j'aurai un warning d'ailleur si y avait ça, tu devrais le savoir !) |
J'en ai vu plus d'un !
Et le warning depends d'abord du compilo, et comme je n'utilise plus Visual depuis quelques temps...
Marsh Posté le 16-05-2001 à 18:34:59
BENB a écrit a écrit : J'en ai vu plus d'un ! Et le warning depends d'abord du compilo, et comme je n'utilise plus Visual depuis quelques temps... |
...c un client de ma boite qui m'a fournit la dll qui contient cette fonction; si y a un truc tordu comme ça, c vraiement qu'il veux pas que j'arrive à finir son truc !
Marsh Posté le 16-05-2001 à 18:46:21
Mais cela peux expliquer ton probleme.
Sinon essaye quand meme de faire un rebiuild all pour etre sur qu'il y ai pas un reste d'une veille compile.
Marsh Posté le 16-05-2001 à 19:51:52
Ecoutes si dans ton code
if (FDllAz70_map (session) < 0)
{
...
}
il n'entre pas dans l'accolade c'est que la condition n'est pas vérifiée et donc ta fonction ne retourne pas un entier négatif.
il peut s'agir d'un mauvais prototypage de la fonction : par exemple elle est déclarée ou définie comme retournant un unsigned ou alors elle ne retourne pas la valeur que tu attends.
En conclusion le c++ n'est pour rien dans ce pb
El_gringo a écrit a écrit : y a une erreur que je comprend pas du tout, est ce qu'on aurai pas le droit en c++ de faire ce que je fais !? voila mon code qui pose pb : long test = FDllAz70_map (session); if (FDllAz70_map (session) < 0) { CString messErreur; ..... ] grâce à test je vois que la fonction un long négatif (constante rendue par la fonction !) et pourtant, par le débugger, je vois que ça fait le contraire de la normale pour mon if : si je met <0 ça y entre pas (ça devrait) si je met >0 ça y entre (ça devrait pas !!) g l'habitude des caprices du C++, mais là il est complètement fou, non ???? |
Marsh Posté le 17-05-2001 à 09:35:00
Amadeus a écrit a écrit : Ecoutes si dans ton code if (FDllAz70_map (session) < 0) { ... } il n'entre pas dans l'accolade c'est que la condition n'est pas vérifiée et donc ta fonction ne retourne pas un entier négatif. il peut s'agir d'un mauvais prototypage de la fonction : par exemple elle est déclarée ou définie comme retournant un unsigned ou alors elle ne retourne pas la valeur que tu attends. En conclusion le c++ n'est pour rien dans ce pb |
relis le reste du topic...ça doit faire la 15 fois que je dis que JE SUIS SUR que ma fonction REND UN LONG INFERIEUR A 0, puisque c'est une fonction de test qui pour l'instant ne sert qu'a simuler une erreur de la fonction (indiquée par un retour <0) ...pour faire une telle fonction:
LONG LaFonction(session)
{
return -555;
}
c qd même pas trop dur, et l'erreur n'est pas trop possible sur ce point là...je crois, à moins que mon client ne soit un gros neunoeud
Marsh Posté le 17-05-2001 à 09:59:25
El_gringo a écrit a écrit : relis le reste du topic...ça doit faire la 15 fois que je dis que JE SUIS SUR que ma fonction REND UN LONG INFERIEUR A 0, puisque c'est une fonction de test qui pour l'instant ne sert qu'a simuler une erreur de la fonction (indiquée par un retour <0) ...pour faire une telle fonction: LONG LaFonction(session) { return -555; } c qd même pas trop dur, et l'erreur n'est pas trop possible sur ce point là...je crois, à moins que mon client ne soit un gros neunoeud |
Si je comprends bien, t'es SUR, mais t'as pas vérifié !
Et la fonction que t'utilise, c'est bien la bonne version...
Je dit çà, mais çà explique pas que ta variable test contienne -555. Reste donc le type...
Désolé d'insister, je sais que c'est chiant, mais en générale la solution la plus simple étant la bonne...
En plus t'as surement déjà vérifié, mais çà m'est déjà arrivé si souvent de voir CE QUE JE VOULAIS VOIR et pas ce qui était sous mes yeux !
Courrage ! Et tiend nous au courant...
Quand même, que se passe-t-il si tu écrit toi même la fonction dans le même pgm...
Marsh Posté le 17-05-2001 à 10:13:53
Merci tt le monde d'avoir essayé, tant pis pour ma curiosité, je contourne le problème, je fais avec une variable intérmédiaire.
Je vais supposer que l'erreur est dûe au fait que la fonction que j'utilise est un pointeur de fonction (vu que c une fonction de dll), même si en toute logique ça change pas grand chose.
Bien sur le sujet est pas clos, je reviendrai voir de temps en temps ce que vous en pensez...c'est quand même étrange tout ça, qu'y aurai un malédiction ou un truc du style derrière tout ça qu'ça m'étonnerai pas.
A moins qu'un esprit rationnel éclairé vienne tenter sa chance
Marsh Posté le 17-05-2001 à 10:14:22
El_gringo a écrit a écrit : ...c un client de ma boite qui m'a fournit la dll qui contient cette fonction; si y a un truc tordu comme ça, c vraiement qu'il veux pas que j'arrive à finir son truc ! |
Je suis desolee de te faire chier, mais si tu fais confiance a tes clients tu es foutu !
Marsh Posté le 17-05-2001 à 10:18:44
D'accord avec BENB, faut jamais faire confiance à personne ;-)
Surtout pas à ceux qui passent leur temps sur les forums...
Marsh Posté le 17-05-2001 à 10:44:57
Je maintiens ce que j'ai dit si ta fonction retourne un entier négatif tu dois rentrer dans l'accolade : c'est d'une simplicité biblique. Donc ta fonction ne retourne pas un entier négatif !!!
Et puisque il s'agit d'une fonction contenue dans une dll que tu n'as pas faite comment tu peux être aussi sûr de toi ?
Marsh Posté le 17-05-2001 à 10:50:09
Amadeus a écrit a écrit : Je maintiens ce que j'ai dit si ta fonction retourne un entier négatif tu dois rentrer dans l'accolade : c'est d'une simplicité biblique. Donc ta fonction ne retourne pas un entier négatif !!! Et puisque il s'agit d'une fonction contenue dans une dll que tu n'as pas faite comment tu peux être aussi sûr de toi ? |
...tout simplement parce que g appelé le type qui a fait la Dll qui m'a certifié que sa fonction est toute simple; qu'il l'a testée (et moi aussi d'ailleur !).
Mais vous penser pas que ça peut etre du au fait que ma fonction est en fait un pointeur de fonction !? (peut etre que du coup il n'aime pas que ça soit directe dans un if)
Marsh Posté le 17-05-2001 à 10:56:14
Je suppose que t'as un header de ta dll. Dans ce cas commenet est déclarée cette fameuse fonction ?
Marsh Posté le 17-05-2001 à 10:58:02
Je continue a penser que c'est le prototype de ta fonction qui est faux, "long negatif" n'etant pas un type du C/C++ j'attend toujours de savoir ce qu'elle renvoie cette fichue fonction : un short, un long, un unsigned long ou autre chose ?
Tres souvent tes problemes ne viennent pas du code que tu nous donne....
Marsh Posté le 17-05-2001 à 11:07:12
BENB a écrit a écrit : Tres souvent tes problemes ne viennent pas du code que tu nous donne.... |
...ça c un peu vrai par contre, g constaté aussi
mais j'veux pas mettre tt mon listing, et c pas simple de cibler la source d'une erreur...dont tu n'connais pas la source justement !
mais voici la déclaration de la fonction dans mon header:
MODULEAPI LONG __stdcall AZ70_map(LPSTR);
Marsh Posté le 17-05-2001 à 18:34:57
Et avec
if ( (FDllAz70_map (session)) < 0)
{
CString messErreur;
.....
]
Ca donne quoi ?
Marsh Posté le 17-05-2001 à 19:07:29
Tout d'abord la déclaration de ta fonction n'est pas très courante : moi d'hab mes fonct° exportées sont déclarées comma ça :
extern "C" _declspec(dllexport) type_de_retour MaFonctionExportee();
mais bon...
sinon à quoi sert l'arg LPSTR de ta fonction si elle retourne toujours, comme tu dis, -555 ?
A priori s'il une fonction a un arg c'est qu'elle fait certaines choses qui dépendent de la valeur de cet arg ou qu'elle modifie la valeur de l'arg si c'est un ptr ou une var passée par référence.
C'est vraiment pas clair cette histoire...
Marsh Posté le 17-05-2001 à 22:02:03
246tNt a écrit a écrit : Et avec if ( (FDllAz70_map (session)) < 0) { CString messErreur; ..... ] Ca donne quoi ? |
Oui, c'est la premiere question que je me suis pose en lisant son code.
A+,
Marsh Posté le 18-05-2001 à 09:02:59
gilou a écrit a écrit : Oui, c'est la premiere question que je me suis pose en lisant son code. A+, |
...bah 'fallait me la poseer avant, j'essaye !
Marsh Posté le 18-05-2001 à 09:06:29
246tNt a écrit a écrit : Et avec if ( (FDllAz70_map (session)) < 0) { CString messErreur; ..... ] Ca donne quoi ? |
...ça donne pareil !
Marsh Posté le 18-05-2001 à 09:10:25
Amadeus a écrit a écrit : Tout d'abord la déclaration de ta fonction n'est pas très courante : moi d'hab mes fonct° exportées sont déclarées comma ça : extern "C" _declspec(dllexport) type_de_retour MaFonctionExportee(); mais bon... sinon à quoi sert l'arg LPSTR de ta fonction si elle retourne toujours, comme tu dis, -555 ? A priori s'il une fonction a un arg c'est qu'elle fait certaines choses qui dépendent de la valeur de cet arg ou qu'elle modifie la valeur de l'arg si c'est un ptr ou une var passée par référence. C'est vraiment pas clair cette histoire... |
T'as pas lu tout le topic, normal, y commence à être gros (logique, c tellement bizare ce truc...). Mais j'disais que pour l'instant c seulement une dll de test que j'ai, donc l'argument que je passe ne sert, pour l'instant à rien du tout. Là, j'écrit dans un fichier .ini la valeur que me renverra la fonction (pour mettre en place la gestion des erreurs en simulant ces dernières dans la valeur de retour de la fonction) après on mettra la vraie dll, et hop, le tour sera joué.
Mais tout ça ça résout pas la question (que, je l'dis encore, je n'pose que par curiosité, parce que c facile de contourner le problème !)
Marsh Posté le 18-05-2001 à 09:16:11
et
if ( ((int)(FDllAz70_map(session)))<0)
ou
if( FDllAz70_map(session) < 0L )
Marsh Posté le 18-05-2001 à 10:23:49
El_gringo a écrit a écrit : y a une erreur que je comprend pas du tout, est ce qu'on aurai pas le droit en c++ de faire ce que je fais !? voila mon code qui pose pb : 8< 8< |
et ... tu as essayé de debugger ?
* tu mets un breakpoint devant ton if
* ensuite f11 pour rentrer dans la fonction (tu vas passer en debug assembleur car tu n'as pas les sources de la dll )
* shift f11 pour éxécuter immédiatement la fonction
* ctrl tab pour revenir à ta source
* maintenant dans la fenêtre 'variables', tu auras "FDllAz70_map returned xxxx"
et si xxx ne vaut pas -555, ton client s'est foutu de toi
Marsh Posté le 18-05-2001 à 10:31:27
Si ta fonction est déclaré en "stdcall" (MODULEAPI LONG __stdcall AZ70_map(LPSTR), vérifie que ton linker soit aussi configuré en stdcall (Setting > Linker). Si ce n'est pas le cas, il y a des problèmes de transferts de paramètres.
Maintenant, on linke plutot en cdecl
Marsh Posté le 16-05-2001 à 16:49:47
y a une erreur que je comprend pas du tout, est ce qu'on aurai pas le droit en c++ de faire ce que je fais !?
voila mon code qui pose pb :
long test = FDllAz70_map (session);
if (FDllAz70_map (session) < 0)
{
CString messErreur;
.....
]
grâce à test je vois que la fonction un long négatif (constante rendue par la fonction !)
et pourtant, par le débugger, je vois que ça fait le contraire de la normale pour mon if : si je met <0 ça y entre pas (ça devrait)
si je met >0 ça y entre (ça devrait pas !!)
g l'habitude des caprices du C++, mais là il est complètement fou, non ????