Probleme de valeur

Résolu
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004 - 28 juil. 2004 à 10:22
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 28 juil. 2004 à 20:06
Hello.

Voila mon enieme probleme sur un meme projet.
Je calcul une valeur grace a deux autres données. Jusque la ca fonctionne.
Pour un souci d'unité, je multipli le tout par 10^6. et la ca ne fonctionne plus.

En clair, des que je multiplie par plus de 1000, le resultat devient erroné ( et negatif qui plus est ce qui est theoriquement impossible). Je pense donc que c'est un probleme de déclaration. Mes variables sont déclarée en double. Je pense que c'est suffisant. Les résultat atteignent quelque centaine de milliards.

Merci pour l'aide.

T.

20 réponses

pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 18:47
Ok j'ai trouvé d'ou vient le probleme. Mais c'est pas pour autant que j'ai trouvé la solution.

Comme je l'ai dit dans le post précédent, les editbox n'affiche pas correctement le résultat.
Je precise cette phrase.

En fait les EditBox n'affiche pas les chiffres a virgules ou du moins elle n'affiche que la partie entiere, la partie décimale et zappée.
Alors forcément comme j'ai des valeur plus petite que 1 il n'affiche que 0.

Saurait tu comment résoudre ce pbleme ??
Si oui je le jure je t'offre une bouteille de champagne !!

Merci.

Timo
3
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 19:06
J'ai testé ta fonction JDCjcd mais il me sort une erreur au moment du linking:

error LNK2001: unresolved external symbol "int __cdecl mySetDlgItemDouble(struct HWND__ *,int,float)" (?mySetDlgItemDouble@@YAHPAUHWND__@@HM@Z)
Debug/Fracture Win32.exe : fatal error LNK1120: 1 unresolved externals

sympa....
Je me suis permis de transformer le double en float pour voir.
J'avoue ne pas savoir ce qui cause cette erreur...
3
cs_thierry la fronde Messages postés 351 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 12 août 2009
28 juil. 2004 à 10:38
Essaie avec un long double, à condition que ton pc suive...
Double est une valeur signée :
"The double type contains 64 bits: 1 for sign, 11 for the exponent, and 52 for the mantissa. Its range is +/?1.7E308 with at least 15 digits of precision. " msdn.

Thierry la Fronde
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 10:40
Ben c'est que tu as fais un overflow ou une operation pas légale.

c'est quoi la valeur avant la multiplication par 1e-6 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 11:07
oué mon pc devrait suivre mais ca n'arrange pas le pbleme....

La valeur du chiffre avant multiplication par le million est 224199.
Autre chose, quand je modifie un des paramettre censé agir sur cette valeur, elle ne change pas. pourtant j'ai verifié, il prend bien en compte le changement de ces parametre.

Autre question, est ce que la ligne de code suivante fonctionne sous VC++ 6 :

g=(*s)/(y);

ou g est de type long double, y aussi et s un pointeur sur un long double remplie avec :

*s=3-(*poisson);

Parceque kan je lui demande d'afficher g, il me donne 0.....

Autre probleme, je lui demande de multiplier Pi (defini par un #define Pi 3.1415926) par un nombre (qui vaut 1 dans ce cas) et il me donne 3 sans les decimale. Savez vous a quoi cela est du ??

Merci pour l'aide.

T.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 12:15
tu as fais Pi*1 ou Pi*1. car la diference c'est que le point en plus specifie que c'est un flotant, mais normalement c'est automatique.

si j'ai bien compris : tu fais :
double toto,tutu;
toto=224199.;
tutu=toto*1000000.;

et la alors tutu vaut n'importe quoi ?
0
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 12:27
oué oué tout a fait ca.

Pis maintenant mes EditBox n'affiche plus rien....HAAA je vais peter un cabeul !!!

pourtant mes valeurs ne sont pas nulles....chelou...
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 12:48
tu peux creer un nouveau projet avec juste un tout petit main

int main(void)
{
double toto,tutu;
toto=224199.;
tutu=toto*1000000.;
printf("%le",tutu);
getch();
return 0;
}

cela donne koi ? le bon resultat ?
0
cs_imanewin32 Messages postés 70 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 12 août 2004
28 juil. 2004 à 13:08
envoit tout le code qui te travail on va voir se qui se passe
0
cs_thierry la fronde Messages postés 351 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 12 août 2009
28 juil. 2004 à 15:37
Ce ne serait pas un problème de formattage des données à l'affichage ?

Si, quand tu fais un débogage pas à pas tes valeurs sont correctes dans tes variables, alors peut-être qu'il faut formatter tes données pour qu'elles apparaissent correctes dans une EditBox ou autre.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 15:41
ou c'est vrai que ca peut etre c ale source d'erreur, car si dans un printf tu mets %d au lieu de %le, alors on d'afficher des choses (des nombres en caracteres) qui ressemble grandement a ce que tu as rencontré.
0
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 16:07
Merci les gars pour toutes vos reponses.

Quelques petite questions :
a JCDjcd : ta fonction getch() elle fait parti de kel include parceque VC me dit k'il la connait po et comme je la connais pas non plus....

Sinon voila le code entier : la premiere partie gere la dialog box mere et les 2 types de fille, une ki affiche des image sur des dialog et l'autres ki sert au calcul.
Au passage si jamais vous savez pourquoi je ne peux pas afficher mes images kan je lance les dialog image depuis la fille qui sert a calculer....

Merci pour votre aide.


Voila le code de la fenetre mere
#include <windows.h>
#include "resource.h"

HWND		hDlg;
HINSTANCE	hInst;

BOOL CALLBACK ChildDlgProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK ChildDlgProcfailure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

BOOL CALLBACK MainDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg) 
        {
case WM_INITDIALOG:
      hDlg = hWnd;
      return 1;

case WM_COMMAND:
switch(LOWORD(wParam)) 
{  
                                  case IDC_FAILURE:
DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_FAILUREBOX),hWnd,ChildDlgProcfailure,0);
break;

case IDCANCEL:
EndDialog(hWnd,IDCLOSE);
                break;

case IDC_IMAGE:
DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_ASSUM1),hWnd,ChildDlgProc,0);
break;

                                case IDC_CRACKSIZE:
MessageBox(hDlg,"Pas encore implementé","Désolé",0);
break;
}
}
return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
hInst = hInstance;
return DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDlgProc, NULL);
}

Voila le code de la fenetre fille qui sert a calculer

#include <windows.h>
#include "resource.h"
#include<math.h>
#define Pi 3.1415926

HWND hChildDlgfailure;
HINSTANCE hInstfailure;
HWND hWnd;

double * young = new double ;
double * poisson = new double;
double * toughness = new double ;
double * thickness = new double;
double * length = new double ;
double * loading = new double ;
long double * Kic = new long double ;
long double * Gic = new long double ;
long double * q =new long double;
double * s =new double;

long double y=0;
long double p=0;
double l=0;
double lo=0;
double k=0;
double g=0;
double thick=0;
double tough=0;

BOOL CALLBACK ChildDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

BOOL CALLBACK ChildDlgProcfailure(HWND hWndfailure, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg) 
{
case WM_INITDIALOG:
hChildDlgfailure = hWndfailure;
SetDlgItemInt(hWndfailure,EDITLOADING,1,TRUE);
SetDlgItemInt(hWndfailure,EDITPOISSON,1,TRUE);
SetDlgItemInt(hWndfailure,EDITLENGTHCRACK,1,TRUE);
SetDlgItemInt(hWndfailure,EDITTHICKNESS,1,TRUE);
SetDlgItemInt(hWndfailure,EDITLOADING,1,TRUE);
SetDlgItemInt(hWndfailure,EDITKIC,1,TRUE);
SetDlgItemInt(hWndfailure,EDITGIC,0,TRUE);
SetDlgItemInt(hWndfailure,EDITYOUNG,1,TRUE);
return 1;

                case WM_COMMAND:
switch(LOWORD(wParam)) 
{  
case IDC_AFFICHE:
DialogBoxParam(hInstfailure,MAKEINTRESOURCE(IDD_ASSUM1),hWndfailure,ChildDlgProc,NULL);
//Cet appel fonctionne mal, la dialogbox se charge mais l'image qui est censée s'afficher dessus non.

case IDC_ASSUM1:
*length=GetDlgItemInt(hWndfailure,EDITLENGTHCRACK,NULL,TRUE);
*loading=GetDlgItemInt(hWndfailure,EDITLOADING,NULL,TRUE);
*young=GetDlgItemInt(hWndfailure,EDITYOUNG,NULL,TRUE);
*poisson=GetDlgItemInt(hWndfailure,EDITPOISSON,NULL,TRUE);

l=*length;
lo=*loading;
y=*young;

*q=Pi*l*0.001;
k=lo*sqrt(*q);
*q=4*y*(k)*1000000;
*s=3-(*poisson);
g=((*s)/(*q));

SetDlgItemInt(hWndfailure,EDITKIC,k,TRUE);
SetDlgItemInt(hWndfailure,EDITGIC,g,TRUE);

DialogBoxParam(hInstfailure,MAKEINTRESOURCE(IDD_ASSUM1),hWndfailure,ChildDlgProc,NULL);

break;

case IDC_ASSUM2:

*length=GetDlgItemInt(hWndfailure,EDITLENGTHCRACK,NULL,TRUE);
*loading=GetDlgItemInt(hWndfailure,EDITLOADING,NULL,TRUE);
*young=GetDlgItemInt(hWndfailure,EDITYOUNG,NULL,TRUE);
*poisson=GetDlgItemInt(hWndfailure,EDITPOISSON,NULL,TRUE);
*thickness=GetDlgItemInt(hWndfailure,EDITTHICKNESS,NULL,TRUE);

l=*length;
lo=*loading;
p=*poisson;
y=*young;
thick=*thickness;

*q=Pi*l*0.001;
thick=2*thick*0.001;
*s=cos(*q/thick);

k=(lo*sqrt(*q))/(sqrt(*s));
*Kic=k;
g=((3-p)/(4*y*1000000))*k;

SetDlgItemInt(hWndfailure,EDITKIC,k,TRUE);
SetDlgItemInt(hWndfailure,EDITGIC,g,TRUE);

DialogBoxParam(hInstfailure,MAKEINTRESOURCE(IDD_ASSUM2),hWndfailure,ChildDlgProc,NULL);
break;

case IDC_ASSUM3:

DialogBoxParam(hInstfailure,MAKEINTRESOURCE(IDD_ASSUM3),hWndfailure,ChildDlgProc,NULL);
break;

case ID_CLOSE:
EndDialog(hWndfailure,IDCLOSE);
break;
}
break;
}
return 0;
}

Voila le code de la fentre fille qui affiche l'image (enfin qui gere la dialog box contenant l'image...)

#include <windows.h>
#include "resource.h"

HWND	hChildDlg;

BOOL CALLBACK ChildDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg) 
{
case WM_INITDIALOG:
hChildDlg = hWnd;
return 1;

case WM_COMMAND:
switch(LOWORD(wParam)) 
{  

case IDC_CLOSE:
EndDialog(hWnd,IDOK);
break;
}
break;
              }
return 0;
}



Voila. Excusez moi sur les bizzarerie posible de ce code mais je commence l'api alors bon....En tout cas merci pour l'aide.

T.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 16:34
getch() permet l'attente d'une touche (d'ailleur si ca marche pas, met deux getch() a mla suite)

il est dans la librairei conio.h
je programme aussi sous VC, et il connait, t'inquiete po.
0
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 16:55
ok j'ai testé ton pti programme ca fonctionne paarfaitement il me retourne bien la valeur attendue.

Pourrait tu me donner un peu plus d'info sur conio.h ?? je connais pas du tout cette librairie en fait...

Merci.

Timo
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 17:44
conio.h c'est une libraire d'entrer/sortie (en anglais I/O d'ou les deux derniere lettres de conio)

il y a des fonctions sur ce qui se rapporte a une console dont l'attente d'une touche comme getch()

sur ton programme qui plante, tu as essaye de mettre des printfs (les memes) pour voir les vraies valeurs ? car la on ne peut pas nous meme lancer le programme, on n'a pas les resources pour pouvoir compiler. Donc pour debuger juste a l'oeil, c dur ...
0
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 18:30
Tout a l'heure vous parliez de formattage de données.
La fonction SetDlgItemInt() prend comme argument un entier non signé.
Est ce k'il est possible que puiske mes donnée sont des double je ne puisse les afficher pour cette raison ?

J'ai verifié dans un pgm a part avec des printf en console que les calculs etaient valide et oui ils le sont. Ce ne sont donc que les Editbox qui foirent.
0
cs_thierry la fronde Messages postés 351 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 12 août 2009
28 juil. 2004 à 18:34
BOOL SetDlgItemInt(
HWND hDlg, // handle to dialog box
int nIDDlgItem, // control identifier
UINT uValue, // value to set
BOOL bSigned // signed or unsigned indicator
);

Comme tu le vois, il te faut un entier non signé sinon tes valeurs seront tronqués. Essaie de mettre un cast devant ton double ?!

Pour afficher des valeurs numériques dans un EditBox tu dois convertir tes double en CString.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 18:41
non mais il y a une autre solution, tu crees ta nouvelle fonction :

BOOL mySetDlgItemDouble(HWND hDlg,int ID,double n)
{
char buf[256];
sprintf(buf,"%lf",n);
return SetDlgItemText(hDlg,ID,buf);
} // SetDlgItemDouble()

et maintenant ca devrait marcher
0
pidoumtimo Messages postés 65 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 18 août 2004
28 juil. 2004 à 19:14
Ok les gars ca fonctionne.
J'ai adapté un peu le code de JDCjdc et ca marche parfaitement.
Je vous remercie bien pour toute l'aide.

JDCjdc t'as gagné une bouteille de champagne.
Si tu la veux je te l'envoi par la poste des que je suis de retour en france ( je suis en england pour le moment..) soit dans 1 mois.

Merci encore.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
28 juil. 2004 à 20:06
dans ton editbox ce n'est plus des entiers, mais du texte qui representer le formatage d'une nombre. J'avoue aussi que l'erreur me parait assez etrange. Peut un Pb de definition du protoype, enfin je ne sais pas ...

bonne chance pour la suite de ton programme.
0
Rejoignez-nous