Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plantage de la page avec SDL

Sujet résolu
    15 septembre 2020 à 19:18:22

    Bonjour,

    Je pense que ce poste à déjà été crée et si c'est la cas j'en suis navré. J'ai fait pasmal de recherche mais je commence à saturer.

    Voila mon problème, j'ai crée une fenêtre sur laquelle je fait évoluer un personnage.

    J'avais effectuer un premier jet en CMD, mon programme marchais parfaitement bien. Depuis peu, je suis passer en 2D en utilisant les même lignes de codes que celui du CMD sauf pour l'affichage. Mais au bout de quelques seconde de jeu, le programme plante. Je code actuellement sous neatbeans et je ne sais pas trop comment gérer les erreurs. J'ai donc décider de tenter de lancer le programme en mode débugueur (sans point d'arrêt) et le programme m'annonce qu'il y a eu un segementation défault.

    D'après ce que j'ai pu voir sur les forum, certain dise que cela peu venir que le "event" s'empile sans jamais être dépiler ce qui justifie l'erreur mais je n'ai pas trouver d'autre information à ce propos.

    Si vous voulez, je peux vous passer le code mais c'est pas très propre c'est pas commanter et il y a beaucoup de ligne... et j'oubliais que pour la compilation c'est pas éviendent surtout que j' n'utilise pas une version ressente de SDL j'utilise la version 1.2.13.

    De plus, (je pense que le problème est lier) je n'arrive pas à lancer le ".exe" sans passer par l'IDE. Je suis ouvert à toutes propositions car actuellement, à cause de ca je vais devoir mettre un peu en pause mon programme, cela ne sert à rien de programmer avec une telle erreur...

    En vous remerciant (je suis toujours a disposition pour donner des informations complémentaire).

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 septembre 2020 à 7:35:52

      Salut,

      Pourrais-tu préciser où la segmentation fault arrive, il se peut que ce soit de ton côté (chargement à l'infini de sources par exemple, c'est assez courant au début de SDL ^^). Si tu as un code à montrer (surtout les variables utilisé pour les textures)

      Le faite que tu ne puisses pas lancé le .exe depuis ton explorateur de fichier est surement causé par le fait de le lancé depuis un nouvelle endroit (les programmes ont un chemin relatif dépendant de l'endroit d'où on les lancent). Il doit manquer des textures lors du chargement et ça crash.

      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2020 à 10:22:34

        Bonjour,

        Alors pour ce qui du chargement infini, je ne vois pas comment le vérifier. Comment puis-je te faire passer mon code ? (du moins la partie concernée)

        Le point d'arrêt du debugueur semble se trouver lorsque que je prepart un "rectangle" (pas initialiser mais bien préparer)

        Pour ce qui est de l'exe, le programme a l'aire de se lancer mais il s'arrête immédiatement, comme si il crashais et je suis aller vois dans mon "log" (les printf) et tout semble fonctionner correctemekt 😅 (genre ouverture de fichier et initiatialisation des éléments)

        -
        Edité par VictorBravo 16 septembre 2020 à 10:23:44

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 septembre 2020 à 11:02:01

          Tu peux utiliser l'outil code ( </> ) pour poster ton code.

          Pour vérifier le chargement à l'infini peut se voir avec le task manager de Windows avec la RAM qui augmente continuellement. Ici je ne penses pas qu'on le verra car on a l'air d'écrire là où il ne faut pas dans la mémoire.

          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2020 à 11:42:03

            #include <stdio.h>
            #include <stdlib.h>
            
            
            #include "time.h"
            #include "string.h"
            #include "math.h"
            
            #include "type_map.h"
            //#include "personnage.h"
            #include "ajout_arbre.h"
            //#include "affichage.h"
            #include "type_personnage.h"
            #include "blocs.h"
            #include "biomes.h"
            #include "type_minerais.h"
            #include "liquide.h"
            
            #include "affichage_2D.h"
            #include "personnage_2D.h"
            
            
            int main(int argc, char** argv)
            {
                
                    SDL_Surface *ecran;
                    SDL_Event event;
                    
                    
                    
                    
                
                    //int graine = time(NULL);
                    int graine =  159602223;
                    int continu = 1;
            	srand(graine);
                    int pause = 0;
                    
                    //printf("graine : %d \n",graine);
                    //srand(2);
                    
                    biomes bio;
                    
            	map m;
                    
                    init_biomes (bio);
                    init_arbre_biome(bio);
                    //arbre a;
                    texture_blocs t;
                    blocs b;
                    crafts c;
                    filon_biomes filon;
                    
                   
                    
                    coffres coff;
                    sources s;
                    
                    
                    
                if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
                {
                    printf("Erreur impossible d'initialiser la SDl \n");
                }
                else
                {
                    
                    
                    ecran = SDL_SetVideoMode(LONGUEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE | SDL_SWSURFACE |SDL_DOUBLEBUF);
                    SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"), NULL);
                    SDL_WM_SetCaption("jeu blocs !", NULL);
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 43,147,255));
                
                
                    init_craft(c);
                    init_coffre(&coff);
                    init_nom_blocs (b);
                    init_texture(t);
            	init_map(&m);
                    init_filon(filon);
                    init_source(&s);
                    
                    //printf("init ok \n");
                    
                    generer_map (&m,bio,filon);
            	
                    
                    //printf("generer map ok \n");
                    
            	personnage p;
            	init_perso (m,&p);
                    
                    //init_arbre (&a);
                    //placer_arbre(&a,&m);
                    //afficher_arbre(a);
                    
                    //printf("id : %s \n",b[15].nom);
                    //afficher_map(m,t);
                    
                    afficher_perso_sur_map_2D(m,&p,b,ecran);
            	//afficher_perso_sur_map(m,&p,t,b);
                    //printf("coff.nb_coffre : %d \n",coff.nb_coffre);
            	
            	while (continu == 1)
            	{
                        
                            //afficher_ensemble_source (s);
            		//controle (&m,&p,b,c,&coff,&s);
                            //bouger_liquide(&m,b,s);
                            //stoper_liquide (&m,b,s);
            		//afficher_perso_sur_map(m,&p,t,b);
                            SDL_PollEvent (&event);
                            if (event.type == SDL_QUIT)
                            {
                                continu = 0;
                            }
                            else if (event.type == SDL_KEYDOWN)
                            {
                                controle_2D (&m,&p,b,c,&coff,&s,&event,&continu,ecran);
                                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 43,147,255));
                                afficher_perso_sur_map_2D(m,&p,b,ecran);
                                
                                
                            }
                            
                            SDL_Flip(ecran);
            	}
            	
                    
            	//printf("ok");
                    
                    SDL_FreeSurface(ecran);
                    SDL_Quit();
                }
            	return 0;
                
            }
            
            
            #include "personnage_2D.h"
            
            void controle_2D (map *m, personnage *p,blocs b, crafts c, coffres *coff,sources *s ,SDL_Event *event, int *continu, SDL_Surface *ecran)
            {
                int pause = 0;
                
                switch (event->key.keysym.sym)
                {
                    case SDLK_ESCAPE :
                        pause = 1;
                        while (pause == 1)
                        {
                            SDL_WaitEvent(event);
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0,0,0));
                            SDL_Flip(ecran);
                                    
                            if (event->type == SDL_KEYDOWN && event->key.keysym.sym == SDLK_ESCAPE)
                            {
                                pause = 0;
                                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 43,147,255));
                                SDL_Flip(ecran);
                                
                            }
                            else if (event->type == SDL_QUIT)
                            {
                                pause = 0;
                                continu = 0;
                            }
                        
                        }
                        break;
                    case SDLK_w : //sauter la touche "z"
                        if (m->terrain[(int)floorf(p->posi.y+2.0)][(int)floorf(p->posi.x+1)] == 0 && m->terrain[(int)floorf(p->posi.y+2.0)][(int)(p->posi.x+1)] == 0 && p->posi.y +3 < HAUTEUR)
                        {
                            p->a = SAUTER;
                            p->posi.y += 0.1;
                        }
                    break;
                    case SDLK_d : //avancer la tocuhe "d"
                        if (m->terrain[(int)floorf(p->posi.y+1)][(int)floorf(p->posi.x+1.0)] == 0 && m->terrain[(int)floorf(p->posi.y)][(int)floorf(p->posi.x+1.0)] == 0)
                        {
                            p->a = AVANCER;
                            p->posi.x += 0.1;
                        }
                    break;
                    case SDLK_a :
                        if (m->terrain[(int)floorf(p->posi.y+1)][(int)floorf(p->posi.x-0.1)] == 0 && m->terrain[(int)floorf(p->posi.y)][(int)floorf(p->posi.x-0.1)] == 0 )
                        {
                            p->a = RECULER;
                            p->posi.x -= 0.1;
                        }
                    break;
                    
                    
                }
                if(p->a != SAUTER)
                {
                    while (m->terrain[(int)(p->posi.y-0.1)][(int)(p->posi.x+1)] == 0 && m->terrain[(int)(p->posi.y-0.1)][(int)floorf(p->posi.x+1)] == 0)
                    {
                        p->posi.y-=0.1;
                    }
                }
            }
            
            
            #include "affichage_2D.h"
            
            
            void afficher_perso_sur_map_2D(map m,personnage *p, blocs b, SDL_Surface *ecran)
            {
                int j_debut = 0;
                int i_debut = 0;
                
                int j_fin = 0;
                int i_fin = 0;
                
                int i = 0;
                int j = 0;
                
                char adresse[15];
                char *dossier = "texture/";
                char *extension = ".bmp";
                
                SDL_Surface *cube = NULL;
                
                SDL_Rect posi;
                posi.x = 0;
                posi.y = 0;
                
                cube = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SWSURFACE |SDL_DOUBLEBUF, 30, 30, 32, 0, 0, 0, 0);
                
                
                
                
                if (p->posi.x-(LONGUEUR_FENETRE/30)/2 < 0)
                {
                    i_debut = 0;
                    i_fin = (LONGUEUR_FENETRE/30);
                }
                else if(p->posi.x + (LONGUEUR_FENETRE/30)/2 > LONGUEUR)
                {
                    i_debut = LONGUEUR - (LONGUEUR_FENETRE/30);
                    i_fin = LONGUEUR-1;
                }
                else
                {
                    i_debut = (p->posi.x +2) - (LONGUEUR_FENETRE/30)/2;
                    i_fin = (p->posi.x + 2) + (LONGUEUR_FENETRE/30)/2;
                }
                
                if (p->posi.y- (HAUTEUR_FENETRE/30)/2 < 0)
                {
                    j_debut = 0;
                    j_fin = (HAUTEUR_FENETRE/30);
                }
                else if(p->posi.y+(HAUTEUR_FENETRE/30)/2 > HAUTEUR)
                {
                    j_debut = HAUTEUR - (HAUTEUR_FENETRE/30);
                    j_fin = (HAUTEUR_FENETRE/30);
                }
                else
                {
                    j_debut = p->posi.y - (HAUTEUR_FENETRE/30)/2;
                    j_fin = p->posi.y + (HAUTEUR_FENETRE/30)/2;
                }
                
                
                for (i = i_debut; i < i_fin; i++)
                {
                   for (j = j_fin-1; j >= j_debut; j--)
                    {
                       
                          
                       
                        if (m.terrain[j][i] != 0 && m.terrain[j][i] != 3)
                       {
                            sprintf(adresse,"%s%d%s",dossier,m.terrain[j][i],extension);
                            cube =  SDL_LoadBMP(adresse);
                            SDL_BlitSurface(cube, NULL, ecran, &posi);
                            
                       }
                       else if (m.terrain[j][i] == 3)
                       {
                           sprintf(adresse,"%s%d%s",dossier,m.terrain[j][i],extension);
                           cube =  SDL_LoadBMP(adresse);
                           
                           SDL_SetColorKey(cube, SDL_SRCCOLORKEY, SDL_MapRGB(cube->format, 255, 0, 0));
                           SDL_BlitSurface(cube, NULL, ecran, &posi);
                       }
                       
                       
                       if ( i == p->posi.x+1 && j == p->posi.y && m.terrain[j][i] != 0 && p->vue == MILIEU)
                       {
                           sprintf(adresse,"%s%s","curseur",extension);
                           cube =  SDL_LoadBMP(adresse);
                           
                           SDL_SetColorKey(cube, SDL_SRCCOLORKEY, SDL_MapRGB(cube->format, 255, 255, 255));
                           SDL_BlitSurface(cube, NULL, ecran, &posi);
                       }
                       
                       posi.y += 30;
                    }
                   posi.y = 0;
                   posi.x += 30;
                }
                
                
                sprintf(adresse,"%s%s","personnage",extension);
                cube =  SDL_LoadBMP(adresse);
                //posi.x = 30.0 * p->posi.x;
                
                if (p->posi.x*30.0 + LONGUEUR_FENETRE/2 > HAUTEUR*30)
                {
                    posi.x = (LONGUEUR - p->posi.x)*30.0;
                }
                else if (p->posi.x*30.0 - LONGUEUR_FENETRE/2 < 0)
                {
                    posi.x =  p->posi.x*30.0;
                }
                else
                {
                    posi.x = (LONGUEUR_FENETRE/2.0-30.0*2.0) + ((p->posi.x - (int) p->posi.x))*30.0; 
                }
                
                
                
                
                
                
                if (p->posi.y*30.0 + HAUTEUR_FENETRE/2 > HAUTEUR*30)
                {
                    posi.y = ((float)HAUTEUR - p->posi.y)*30.0;
                }
                else if (p->posi.y*30.0 - HAUTEUR_FENETRE/2 < 0)
                {
                    posi.y = ((float)(HAUTEUR_FENETRE/30) - p->posi.y)*30.0-30*2;
                }
                else
                {
                    posi.y = (HAUTEUR_FENETRE/2-30.0*2.0) - ((float)(p->posi.y - (int) p->posi.y)) * 30.0;
                }
                
                //posi.x = 30;
                //posi.y = 300;
                //posi.y = p->posi.y*30;
                SDL_SetColorKey(cube, SDL_SRCCOLORKEY, SDL_MapRGB(cube->format, 255, 255, 255));
                SDL_BlitSurface(cube, NULL, ecran, &posi);
                
                
                
                SDL_FreeSurface(cube);
                
                
                        
            }



            -
            Edité par VictorBravo 16 septembre 2020 à 11:55:51

            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2020 à 11:53:01

              Idéalement il nous faudrait tout le code, mais comme ça a première vue je pari que cube est NULL (ou qu'il a été free par erreur).
              • Partager sur Facebook
              • Partager sur Twitter
                16 septembre 2020 à 12:00:08

                Normalement ke code est ci dessus (j'ai un peut galérer à mettre en place)

                Et le programme marche un certain temps.

                -
                Edité par VictorBravo 16 septembre 2020 à 12:01:31

                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2020 à 12:23:24

                  Tu charges tes textures en plein milieu du jeu et a chaque tour de boucle quasiment, tu devrais les charger une fois pour toute au début du programme puis les libérer a la fin plutot que de le faire a tous les tours de boucle, ca n'a aucun interet.

                  Concernant ton problème, regarde le retour du pointeur après avoir chargé ta texture, car la, si le chargement échoue pour une raison quelconque, tu ne le vérifie pas, et si le chargement échoue ton pointeur sera null, et l'utiliser derrière amènera forcément a un crash.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 septembre 2020 à 12:46:26

                    Et si il échoue, cela peut venir d'ou ?

                    J'ai fait un 1er essaye (je poursuivrais ce soir) mais pour le moment, rien de bien concluant. Après avoir affecter cube, j'ai fait afficher sa valeur et elle n'est jamais à 0. Ci dessous, le résultat des dernier lignes de mon printf du "cube" ajouter à la ligne 105.

                    "cube : 1950007112
                    cube : 1950030584
                    cube : 1950053696
                    cube : 1950080480
                    cube : 1950106112
                    cube : 1949995376
                    cube : 1972157656
                    cube : 1972182784
                    cube : 1972208272
                    cube : 1972231024
                    cube : 1972256080
                    cube : 15075304
                    cube : 15099136
                    cube : 15122896
                    cube : 15143128
                    cube : 15166528
                    cube : 15188416
                    cube : 1858468384
                    cube : 1858492936
                    cube : 1858514968
                    cube : 1858540744
                    cube : 1858566448
                    cube : 1858589344
                    cube : 1932341496
                    cube : 1932365688
                    cube : 1932391536
                    cube : 1932413496
                    cube : 1932440208
                    cube : 2145323344
                    cube : 2145348400
                    cube : 2145371800
                    cube : 2145397144
                    cube : 2145423064
                    cube : 2145445744
                    cube : 1631010352
                    cube : 1631033032
                    cube : 1631055928
                    cube : 1631080048
                    cube : 1631101432
                    cube : 1630989184
                    cube : 1973202544
                    cube : 1973226232
                    cube : 1973249920
                    cube : 1973274328
                    cube : 1973298880
                    cube : 1933398488
                    cube : 1933423976
                    cube : 1933445432
                    cube : 1933471712
                    cube : 1933497560
                    cube : 1933389704 "

                    -
                    Edité par VictorBravo 16 septembre 2020 à 12:53:44

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2020 à 12:59:33

                      Il faut voir sa valeur au moment du crash surtout.

                      Et le mieux, c'est simplement d'utiliser un debugger pour voir quand il crash et pourquoi il crash surtout.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 septembre 2020 à 13:02:54

                        pour toi, je dois surveiller quelles variable/pointeur ? (je ferais les essaie ce soir)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 septembre 2020 à 13:05:50

                          Bah personnellement je le ferais crasher et je regarderais la variable qui est en cause du crash, puis je remonterais jusqu'au moment ou cette variable a pris une mauvaise valeur et je chercherais a comprendre pourquoi. par exemple si c'est bien cube qui est en cause il se peut que ce soit juste le chargement qui a échoué.

                          Pourquoi ? je ne sais pas je ne suis pas devin, il faut regarder les messages d'erreurs dans ta console.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 septembre 2020 à 16:24:51

                            Je n'ai pas de message d'erreur dans la console c'est mon plus gros problème mais je vais suivre tes conseils et essayer de voir si une valeur tombe à null alors qu'il ne devrais pas si non je crois que je vais encore stagner un moment sur ce problème ^^' dans tout les cas, merci de votre aide !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 septembre 2020 à 17:22:13

                              Hello,

                              Ton printf() est en ligne 105, mais tu charges cube à l'intérieur des for() des lignes 63 et 65. Et tu ne libères jamais cube quand tu n'en as plus besoin (au minimum, sans fouiller trop profond dans ton code, après les lignes 74, 83 et 93). Au cas où tu l'ignores, faire un SDL_LoadBMP() crée une nouvelle surface, donc ton programme va consommer allègrement de la mémoire jusqu'à ce qu'il n'y en ai plus.

                              -
                              Edité par edgarjacobs 16 septembre 2020 à 17:27:20

                              • 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

                                16 septembre 2020 à 17:35:23

                                J'effectue un free_Surfance(cube) ligne 147 c'est pas suffisant tu penses ?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 septembre 2020 à 17:36:59

                                  Non. Relis mon post.
                                  • 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

                                    16 septembre 2020 à 17:39:14

                                    A oui je viens de comprendre. Je pensais pas que LoadBMP allouais de la mémoire supplémentaire et si c'est ca peux justifier mon segmentation défault

                                    je vais regarder cela et je te tiens au courant.

                                    Merci de ton aide !

                                    Bon me problème à l'aire régler de fonctionner (du moins dans ma configuration actuelle ca ne plante plus pour le moment. Merci a toi adgarjacobs

                                    -
                                    Edité par VictorBravo 16 septembre 2020 à 17:51:49

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 septembre 2020 à 17:54:37

                                      LoadBMP alloue une surface et te retourne un pointeur sur celle ci. Il est a ta charge de libérer ce pointeur.

                                      Chaque allocation faite doit etre libérée, donc si tu fais 15 LoadBMP tu dois faire 15 free.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        16 septembre 2020 à 18:39:03

                                        Attention avec "cube" tu ne vérifie jamais si cube est null, ce qui témoignerait d'une erreur lors du chargement. Si tu ne test pas ton pointeur tu as possibilité d'envoyer le pointeur null dans ton code et c'est vraiment pas bon :/

                                        Pour ce qui est de charger intelligemment les textures on va programmer orienté module (un module = une fonctionnalité / lot de fonctionnalités).

                                        Dans affichage.c tu peux déclarer un tableau global statique, pour le partager à travers toutes tes fonctions et le garder privé. Ce tableau te servira à mettre tous tes pointeurs de textures utiliser. Tu dois donc les charger avec le init du module et les décharger avec de_init du même module. C'est un façon de faire très puissante de faire du code, même si un peu lourde (on est assez proche du fonctionnement objet du C++, en version plus archaïque xD ... et sans la surcharge T-T )

                                        -
                                        Edité par Anonyme 16 septembre 2020 à 18:40:21

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 septembre 2020 à 19:29:16

                                          Merci de l'information BrigitteLPM mais le problème actuellement c'est que je ne sais pas vraiment faire de la programmation orienter objet, mais j'en prends bonne note pour mes futur mise à jours !

                                          mais il est vrai que plus ca va et plus je me rend compte que c'est assez lourd à charger les textures (en théorie car en pratique je vois pas de problème pour le moment)

                                          Et pour ce qui est de la gestion d'erreur, il y a pas mal d'endroit ou c'est très mal gérer et qu'il va faloir que je m'y mette.



                                          Pour ceux/celle qui voudrais savoir, je laisse une petite capture d'écran de ce que je suis entrain de faire :

                                          (je tiens à préciser que malgré le visuel simple à l'heure actuelle, le code est bien plus complexe de base, je passe à la 2D depuis moins d'un mois mais beaucoup de chose on été préparer prés 2D comme la génération du terrain)

                                          -
                                          Edité par VictorBravo 16 septembre 2020 à 19:31:01

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            16 septembre 2020 à 22:45:15

                                            VictorBravo a écrit:

                                            Merci de l'information BrigitteLPB mais le problème actuellement c'est que je ne sais pas vraiment faire de la programmation orienter objet, mais j'en prends bonne note pour mes futur mise à jours !

                                            Edité par VictorBravo il y a environ 1 heure

                                            Ce n'est pas de la programmation orienté, ça en est proche : par exemple on ne peut pas instancier (ou avec grande difficulté)

                                            voici un exemple avec un parking :

                                            // .h
                                            
                                            void Parking_init(int nbr_place);
                                            
                                            int Parking_size();
                                            
                                            void Parking_addCar(Car *car);
                                            
                                            void Parking_removeLastCar();
                                            void Parking_free();
                                            // .c
                                            
                                            static int m_place;
                                            static int m_size;
                                            static Car **parking;
                                            
                                            void Parking_init(int nbr_place){
                                               parking = malloc(sizeof(Car*)*nbr_place);
                                               m_place = nbr_place;
                                               m_size = 0;
                                            }
                                            
                                            void Parking_size(){
                                               return m_size;
                                            }
                                            
                                            void Parking_addCar(Car* car){
                                                if(m_size != m_place){
                                                   parking[m_size] = car;
                                                   m_size++;
                                                }
                                            }
                                            
                                            void Parking_removeLastCar(){
                                               if(m_size > 0){
                                                  m_size--;
                                                  // on s'occupe pas de décharger
                                               }
                                            }
                                            
                                            void Parking_free(){
                                               free(parking);
                                            }

                                            Bon l'exemple est un peu inutile... et incomplet mais le principe est là.

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Plantage de la page avec SDL

                                            × 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