[C][API win32] DialogBox

Fermé
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 - 22 août 2005 à 06:12
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 30 mai 2007 à 18:04
Bonjour

Comment faire pour récupérer un double à partir d'une boite de dialogue?

Merci d'avance

14 réponses

tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
24 août 2005 à 01:13
voila ce que je fais:

dans la procédure de dialogue:

case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK )
{

char *string3;
string3 = (char*)malloc(40*sizeof(char));

GetDlgItemText(hDlg, IDE_EDIT3, string3, 40);
EndDialog(hDlg, *string3);
}
return TRUE;
}

et dans la procédure de fenêtre:

double f;
char *string3;
string3 = (char*)malloc(40*sizeof(char));

*string3 = DialogBoxParam(hinst, "DIALOG4", hGraph, (DLGPROC)Dialog4Proc, (LPARAM)hGraph);
f = atof(string3);

Comme je suis débutant, je ne suis pas très calé sur les pointeurs, donc je pense que c'est ca qui foire.

Merci
1
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
24 août 2005 à 08:43
1) Alloue tes chaines sous la forme char string3[40] puisque tu les alloue statiquement. Car la tu alloues dynamiquement (malloc) et tu ne vide pas la memoire (free(string3)) quand tu as finis.

2) Un pointeur c'est très simple. C'est une adresse (donc ça ne prend que qulques octets, quel que soit la taille de ce qui est pointé) qui dit où est ton objet :
pobj=&obj //j'obtiens l'adresse de l'objet obj
obj=*pobj //j'obtiens l'objet situé à l'adresse pobj

Tu peux bien sur faire des pointeurs de pointeurs de... etc.

3) A ce stade je ne vois pas ce qui te fait dire que f est un entier.
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5 > mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024
24 août 2005 à 17:08
re

Si je fais:

sprintf(chaine, "%f", f);
SetWindowText(hEdit, chaine);

il me sors le premier caractère. Si j'entre un nombre négatif, il me sort 0.
Ca me fait pareil si je fais:

SetWindowText(hEdit, string3);
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
23 août 2005 à 00:52
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
23 août 2005 à 22:40
Bonjour à tous

Je n'arrive toujours pas à récupérer un double à partir d'une boite de dialogue. Je pense qu'il faut récupérer la chaine de caractère avec GetDlgItemText, puis utiliser atof pour la transformer en double, mais je ne sais pas comment procéder. Quelqu'un a-il une idée?
Merci
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
24 août 2005 à 00:25
Moije t'ai répondu à l'autre lien. Mais en fait tout le problème c'est :
1) de récupérer la chaine dans ta boite, chose que tu sembles parvenir à faire.
2) la convertir en double avec atof... cf le lien...
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
24 août 2005 à 00:40
salut

Je récupère bien ma chaine dans ma boite. J'utilise atof, mais il ne me sors qu'un entier...
0

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

Posez votre question
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
24 août 2005 à 00:45
Mets-moi le morceau de code en question (récuperer là valeur, le passage du atof, et l'affichage qui te fait dire que c'est un entier)...

Si ça se trouve c'est juste que tu fais un printf("%d\n",i) à la place d'un printf("%lf\n",i)....

Je t'ai mis dans l'autre lien un exemple d'utilisation, ça marche très bien noramlement atof
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
24 août 2005 à 00:53
J'ai raconté des betises. Si je demande de sortir le texte après l'avoir récupéré avec GetDlgItemText, il me sors le 1er caractère uniquement. Je peux taper 1.5, 10 ou 100, ca me donne 1.
Faut-il que j'utilise GetDlgItemText dans la procédure du dialogue ou dans la procédure de ma fenêtre?

Merci pour ton aide
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
24 août 2005 à 01:29
Re

J'ai un autre souci. En fait je fais une appli sur les polynômes. Evaluation, dérivée, primitive, sommme, produit...
Ca marche très bien pour les opération avec un seul polynôme. Par contre pour 2 polynômes, l'appli plante(Polynome.exe a provoqué une erreur...)

Voici une partie du code:

void saisie_pol(HINSTANCE hinst, HWND hEdit, double *coefs, int deg)
{
int i;

for(i=deg;i>=0;i--)
{
char *string3 = malloc(40*sizeof(char));

*string3 = DialogBoxParam(hinst, "DIALOG4", hEdit, (DLGPROC)Dialog4Proc, (LPARAM)hEdit);
coefs[i] = atof(string3);

}
}

char *saisie_degre(HINSTANCE hinst, HWND hEdit, polynome *p, char *szBuffer, double *coefs, int deg, int nb_poly)
{
int m = 0;
char *szBuffer1;
szBuffer1 = (char*)malloc(56*sizeof(char));

if (nb_poly == 0)
deg = (int)DialogBoxParam(hinst, "DIALOG2", hEdit, (DLGPROC)Dialog2Proc, (LPARAM)hEdit);
else if (nb_poly == 1)
deg = (int)DialogBoxParam(hinst, "DIALOG3", hEdit, (DLGPROC)Dialog3Proc, (LPARAM)hEdit);
new_pol(&p[nb_poly],deg);
coefs = (double*)malloc((deg+1)*sizeof(double));
saisie_pol(hinst, hEdit, coefs, deg);
init_pol(&p[nb_poly],coefs);
m += sprintf(szBuffer, "p%d(x) = %s", nb_poly + 1, afficher(&p[nb_poly], szBuffer1));
free(coefs);

return szBuffer;
}

void MainWnd_Command(HINSTANCE hinst, HWND hEdit, WPARAM wParam)
{
char *buf, *temp;
int deg, m, nb_poly;
double *coefs, eval, x;
polynome *tampon, *p;

buf = (char*)malloc(256*sizeof(char));
temp = (char*)malloc(256*sizeof(char));
tampon = (polynome*)malloc(2*sizeof(polynome));
p = (polynome*)malloc(2*sizeof(polynome));

m = 0;

if (LOWORD(wParam) == IDM_EVAL)
{
char *string4;
string4 = (char*)malloc(256*sizeof(char));

m = sprintf(buf, "Polynôme à évaluer:\r\n %s", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
*string4 = DialogBoxParam(hinst,"DIALOG5",hEdit,(DLGPROC)Dialog5Proc, (LPARAM)hEdit);
x = atof(string4);
eval = eval_x(p[0],x);
m += sprintf(buf + m, "\r\n\r\np1(%f) = %f",x,eval);
buf[m] = '0';
free(temp);
}

else if (LOWORD(wParam) == IDM_DERIV)
{

m = sprintf(buf, "Polynôme à dériver:\r\n %s", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
tampon[0] = derive(p[0]);
m += sprintf(buf + m, "\r\n\r\np1'(x) = %s", afficher(&tampon[0], temp));
free(temp);
}

else if (LOWORD(wParam) == IDM_INTEGR)
{

m += sprintf(buf + m, "Polynôme à intégrer:\r\n %s", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
tampon[0] = integre(p[0]);
m += sprintf(buf + m, "\r\n\r\nP1(x) = %s", afficher(&tampon[0], temp));
free(temp);
}

else if (LOWORD(wParam) == IDM_SOMME)
{

m += sprintf(buf + m, "Polynômes à ajouter:\r\n %s\r\n ", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
m += sprintf(buf + m, "%s", saisie_degre(hinst, hEdit, &p[1], temp, coefs, deg, 1));
free(temp);
tampon[0] = add(p[0], p[1]);
m += sprintf(buf + m, "\r\n\r\np1(x) + p2(x) = %s", afficher(&tampon[0], temp));
free(temp);
}

else if (LOWORD(wParam) == IDM_DIFF)
{

m += sprintf(buf + m, "Polynômes à soustraire:\r\n %s\r\n ", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
m += sprintf(buf + m, "%s", saisie_degre(hinst, hEdit, &p[1], temp, coefs, deg, 1));
free(temp);
tampon[0] = diff(p[0],p[1]);
m += sprintf(buf + m, "\r\n\r\np1(x) - p2(x) = %s", afficher(&tampon[0], temp));
free(temp);
}

else if (LOWORD(wParam) == IDM_PROD)
{

m += sprintf(buf + m, "Polynômes à multiplier:\r\n %s\r\n ", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
m += sprintf(buf + m, "%s", saisie_degre(hinst, hEdit, &p[1], temp, coefs, deg, 1));
free(temp);
tampon[0] = mult(p[0],p[1]);
m += sprintf(buf + m, "\r\n\r\np1(x) * p2(x) = %s", afficher(&tampon[0], temp));
free(temp);
}

else if (LOWORD(wParam) == IDM_DIV)
{

m += sprintf(buf + m, "Polynômes à diviser:\r\n %s\r\n ", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
m += sprintf(buf + m, "%s", saisie_degre(hinst, hEdit, &p[1], temp, coefs, deg, 1));
free(temp);
division_euc(p[0], p[1], &tampon[0], &tampon[1]);
m += sprintf(buf + m, "\r\n\r\np1(x)/p2(x) = %s", afficher(&tampon[1], temp));
free(temp);
m += sprintf(buf + m, " + %s", afficher(&tampon[0], temp));
free(temp);
m += sprintf(buf + m, "/%s", saisie_degre(hinst, hEdit, &p[0], temp, coefs, deg, 0));
free(temp);
}

free(tampon);
free(p);
SetWindowText(hEdit, buf);
}

Si t'as une idée de se qui peut provoquer cette erreur...

Merci
@+
Tophe
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
24 août 2005 à 08:49
Bon je regarderai ce soir dans le détail, mais dans l'immédiat tu peux essayer d'améliorer le code pour travailler sur une structure de polynome.

struct polynome{
   int *coeff;
} *polynome;

struct polynome *new_polynome(unsigned int degre,int *coeffs){
    //...
}

void del_polynome(struct polynome *p){
   //...
}

struct polynome *add_polynome(struct polynome *p1,struct polynome *p2){
  //...
}


Mais l'erreur que tu as actuellement est visiblement une erreur de segmentation (ie accéder à une plage mémoire non allouée). Si tu as un débugger c'est le moment de l'utiliser ^^

Je regarderai plus en détail ce soir, tiens moi au courant
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
24 août 2005 à 17:18
re

J'utilise déjà une structure de polynômes:

struct polynome{
int deg;
doube *coefs;
} *polynome;

Peut faut-il mettre polynome *p et non polynome p dans mes fonctions add, diff...

J'ai un débugger (j'utilise Dev C++), mais je sais pas à quoi ça sert, et comment on s'en sert...

Merci pour ta patience
@+
Tophe
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
25 août 2005 à 02:35
1) Un debugger c'est quoi ?

Un debugger ca sert à trouver ou ça plante.

Tu le lances, et il te dit a quelle ligne ça plante pour peu que les options de compilations le permettent (ça doit être transparent avec devc++ je presume).

Après tu peux afficher la pile pour voir à quel appel ça a planté.

Tu peux aussi mettre des points d'arrets pour mettre en pause l'execution. Libre à toi de la continuer pas à pas ou jusu'au prochain breapoint.

2) Pour ton code

Je ne peux malheureusement pas debugger ton code car il n'est que partiel (moi il me faut au moins un main qui mette en évidence le problème!! :-) ).

3) Debugger sans outil de debuggage

Si tu n'aimes pas les debuggers tu peux essayer de mettre des printf à l'entrée et à chaque sortie de fonction :
void f(int i){
   printf("Entre dans f() : i=%d\n",i);
   //code...
   printf("Sort de f()\n");
}


A toi de reserrer petit à petit pour trouver ou ça plante ;-) Mais a priori c'est un pointeur qui n'est pas initialisé (comprendre un pointeur qui n'a pas été affecté par un malloc afin de contenir une adresse valide)

Bonne chance
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
25 août 2005 à 22:35
salut

pour revenir à mon problème de double de récupérer à partir d'un dialog, si je fais dans la procédure du dialog:

char string3[40];
double f;

GetDlgItemText(hDlg, IDE_EDIT3, string3, 40);
f = atof(string3);

Je fais comment après pour récupérer f, car EndDialog ne renvoie qu'un entier.

Merci
@+
Tophe
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
26 août 2005 à 02:23
Heu c'est à mon avis plutôt une chaine, non, genre "12.345" ? Auquel cas atof("12.345") marche et retourne 12.345... Et je ne comprends pas ce qui te fait dire que ca te retourne un entier (désolé je suis sous linux donc impossible pour moi de tester ce que tu fais).

Sinon peut-être peux-tu faire ton interface en QT, qui a le mérite de tourner sous windows et linux... La je pourrais t'aider vraiment

http://www.trolltech.com/download/qt/windows.html
(prends la version mingw)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
26 août 2005 à 02:55
Moi non plus je ne comprends pas.
EndDialog retourne un booléen. Cette fonction sert à detruire une DialogBox.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxreference/dialogboxfunctions/enddialog.asp

Une fois que f reçoit la valeur renvoyée par atof (), la valeur est dans f.
EndDialog n'intervient pas là dedans...
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5
26 août 2005 à 16:25
salut

je me suis mal exprimé. Le second paramètre de EndDialog est bien un entier? Pour récupérer un entier entré dans une boite de dialogue:

dans la procédure ma boite de dialogue:

int m;
GetDlgItemInt(hDlg, m, NULL, TRUE);
EndDialog(hDlg, m);

dans la procédure ma fenêtre principale:
int m=DialogBoxParam(...)
je récupère bien mon entier.

Mais pour récupérer un double, je ne sais pas comment procéder.

J'espère que j'ai été plus claire.
Merci
@+
Tophe
0
tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010 5 > tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010
29 août 2005 à 16:20
Bonjour

J'essaie toujours de régler mon problème: récupérer un double à partir d'une boite de dialogue. Ca fait 2 semaines que je suis dessus et ca commence à me prendre le chou. Si quelqu'un a une idée...

Merci
@+
Tophe
0
toto > tophe03 Messages postés 327 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 14 avril 2010
30 mai 2007 à 14:57
Un simple cast devrait suffire...
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 749
30 mai 2007 à 18:04
Avec un sscanf par exemple...
#include <stdio.h>

int main(){
    const char *buffer = "3.14";
    double d;
    if(sscanf(buffer,"%lf",&d) == 1){
        printf("Le double vaut %lf\n",d);
    }else{
        printf("La chaine %s ne peut être convertie en double\n",buffer);
    }
    return 0;
}

Bonne chance
0