IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Déplacement de robot - code à corriger


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Déplacement de robot - code à corriger
    Déplacer un robot, dans une grille cellulaire de taille 15*15, partant d’un point de départ (donné) jusque un point d’arrivé (donné aussi).
    Et le déplacement d’une cellule à une autre se fait par un choix aléatoire dans le voisinage de cette cellule (les 8 cellules tournant de cette cellule).
    Le robot se déplace pas à pas.
    Une cellule a les coordonnées (x, y).
    Le déplacement d’une cellule à une autre se fait de telle façon que :
    x2<=x1<=x, et y2<=y1<=y (dans le cas où les coordonnées de cellule de départ supérieur aux celles d’arrivées).

    (x1, y1) : coordonnées de cellule courante.
    (x, y) : coordonnées de cellule de départ.
    (x2, y2) : coordonnées de cellule d’arrivée.
    J’ai une fonction mais je ne sais pas si elle est correcte ou non, parce que quand je l’ai testé le programme cesse de fonctionner.
    voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    void deplacer_agent(float **g, int *px,int *py,int *px2,int *py2,bool ** cd,int dep1,int tg, bool *init)
    {
        int k;
     
     
        if((&px2>&px) && (&py2>&py))
        {
            k=*px;
            *px=*px2;
            *px2=k;
        }
     
        if(*init&&*px!=-1&&*py!=-1)
        {
     
            cd[*px][*py]=false;
            *init=false;
        }
     
        else
        {
            if(*init&&*px==-1&&*py==-1)
     
            {
     
                *px=rand() %10;
                *py=rand() %10;
                cd[*px][*py]=false;
                *init=false;
            }
            else
            {
                int px1=*px;
                int py1=*py;
     
                if(dep1==-1)
                {
     
                    px1=*px;
                    py1=*py;
                    int compt=0;
                    while(((px1<0||px1>tg-1||py1<0||py1>tg-1)||((dep1==-1)) )&&compt<20)
                    {
     
                        compt++;
                        px1=*px;
                        py1=*py;
     
                        do
                        {
                            dep1=rand() %8;
                            {
                                if(dep1==0 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1-1; }
                                if(dep1==1 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1-1;px1=px1-1;}
                                if(dep1==2 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){px1=px1-1;}
                                if(dep1==3 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1+1;px1=px1-1;}
                                if(dep1==4 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1+1;}
                                if(dep1==5 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1+1;px1=px1+1;}
                                if(dep1==6 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){px1=px1+1;}
                                if(dep1==7 && (*px2<=px1<=*px) && (*py2<=py1<=*py)){py1=py1-1;px1=px1+1;}
                            }
                        }
                        while((*px2<=px1<=*px) && (*py2<=py1<=*py));
     
                        if(px1>=0&&px1<=tg-1&&py1>=0&&py1<=tg-1)
                        {
                            if(!cd[px1][py1]){px1=-1;py1=-1;}
                        }
     
     
                    }
                    if(px1>=0&&px1<=tg-1&&py1>=0&&py1<=tg-1)
                        {cd[px1][py1]=false;*px=px1;*py=py1;   }
                    else
                        {*px=-1; *py=-1; }
     
                }
            }
        }
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J’ai une fonction mais je ne sais pas si elle est correcte ou non, parce que quand je l’ai testé le programme cesse de fonctionner.
    Donc, votre fonction est fausse ,car elle entraine le crash (erreur de segmentation) du programme. Il faut maintenant la déboguer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((&px2>&px) && (&py2>&py))
    Ceci est ultra étrange. Je pense que vous maitrisez les pointeurs : http://chgi.developpez.com/pointeur/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*init&&*px==-1&&*py==-1)
    Vous testez si *init ET *px est "vrai" (souvent != 0) et le résultat, soit "vrai", soit "faux", vous le comparez à -1. Ce qui est totalement plus que totalement incorrect.

    Pour faire votre algorithme, commencez par l'écrire (son comportement) sur une feuille de papier.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A priori, un crash, c'est quasiment toujours un *NULL ou un free() d'un pointeur déjà libéré.

    Comme ton code est bourré de pointeur, le problème vient de là.

    Je te recommande fortement d'utiliser une structure de position
    typedef struct position {
    int x, y;
    } position;

    Tu as trop de pointeurs.
    Seul les variables sur d'énorme structures (pointeurs constants) et les arguments à modifier (pointeurs non-constants) devraient être passé par pointeurs.
    Pour les tableaux, je recommande d'utiliser la notation [] dans les arguments.

    void deplacer_agent(float **g, int *px,int *py,int *px2,int *py2,bool ** cd,int dep1,int tg, bool *init)devrait être
    void deplacer_agent(float const grille[][], int const taille_grille, position actuelle, position const cible, position const source, bool const cd[][], int dep1, bool *init).
    Et encore, je ne comprends ni init, ni cd ni dep1, les noms sont mal donné.

    N'hésite jamais à marquer const tout argument un peu complexe (tableau, structure, pointeur) qui n'a pas vocation à être modifié.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    En plus des commentaires précédents : lorsque tu écris cela : (*px2<=px1<=*px) tu veux vérifier que px1 est compris entre *px2 et *px ? Si oui, il faut que tu sépares ça en deux tests distincts.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Comme ton code est bourré de pointeur, le problème vient de là.
    Tu as trop de pointeurs.
    Voilà cette fonction (deplacer_agent) qui travaille sans problèmes portant qu’elle utilise plusieurs pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    void deplacer_agent(float **g, int *px,int *py,bool ** cd,int dep1,int tg, bool *init)
    {
     
        if(*init&&*px!=-1&&*py!=-1)
        {
           cd[*px][*py]=false;
           *init=false;
     
        }
        else
        {
            if(*init&&*px==-1&&*py==-1)
            {
              *px=rand() %10;
              *py=rand() %10;
              cd[*px][*py]=false;
              *init=false;
              }
              else
              {
     
             int px1=*px;
               int py1=*py;
     
     
            if(dep1==-1)
              {
               px1=*px;
               py1=*py;
               int compt=0;
        while(((px1<0||px1>tg-1||py1<0||py1>tg-1)||((dep1==-1)) )&&compt<20)
                    {
     
                   compt++;
               px1=*px;
               py1=*py;
                      dep1=rand() %8;
            if(dep1==0){py1=py1-1; }
            if(dep1==1){py1=py1-1;px1=px1-1;}
            if(dep1==2){px1=px1-1;}
            if(dep1==3){py1=py1+1;px1=px1-1;}
            if(dep1==4){py1=py1+1;}
            if(dep1==5){py1=py1+1;px1=px1+1;}
            if(dep1==6){px1=px1+1;}
            if(dep1==7){py1=py1-1;px1=px1+1;}
     
            if(px1>=0&&px1<=tg-1&&py1>=0&&py1<=tg-1)
            {
            if(!cd[px1][py1]){px1=-1;py1=-1;}
            }
     
     
     
                    }
          if(px1>=0&&px1<=tg-1&&py1>=0&&py1<=tg-1)
            {cd[px1][py1]=false;*px=px1;*py=py1;   }
          else
            {*px=-1; *py=-1; }
     
               }
     
     
        }
    }
    }
    En fait la fonction deplacer_agent2 () c’est la fonction deplacer_agent () avec modification, j’essaie de la modifier pour arriver à programmer le problème écrite dans la discussion.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    On va jouer à un jeu.
    Tu vas donner de vrais noms à chaque variable et surtout à chaque paramètre.

    Et en plus, tu as un devoir supplémentaire:
    tu nous fais la liste des variables de l'utilisateur de la fonction qui doivent être modifiés par l'appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if(dep1==0){py1=py1-1; }
            if(dep1==1){py1=py1-1;px1=px1-1;}
            if(dep1==2){px1=px1-1;}
            if(dep1==3){py1=py1+1;px1=px1-1;}
            if(dep1==4){py1=py1+1;}
    Ca, c'est très très moche.
    Ca se remplace par un switch sur dep1, et surtout un commentaire avant, genre, "faire un déplacement".

    et puis px1 devrait probablement etre source_x, dest_x ou current_x
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    De plus, on dirait que tu fais un effort pour réduire la lisibilité de ton code. Les espaces coûtent cher, chez toi?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. corrige mon code svp
    Par NAIMA2 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/02/2007, 09h51
  2. Réponses: 8
    Dernier message: 16/01/2007, 11h06
  3. [Formulaire] Code Bouton déplacement
    Par popo68 dans le forum IHM
    Réponses: 2
    Dernier message: 06/12/2006, 13h59
  4. [débutant] déplacement d'un robot
    Par Sébastien L dans le forum Langage
    Réponses: 5
    Dernier message: 27/10/2006, 17h05
  5. [GD] Code graphique anti robot
    Par miel_pops dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 03/03/2005, 00h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo