Un probleme de calcul de courbe

Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009 - 22 oct. 2006 à 12:04
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009 - 22 oct. 2006 à 14:06
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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 oct. 2006 à 13:15
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.
0
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
22 oct. 2006 à 13:25
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 oct. 2006 à 13:25
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 oct. 2006 à 13:29
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
0

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

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 oct. 2006 à 13:36
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.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 14:00
Salut :

Test de protection :

if (xmax == 0)
        xmax = 1;
0
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
22 oct. 2006 à 14:06
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.
0
Rejoignez-nous