Problème avec SDL

Résolu/Fermé
Maxasus Messages postés 115 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 - 27 déc. 2012 à 18:58
Maxasus Messages postés 115 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 - 23 mars 2013 à 18:01
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 déc. 2012 à 19:51
Pourrait-on voir ton main() ?
0
Maxasus Messages postés 115 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 38
27 déc. 2012 à 19:56
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 déc. 2012 à 20:02
Mets un system("pause"); avant ton return 0; et dis-nous si c'est mieux.
0
Maxasus Messages postés 115 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 38
27 déc. 2012 à 20:19
Non, pas mieux.
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
28 déc. 2012 à 10:36
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 jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 38
28 déc. 2012 à 19:12
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 jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 38
30 déc. 2012 à 17:53
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 vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
17 janv. 2013 à 12:43
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 jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 juin 2014 38
23 mars 2013 à 18:01
Je me suis débrouillé autrement, Merci
0