Problème avec SDL

Résolu
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   -  
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Bonjours à tous et joyeuses fêtes,
Je vous explique mon problème, j'ai fait un programme qui calcule plusieurs valeurs et doit placer des barres en fonction de ces valeurs. J'ai donc utilisé la SDL, tout marche bien quand je compile et lance le programme avec code blocks, mais dès que j'essaye en dehors la console s'ouvre environ 2 seconde et Windows me dit que le programme s'est arrêté.Si vous pouviez m'aider ça serait super.Merci d'avance.

6 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pourrait-on voir ton main() ?
0
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   38
 
oui voilà
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
    freopen("CON", "w", stdout);
    freopen("CON", "r", stdin);
    freopen("CON", "w", stderr);
    SDL_Event event;
    int debut=1;
    while (debut==1)
    {
    SDL_Surface *ecran = NULL, *rectangle = NULL, *barre = NULL;
    SDL_Rect position;
    SDL_Init(SDL_INIT_VIDEO);
    int z=1;
    double Y2;
    double delta;
    double p1;
    int L;
    int Y=1;
    int E;
    int W;
    int I;
    int D;
    int R;
    int M;
    int U;
    double ZA;
    double SX=0;
    int Z=-1000000000000000000000;
    double C;
    double Q;
    double ip;
    double Med2;
    double ip2;
    printf("nombre de listes\n");
    scanf("%d",&I);
    printf("nombre de valeurs maximum des listes\n");
    scanf("%d",&L);
    int N[I+1];
    double tab1[L+1][I+1];
    double ecarttype[I+1];
    double tab2[L+1][I+1];
    int tab3[L+1][I+1];
    double tabA[L+1][I+1];
    double tabB[L+1][I+1];
    int tabC[L+1][I+1];
    double ECC[L+1][I+1];
    double Q1[I+1];
    double Q3[I+1];
    double Moyenne[I+1];
    double Xmin[I+1];
    double Xmax[I+1];
    double Med[I+1];
    double N1[I+1];
    while (I+1!=Y)
    {
    if (I==1)
    {
        N[Y]=L;
    }
    else
    {
    printf("\n\nListe %d\nnombre de valeurs dans la liste\n",Y);
    scanf("%d",&N[Y]);
    if (N[Y]>L)
    {
        N[Y]=L;
    }
    }
    printf("coefficient oui=1 non=0\n");
    scanf("%d",&W);
    ECC[0][Y]=0;
     E=1;
    while(E!=N[Y]+1)
    {
        tabB[E][Y]=Z;
        E++;
    }


    E=1;
    while (E!=N[Y]+1)//saisie des valeurs
    {
        printf("valeur %d\n",E);
        scanf("%lf",&tab1[E][Y]);
        if (W==1)
        {
            printf("coefficient\n");
            scanf("%lf",&tab2[E][Y]);
        }
        else
        {
            tab2[E][Y]=1;
        }
        tab3[E][Y]=E;
        E++;
    }
     Y++;
    }

    Y=1;
    while (Y!=I+1)
    {
    E=1;
    M=1;
    while(M!=N[Y]+1)  //boucle de classement
    {
        D=R=1;
        C=tab1[M][Y];
        while (D!=N[Y]+1)
        {
            Q=tab1[D][Y];
            if (C>Q)
            {
                R++;
            }
            D++;
        }
        while (tabB[R][Y]!=Z)
        {
            R++;
        }
        tabA[R][Y]=C;
        tabB[R][Y]=tab2[M][Y];
        tabC[R][Y]=tab3[M][Y];
        M++;
    }
    E=1;
    while (E!=N[Y]+1)//calcul de l'ecc
    {
        ECC[E][Y]=tabB[E][Y]+ECC[E-1][Y];
        E++;
    }

    Xmin[Y]=tabA[1][Y];
    Xmax[Y]=tabA[N[Y]][Y];
    Q1[Y]=0.25*ECC[N[Y]][Y];
    R=1;
    while (Q1[Y]>ECC[R][Y])//calcul de Q1
    {
        R++;
    }
    Q1[Y]=tabA[R][Y];
    Q3[Y]=0.75*ECC[N[Y]][Y];
    R=1;
    while (Q3[Y]>ECC[R][Y])//calcul de Q3
    {
        R++;
    }
    Q3[Y]=tabA[R][Y];

    ip=ECC[N[Y]][Y]/2;
    ip2=ip;
    while (ip2>1)//paire ou impaire
    {
        ip2=ip2-1;
    }

    R=1;
    if (ip2==0.5)//calcul de la médianne
    {
        Med[Y]=floor(ip+1);
        while(Med[Y]>ECC[R][Y])
        {
            R++;
        }
        Med[Y]=tabA[R][Y];
    }
    else
    {
       Med[Y]=floor(ip);
       Med2=Med[Y]+1;
       while(Med[Y]>ECC[R][Y])
       {
           R++;
       }
       Med[Y]=tabA[R][Y];
       R=1;
       while (Med2>ECC[R][Y])
       {
           R++;
       }
       Med2=tabA[R][Y];
       Med[Y]=(Med[Y]+Med2)/2;
    }

    SX=0;
    E=1;            //calcul de la moyenne
    while (E!=N[Y]+1)
    {
        SX=SX+(tabA[E][Y]*tabB[E][Y]);
        E++;
    }
    Moyenne[Y]=SX/ECC[N[Y]][Y];
    ZA=Moyenne[Y];
    N1[Y]=ECC[N[Y]][Y];
    E=1;
    ecarttype[Y]=0;  //calcul de l'écart type
    while (E!=N[Y]+1)
    {
        ecarttype[Y]=tabB[E][Y]*tabA[E][Y]*tabA[E][Y]+ecarttype[Y];
        E++;

    }
    ecarttype[Y]=sqrt((ecarttype[Y]/N1[Y])-(ZA*ZA));


    E=U=1;
    printf("\nListe %d\n",Y);
    printf("entree Ordre  Chiffre        Coef           ECC\n");
    while (E!=N[Y]+1)  //boucle d'affichage
    {

        printf("%d",tabC[E][Y]);
        if(tabC[E][Y]<10)
        {
            printf("       ");
        }

        else if (tabC[E][Y]<100)
        {
            printf("      ");
        }

        else
        {
            printf("     ");
        }

        printf("%d",U);
        if(U<10)
        {
            printf("     ");
        }

        else if (U<100)
        {
            printf("    ");
        }

        else
        {
            printf("   ");
        }
        printf("%lf  ",tabA[E][Y]);
        if(abs(tabA[E][Y])<10)
        {
            printf("     ");
        }

        else if (abs(tabA[E][Y])<100)
        {
            printf("    ");
        }

        else if (abs(tabA[E][Y])<1000)
        {
            printf("   ");
        }
        else
        {
            printf("  ");
        }
        printf("%lf  ",tabB[E][Y]);
        if(abs(tabB[E][Y])<10)
        {
            printf("     ");
        }

        else if (abs(tabB[E][Y])<100)
        {
            printf("    ");
        }

        else
        {
            printf("   ");
        }
        printf("%lf\n",ECC[E][Y]);
        E++;
        U++;
    }
    printf("\nXmin=%lf\nQ1=%lf\nMed=%lf\nQ3=%lf\nXmax=%lf\nMoyenne=%lf\nn=%lf\necart type=%lf\n",Xmin[Y],Q1[Y],Med[Y],Q3[Y],Xmax[Y],Moyenne[Y],N1[Y],ecarttype[Y]);
    Y++;
    }

    Y=2;
    Xmax[0]=Xmax[1];
    Xmin[0]=Xmin[1];
    while(Y!=I+1)
    {
        if(Xmax[0]<Xmax[Y])
        {
            Xmax[0]=Xmax[Y];
        }
        if(Xmin[0]>Xmin[Y])
        {
            Xmin[0]=Xmin[Y];
        }
    Y++;
    }



    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
    rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 2, 50, 32, 0, 0, 0, 0);
    SDL_WM_SetCaption("Boite a moustaches", NULL);
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 150, 255, 255));


    while (z!=0)
{
    Y=1;
    delta=Xmax[0]-Xmin[0];

    while (Y!=I+1)
    {
    Y2=20+((Y-1)*80);
    if(ecarttype[Y]==0 and I!=1)
    {
    position.x =((Med[Y]-1)/delta)*620+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);
    }
    else if(ecarttype[Y]==0)
    {
    position.x =Med[Y]*620+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);
    }

    else if(ecarttype[Y]!=0)
    {

    position.x =(Xmin[Y]/delta)+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 100, 255, 50));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);

    position.x =(Q1[Y]-Xmin[Y])/delta*620+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 150, 0));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);



    position.x =(Med[Y]-Xmin[Y])/delta*620+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format,0,0, 128));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);


    position.x = (Q3[Y]-Xmin[Y])/delta*620+9;
    position.y = Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 150, 0));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);

    position.x =(Xmax[Y]-Xmin[Y])/delta*620+9;
    position.y =Y2;
    SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));
    SDL_BlitSurface(rectangle, NULL, ecran, &position);

    position.x =9;
    position.y = 25+Y2;
    p1=(Q1[Y]-Xmin[Y])/delta*620+1;
    barre = SDL_CreateRGBSurface(SDL_HWSURFACE, p1, 2, 32, 0, 0, 0, 0);
    SDL_FillRect(barre, NULL, SDL_MapRGB(ecran->format, 100, 255, 50));
    SDL_BlitSurface(barre, NULL, ecran, &position);

    position.x =(Q1[Y]-Xmin[Y])/delta*620+9;
    position.y = Y2;
    p1=((Q3[Y]-Xmin[Y])/delta*620+9)-((Q1[Y]-Xmin[Y])/delta*620+9)+2;
    barre = SDL_CreateRGBSurface(SDL_HWSURFACE, p1, 2, 32, 0, 0, 0, 0);
    SDL_FillRect(barre, NULL, SDL_MapRGB(ecran->format, 50, 50, 100));
    SDL_BlitSurface(barre, NULL, ecran, &position);
    position.x =(Q1[Y]-Xmin[Y])/delta*620+9;
    position.y = 50+Y2;
    SDL_FillRect(barre, NULL, SDL_MapRGB(ecran->format, 50, 50, 100));
    SDL_BlitSurface(barre, NULL, ecran, &position);

    position.x =(Q3[Y]-Xmin[Y])/delta*620+9;
    position.y = 25+Y2;
    p1=((Xmax[Y]-Q3[Y])/delta*620+1);
    barre = SDL_CreateRGBSurface(SDL_HWSURFACE, p1, 2, 32, 0, 0, 0, 0);
    SDL_FillRect(barre, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));
    SDL_BlitSurface(barre, NULL, ecran, &position);
    }
    Y++;
}

    SDL_Flip(ecran);




    SDL_WaitEvent(&event);
    switch(event.type)
    {
        case SDL_KEYDOWN:
            z = 0;
    }
}

    SDL_FreeSurface(rectangle); // Libération de la surface
    SDL_Quit();
    printf("\nrecommencer=1 quitter=0\n");
    scanf("%d",&debut);
    printf("\n\n");
}
return 0;

}

0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Mets un system("pause"); avant ton return 0; et dis-nous si c'est mieux.
0
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   38
 
Non, pas mieux.
0
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Bonjour,
Quel est le message d'erreur que vous avez ? Avez-vous essayez de mettre l'exe dans un dossier avec toutes les dll necessaires de la sdl ?
0
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   38
 
oui et rien.
0

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

Posez votre question
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   38
 
Le message d'erreur est le suivant:
Signature du problème :
Nom d'événement de problème: APPCRASH
Nom de l'application: TRi2.exe
Version de l'application: 0.0.0.0
Horodatage de l'application: 50dc9ee2
Nom du module par défaut: TRi2.exe
Version du module par défaut: 0.0.0.0
Horodateur du module par défaut: 50dc9ee2
Code de l'exception: c00000fd
Décalage de l'exception: 0000e5db
Version du système: 6.1.7601.2.1.0.768.2
Identificateur de paramètres régionaux: 1036
Information supplémentaire n° 1: f47b
Information supplémentaire n° 2: f47b6855e48a6b638bf9cec6c2f43968
Information supplémentaire n° 3: 62f2
Information supplémentaire n° 4: 62f292392d04d88fc88cebef04799a6f
0
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Ces informations permettent seulement de dire qu'il y a eu un débordement de pile "stack overflow" avec le "Code de l'exception: c00000fd ". Ce qu'il faut utiliser n'est pas le debug de windows lorsqu'un programme plante et affiche un message mais un debugger qui permet de tracer l'emplacement du problème dans le code source. Essayez la suite gcc (pack mingw), compilez avec gcc et lancer le programme avec le debugger gdb qui est fourni avec, ça vous permettra d'avoir plus d'info sur l'emplacement du problème et peut-être même la ligne de code qui la provoque.
0
Maxasus Messages postés 115 Date d'inscription   Statut Membre Dernière intervention   38
 
Je me suis débrouillé autrement, Merci
0