Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conflit entre deux fonctions

Sujet résolu
    19 février 2020 à 18:45:28

    Bonjour,

    J'essaye de programmer une petite application, cependant le fichier principal est tellement lourd que j'ai décidé de faire des fonctions secondaires et c'est là que le hic vient : une segmentation fault a lieu.

    Voici les codes :

    Le code d'un bouton sans être une fonction secondaire (aucune segmentation fault)

    if(detect1.check[0]==1)
            {
                SDL_BlitSurface(window,NULL,screen,&fenetre);
                if(cnt<max_length)
                {
                    if(touches(key,chaine))
                    {
                        cnt+=1;
                    }
                }
                texte=TTF_RenderText_Shaded(Texte,chaine,noir,blanc);
                SDL_FillRect(screen,&BARRE_EDITION,SDL_MapRGB(screen->format,255,255,255));
                SDL_BlitSurface(texte,NULL,screen,&CHAINE);
                SDL_BlitSurface(Donner_nom_projet,NULL,screen,&NOM_PROJET);
                char cmd1[255]="cd projects & md ";
                if(Collision(&curseur,&BOUTON_FERMER[0]))
                {
                    ANIM_FERMER[0].x=40;
                    if(detect1.value==1)
                    {
                        detect1.check[0]=0;
                        strcpy(cmd1,"");
                        strcpy(chaine,"");
                        cnt=0;
                    }
                }
                else
                {
                    ANIM_FERMER[0].x=0;
                }
                SDL_BlitSurface(bouton_fermer[0],&ANIM_FERMER[0],screen,&BOUTON_FERMER[0]);
                if(key[SDLK_BACKSPACE])
                {
                    strcpy(chaine,"");
                    cnt=0;
                }
                if(key[SDLK_RETURN])
                {
                    detect1.check[0]=0;
                    strcat(cmd1,chaine);
                    system(cmd1);
                    strcpy(cmd1,"");
                    strcpy(chaine,"");
                    cnt=0;
                }
            }

    Le code de la même procédure mais étant une fonction secondaire :

    SDL_Surface *Tableau_de_surface[5]={window,screen,texte,Donner_nom_projet,bouton_fermer[0]};
            SDL_Rect Tableau_de_rect[7]={fenetre,BARRE_EDITION,CHAINE,NOM_PROJET,curseur,BOUTON_FERMER[0],ANIM_FERMER[0]};
            Bouton1(&detect1,key,chaine,Texte,Tableau_de_surface,Tableau_de_rect);
    void Bouton1(Detect* detect,Uint8 *key,char chaine[max_length],TTF_Font *Texte,SDL_Surface* surface_table[5],SDL_Rect rect_table[7])
    {
        int cnt=-1;
        Texte=TTF_OpenFont("police.ttf",20);
        SDL_Color noir={0,0,0};
        SDL_Color blanc={255,255,255};
        if(detect->check[0]==1)
        {
            SDL_BlitSurface(surface_table[0],NULL,surface_table[1],&rect_table[0]);
            if(cnt<max_length)
            {
                if(touches(key,chaine))
                {
                    cnt+=1;
                }
            }
            surface_table[2]=TTF_RenderText_Shaded(Texte,chaine,noir,blanc);
            SDL_FillRect(surface_table[1],&rect_table[1],SDL_MapRGB(surface_table[1]->format,255,255,255));
            SDL_BlitSurface(surface_table[2],NULL,surface_table[1],&rect_table[2]);
            SDL_BlitSurface(surface_table[3],NULL,surface_table[1],&rect_table[3]);
            char cmd1[255]="cd projects & md ";
            if(Collision(&rect_table[4],&rect_table[5]))
            {
                rect_table[6].x=40;
                if(detect->value==1)
                {
                    detect->check[0]=0;
                    strcpy(cmd1,"");
                    strcpy(chaine,"");
                    cnt=0;
                }
            }
            else
            {
                rect_table[6].x=0;
            }
            SDL_BlitSurface(surface_table[4],&rect_table[6],surface_table[1],&rect_table[5]);
            if(key[SDLK_BACKSPACE])
            {
                strcpy(chaine,"");
                cnt=0;
            }
            if(key[SDLK_RETURN])
            {
                detect->check[0]=0;
                strcat(cmd1,chaine);
                system(cmd1);
                strcpy(cmd1,"");
                strcpy(chaine,"");
                cnt=0;
            }
        }
    }

    Et la page accusée de segmentation fault (alors qu'il y en a aucunes lorsque le code du bouton n'est pas appelé grâce à une fonction secondaire) :

    void barre_des_taches(SDL_Surface*screen,SDL_Rect curseur,Detect *detect)
    {
        TTF_Font *ttf_texte=NULL;
    
        ttf_texte=TTF_OpenFont("police.ttf",20);
    
        SDL_Color noir={0,0,0};
        SDL_Color gris_clair={235,235,235};
        SDL_Color cyan={217,255,255};
    
        SDL_Surface*texte1=NULL,*texte2=NULL,*texte3=NULL,*texte4=NULL,*texte5=NULL,*texte6=NULL;
        SDL_Surface*texte7=NULL,*texte8=NULL,*texte9=NULL,*texte10=NULL,*texte11=NULL,*texte12=NULL,*texte13=NULL;
    
        const char* texteFichier=         " Fichier  ";
        const char* texteEdition=         " Edition ";
        const char* texteAffichage=       " Affichage ";
        const char* texteOutils=          " Outils ";
        const char* textecreer_un_dossier=" Créer un projet  ";
        const char* textecreer_une_image= " Créer une image ";
        const char* texteouvrir_un_projet=" Ouvrir un projet ";
        const char* texteouvrir_une_image=" Ouvrir une image";
        const char* texteenregistrer=     " Enregistrer       ";
        const char* texteenregistrer_sous=" Enregistrer sous";
        const char* textequitter=         " Quitter             ";
        const char* textecreer_la_tilemap=" Edition de la tilemap ";
        const char* textecreer_les_tiles= " Création des tiles    ";
    
        texte1=TTF_RenderText_Shaded(ttf_texte,texteFichier,noir,gris_clair);
        texte2=TTF_RenderText_Shaded(ttf_texte,texteEdition,noir,gris_clair);
        texte3=TTF_RenderText_Shaded(ttf_texte,texteAffichage,noir,gris_clair);
        texte4=TTF_RenderText_Shaded(ttf_texte,texteOutils,noir,gris_clair);
        texte5=TTF_RenderText_Shaded(ttf_texte,textecreer_un_dossier,noir,gris_clair);
        texte6=TTF_RenderText_Shaded(ttf_texte,textecreer_une_image,noir,gris_clair);
        texte7=TTF_RenderText_Shaded(ttf_texte,texteouvrir_un_projet,noir,gris_clair);
        texte8=TTF_RenderText_Shaded(ttf_texte,texteouvrir_une_image,noir,gris_clair);
        texte9=TTF_RenderText_Shaded(ttf_texte,texteenregistrer,noir,gris_clair);
        texte10=TTF_RenderText_Shaded(ttf_texte,texteenregistrer_sous,noir,gris_clair);
        texte11=TTF_RenderText_Shaded(ttf_texte,textequitter,noir,gris_clair);
        texte12=TTF_RenderText_Shaded(ttf_texte,textecreer_la_tilemap,noir,gris_clair);
        texte13=TTF_RenderText_Shaded(ttf_texte,textecreer_les_tiles,noir,gris_clair);
    
        SDL_Rect TEXTE1={0,10,texte1->w,texte1->h};
        SDL_Rect TEXTE2={TEXTE1.w+2,TEXTE1.y,texte2->w,texte2->h};
        SDL_Rect TEXTE3={TEXTE2.x+TEXTE2.w+2,TEXTE1.y,texte3->w,texte3->h};
        SDL_Rect TEXTE4={TEXTE3.x+TEXTE3.w+2,TEXTE1.y,texte4->w,texte4->h};
    
        SDL_Rect TEXTE5={0,27,texte5->w,texte5->h};
        SDL_Rect TEXTE6={0,TEXTE5.y+texte5->h,texte6->w,texte6->h};
        SDL_Rect TEXTE7={0,TEXTE6.y+texte6->h,texte7->w,texte7->h};
        SDL_Rect TEXTE8={0,TEXTE7.y+texte7->h,texte8->w,texte8->h};
        SDL_Rect TEXTE9={0,TEXTE8.y+texte8->h,texte9->w,texte9->h};
        SDL_Rect TEXTE10={0,TEXTE9.y+texte9->h,texte10->w,texte10->h};
        SDL_Rect TEXTE11={0,TEXTE10.y+texte10->h,texte11->w,texte11->h};
    
        SDL_Rect TEXTE12={47,TEXTE5.y,texte12->w,texte12->h};
        SDL_Rect TEXTE13={47,TEXTE5.y+texte12->h,texte13->w,texte13->h};
    
        SDL_Rect fond={0,0,2000,20+17};
        SDL_Rect background_edition={47,10,109,34};
    
        if(Collision(&curseur,&TEXTE1))
        {
            texte1=TTF_RenderText_Shaded(ttf_texte,texteFichier,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=1;
            }
        }
        if(Collision(&curseur,&TEXTE2))
        {
            texte2=TTF_RenderText_Shaded(ttf_texte,texteEdition,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=2;
            }
        }
    
        if((!Collision(&curseur,&TEXTE1))&&(!Collision(&curseur,&TEXTE5))&&(!Collision(&curseur,&TEXTE6))&&(!Collision(&curseur,&TEXTE7))&&(!Collision(&curseur,&TEXTE8))&&(!Collision(&curseur,&TEXTE9))&&(!Collision(&curseur,&TEXTE10))&&(!Collision(&curseur,&TEXTE11))&&(detect->tag==1))
        {
            detect->tag=0;
        }
        if((!Collision(&curseur,&TEXTE2))&&(!Collision(&curseur,&TEXTE12))&&(!Collision(&curseur,&TEXTE13))&&(detect->tag==2))
        {
            detect->tag=0;
        }
    
        if(detect->tag==1)
        {
            SDL_SetAlpha(texte5,SDL_SRCALPHA,255); // Opaque
            SDL_SetAlpha(texte6,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte7,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte8,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte9,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte10,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte11,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte12,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte13,SDL_SRCALPHA,0);
        }
        if(detect->tag==2)
        {
            SDL_SetAlpha(texte5,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte6,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte7,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte8,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte9,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte10,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte11,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte12,SDL_SRCALPHA,255);
            SDL_SetAlpha(texte13,SDL_SRCALPHA,255);
            SDL_FillRect(screen,&background_edition,SDL_MapRGB(screen->format,235,235,235));
        }
        if(detect->tag==0)
        {
            SDL_SetAlpha(texte5,SDL_SRCALPHA,0); // Transparent
            SDL_SetAlpha(texte6,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte7,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte8,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte9,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte10,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte11,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte12,SDL_SRCALPHA,0);
            SDL_SetAlpha(texte13,SDL_SRCALPHA,0);
        }
        if(Collision(&curseur,&TEXTE3))
        {
            texte3=TTF_RenderText_Shaded(ttf_texte,texteAffichage,noir,cyan);
        }
        if(Collision(&curseur,&TEXTE4))
        {
            texte4=TTF_RenderText_Shaded(ttf_texte,texteOutils,noir,cyan);
        }
        if((Collision(&curseur,&TEXTE5))&&(detect->tag==1))
        {
            texte5=TTF_RenderText_Shaded(ttf_texte,textecreer_un_dossier,noir,cyan);
            if(detect->value==1)
            {
                detect->check[0]=1;
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE6))&&(detect->tag==1))
        {
            texte6=TTF_RenderText_Shaded(ttf_texte,textecreer_une_image,noir,cyan);
            if(detect->value==1)
            {
                detect->check[1]=1;
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE7))&&(detect->tag==1))
        {
            texte7=TTF_RenderText_Shaded(ttf_texte,texteouvrir_un_projet,noir,cyan);
            if(detect->value==1)
            {
                detect->check[3]=1;
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE8))&&(detect->tag==1))
        {
            texte8=TTF_RenderText_Shaded(ttf_texte,texteouvrir_une_image,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE9))&&(detect->tag==1))
        {
            texte9=TTF_RenderText_Shaded(ttf_texte,texteenregistrer,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE10))&&(detect->tag==1))
        {
            texte10=TTF_RenderText_Shaded(ttf_texte,texteenregistrer_sous,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE11))&&(detect->tag==1))
        {
            texte11=TTF_RenderText_Shaded(ttf_texte,textequitter,noir,cyan);
            if(detect->value==1)
            {
                detect->tag=0;
                SDL_Quit();
                TTF_Quit();
                printf("\n%s",Accent("Merci d'avoir utilisé ce logiciel."));
    
            }
        }
        if((Collision(&curseur,&TEXTE12))&&(detect->tag==2))
        {
            texte12=TTF_RenderText_Shaded(ttf_texte,textecreer_la_tilemap,noir,cyan);
            if(detect->value==1)
            {
                detect->check[4]=1;
                detect->tag=0;
            }
        }
        if((Collision(&curseur,&TEXTE13))&&(detect->tag==2))
        {
            texte13=TTF_RenderText_Shaded(ttf_texte,textecreer_les_tiles,noir,cyan);
            if(detect->value==1)
            {
                detect->check[2]=1;
                detect->tag=0;
            }
        }
    
        SDL_FillRect(screen,&fond,SDL_MapRGB(screen->format,210,210,210));
        if(detect->tag==1)
            boxRGBA(screen,0,27,0+90,146,235,235,235,255);
    
        SDL_BlitSurface(texte1,NULL,screen,&TEXTE1);
        SDL_BlitSurface(texte2,NULL,screen,&TEXTE2);
        SDL_BlitSurface(texte3,NULL,screen,&TEXTE3);
        SDL_BlitSurface(texte4,NULL,screen,&TEXTE4);
        SDL_BlitSurface(texte5,NULL,screen,&TEXTE5);
        SDL_BlitSurface(texte6,NULL,screen,&TEXTE6);
        SDL_BlitSurface(texte7,NULL,screen,&TEXTE7);
        SDL_BlitSurface(texte8,NULL,screen,&TEXTE8);
        SDL_BlitSurface(texte9,NULL,screen,&TEXTE9);
        SDL_BlitSurface(texte10,NULL,screen,&TEXTE10);
        SDL_BlitSurface(texte11,NULL,screen,&TEXTE11);
        SDL_BlitSurface(texte12,NULL,screen,&TEXTE12);
        SDL_BlitSurface(texte13,NULL,screen,&TEXTE13);
        SDL_FreeSurface(texte1);
        SDL_FreeSurface(texte2);
        SDL_FreeSurface(texte3);
        SDL_FreeSurface(texte4);
        SDL_FreeSurface(texte5);
        SDL_FreeSurface(texte6);
        SDL_FreeSurface(texte7);
        SDL_FreeSurface(texte8);
        SDL_FreeSurface(texte9);
        SDL_FreeSurface(texte10);
        SDL_FreeSurface(texte11);
        SDL_FreeSurface(texte12);
        SDL_FreeSurface(texte13);
        TTF_CloseFont(ttf_texte);
        //printf("\ntag:%d",detect->tag);
        //printf("\nvalue:%d",detect->value);
    }

    L'erreur aurait lieu à cette ligne par exemple : texte1=TTF_RenderText_Shaded(ttf_texte,texteFichier,noir,gris_clair);

    Dans l'absolu je peux faire le code de manière brute mais j'aimerais bien ne pas me perdre dans mes propres lignes de code.

    Merci d'avance.




    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2020 à 18:59:50

      Hello,

      Quand je vois un TTF_OpenFont() dans une fonction, déjà je tique. Et quand il n'y a pas de TTF_CloseFont() avant de quitter la fonction.... (Bouton1)

      Et tous ces nombres magiques (un extrait): surface_table[2],NULL,surface_table[1],&rect_table[2]); SDL_BlitSurface(surface_table[3],NULL,surface_table[1],&rect_table[3]);

      Et tous ces texteX, pourquoi pas un tableau ?

      Bref, je crois que tu as mal pensé ton progamme. Pour ma part, ton code est incompréhensible (je sais, ce n'est pas constructif et ne t'aide pas à résoudre ton problème).

      -
      Edité par edgarjacobs 19 février 2020 à 19:01:01

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        19 février 2020 à 19:05:03

        Avant de se lancer dans ce genre de truc, ce serait bien d'apprendre à utiliser les tableaux : 

        Ces deux lignes peuvent être remplacées par

        SDL_Surface*texte1=NULL,*texte2=NULL,*texte3=NULL,*texte4=NULL,*texte5=NULL,*texte6=NULL;
        SDL_Surface*texte7=NULL,*texte8=NULL,*texte9=NULL,*texte10=NULL,*texte11=NULL,*texte12=NULL,*texte13=NULL;
        SDL *texte[11] = {NULL};
        Ensuite tu boucles sur les texte[i] avec une boucle for.
        • Partager sur Facebook
        • Partager sur Twitter

        Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

          20 février 2020 à 14:48:23

          Croyez le ou non mais vos conseils m'ont permis d'alléger un peu le programme et effectivement, c'était bien la fonction pour fermer le ttf (TTFClose) qui manquait.

          Qui l'eu cru, on a beau vouloir être le meilleur, mais on peut aussi bien réussir mais ne pas optimiser que de vouloir bien faire et être bête comme un balai (je parle de moi).

          Bah merci du coup, je peux ainsi mettre ce sujet en résolu.

          -
          Edité par ReunanBeauvois 20 février 2020 à 14:49:12

          • Partager sur Facebook
          • Partager sur Twitter

          Conflit entre deux fonctions

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown