Problème avec SDL

Résolu
Maxasus Messages postés 123 Statut Membre -  
Maxasus Messages postés 123 Statut Membre -
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

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Pourrait-on voir ton main() ?
    0
  2. Maxasus Messages postés 123 Statut Membre 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Mets un system("pause"); avant ton return 0; et dis-nous si c'est mieux.
      0
  3. Maxasus Messages postés 123 Statut Membre 38
     
    Non, pas mieux.
    0
    1. 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
  4. Maxasus Messages postés 123 Statut Membre 38
     
    oui et rien.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Maxasus Messages postés 123 Statut Membre 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
    1. 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
  7. Maxasus Messages postés 123 Statut Membre 38
     
    Je me suis débrouillé autrement, Merci
    0