Un probleme de calcul de courbe

Signaler
Messages postés
65
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
21 octobre 2009
-
Messages postés
65
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
21 octobre 2009
-
Voila mon probleme, je creer un programme dessinant des courbes (fonction,point par point).
Mais j'ai un probleme, lors ce que je teste et je rentre les valeur mini, maxi rien ne se passe et dés que je met des static à la place de simple int le programme plante dés le demarrage.
Pouvait vous m'aider ?
Voici le code:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        RECT rcClient;
        POINT Poly [4]  = {425,10,
                           425,310,
                           775,310,
                           775,10                                                                    
                          };
        int firstx = 425;
        int secondx = 775;
        int firsty = 10;
        int secondy = 310;
        int x;
        int y;
        int refx;
        int refy;
        int paint;
        int dist = 0;        int xmin 0,xmax 0;
        HPEN absord = (HPEN) CreatePen (PS_SOLID,2,RGB(0,0,0));
        HPEN courbee = (HPEN) CreatePen (PS_SOLID,2,RGB(255,55,16));
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
             CreateFirst(hwnd);
             CreateSecond (hwnd);
             CreateThird(hwnd);
             CreateFourth(hwnd);
             break;
        case WM_COMMAND:             if (LOWORD(wParam) IDE_DIST && HIWORD(wParam) EN_CHANGE)
             {
                                GetWindowText (hdist,egal,10);
                                dist = atoi(egal);
                                GetClientRect(hwnd, &rcClient);
                                InvalidateRect(hwnd, &rcClient, false);
             }             if (LOWORD(wParam) IDE_XMAX && HIWORD(wParam) EN_CHANGE)
             {
                                GetWindowText (hxmax,egal,10);
                                xmax = atoi(egal);
                                GetClientRect(hwnd, &rcClient);
                                InvalidateRect(hwnd, &rcClient, false);
             }             if (LOWORD(wParam) IDE_XMIN && HIWORD(wParam) EN_CHANGE)
             {
                                GetWindowText (hxmin,egal,10);
                                xmin = atoi(egal);
                                GetClientRect(hwnd, &rcClient);
                                InvalidateRect(hwnd, &rcClient, false);
             }
             break;
        case WM_PAINT:
             HDC hDC;
             PAINTSTRUCT ps;
             POINT pos;
             hDC = BeginPaint (hwnd,&ps);
             Polygon (hDC,Poly,4 );
             MoveToEx (hDC,425,10,&pos);
             SelectObject (hDC,absord);
             LineTo(hDC,425,310);
             LineTo(hDC,775,310);
             //---
             MoveToEx (hDC,firstx,secondy,&pos);
             refx = (secondx - firstx) / xmax;
             refy = (secondy - firsty) / 10;
             for (paint = 0; paint <= xmax;paint+=dist)
             {
                 MoveToEx (hDC,firstx,secondy,&pos);
                 x = firstx + (paint*refx);
                 MoveToEx (hDC,x,310,&pos);
                 LineTo (hDC,x,305);
                 MoveToEx (hDC,firstx,secondy,&pos);
                 y = secondy - (paint*refy);
                 MoveToEx (hDC,425,y,&pos);
                 LineTo (hDC,430,y);
             }
             SelectObject (hDC,courbee);
             MoveToEx (hDC,firstx,secondy,&pos);
             for (paint = 0; paint <= xmax;paint+=dist)
             {
                 x = firstx + (paint*refx);
                 y = secondy - (paint*refy);
                 if( y < 10)
                 break;
                 LineTo (hDC,x,y);
             }
             //---
             EndPaint (hwnd,&ps);
             break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

7 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Sans static ca ne peux pas marcher, vu que par exemple a un moment tu recoit le message WM_COMMAND tu definis xmax, la procedure se termine, xmax est detruite et au prochain message WM_PAINT xmax vaut 0.
C'est quoi ton message d'erreur si tu met les statics ?
Sinon initialise tes variables a l'exterieur de ta procedure.
Messages postés
65
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
21 octobre 2009

J'ai deja essayer d'initialiser à l'exterrieur de la procedure et en mettant des statics mais le programme n'as pas de probleme de compilation ais au demarage il plante.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Pareil pour
HPEN absord = (HPEN) CreatePen (PS_SOLID,2,RGB(0,0,0));
il te faut le definir 1 SEULE fois au debut du fichier par exmple car a chaque appel a ta procedure tu recréé un HPEN et jamais tu ne le detruit >> fuite memoire.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Tu le teste bien en mode debug ? Met un point d'arret au debut au pire mais maintenant que j y pense le plantage peut venir de la fuite memoire.
Donne nous le message d'erreur
sinon deja >> refx (secondx - firstx) / xmax; vu ke xmax 0 division par zero > plantage
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Y'a un gros probleme déja, au début de ta WndProc tu crée 2 pens que tu
ne détruis pas, ca fait un (gros) memory leak. La WndProc est appelée
très très souvent, et tu peux etre sur qu'au bout d'un moment ton
programme plantera, a cause de la limite de nombre gdi que l'on peut
créer.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Test de protection :

if (xmax == 0)
        xmax = 1;
Messages postés
65
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
21 octobre 2009

Merci, vous m'avez permi de trouver la reponse.
static int dist;
static int xmin,xmax;
et il fallait rajouter
WM_CREATE :
CreateFirst (hwnd);
CreateSecond (hwnd);
CreateThird(hwnd);
CreateFourth(hwnd);
xmin = 0;
xmax = 10;
dist = 1;
break;
et surtout vous m'avez montré l'une des perte de memoire dont je ne trouver pas la cause.