Code à corriger

Fermé
149_67 Messages postés 18 Date d'inscription dimanche 1 décembre 2013 Statut Membre Dernière intervention 26 septembre 2014 - 12 sept. 2014 à 12:20
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 oct. 2014 à 21:38
Bonjour,
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:


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;
}

}
}
}
}

A voir également:

2 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 090
12 sept. 2014 à 13:18
Bonjour 149_67,

As-tu toi même programmé ce code ?

Si oui, peux-tu nous expliquer :

- l'algorithme que tu implémentes pour résoudre le problème qui t'es soumis
- ce que fait cette fonction par rapport à cet algorithme
- le prototype de cette fonction, en expliquant ce que contient chaque argument et à quoi il sert

et fournir une structure de données, des données et un exemple de programme appelant cette fonction et causant l'erreur que tu signales, en indiquant précisément le message d'erreur qui s'affiche, ton compilateur et ta plateforme.

Peut-être que quelqu'un, sur le forum, pourra alors te donner des indications.

Sinon, là, en l'état, ton message ressemble plus à : "j'ai un travail à faire, j'ai trouvé un code quelque part, mais (je n'arrive pas le faire marcher | il ne semble pas fonctionner | je ne le comprends pas), aidez moi à faire ce travail à ma place".


Dal
0
149_67 Messages postés 18 Date d'inscription dimanche 1 décembre 2013 Statut Membre Dernière intervention 26 septembre 2014
14 sept. 2014 à 10:46
Oui ce n'est pas moi qui écris ce code là.
En fait j'ai une fonction qui fait une partie de ce travail donc je la modifie pour arriver à résoudre le problème écrit dans la discussion.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
12 sept. 2014 à 13:25
Bonjour,

J'ai lu en diagonale :

if((&px2>&px) && (&py2>&py))
Ce n'est pas & qu'il faut mettre mais *.

if(dep1==0 && (*px2<=px1<=*px) &&
Ce n'est pas bon a<b<c. Il faut tester : a<b && b < c.

Sinon plutôt que faire :
if (depth==1 && C1 && C2)
...
if (depth==2 && C1 && C2)
...
if (depth==3 && C1 && C2)
...
etc.

Ca serait plus lisible (et maintenable) de faire :
if (C1 && C2) {
     switch(depth) {
          case 1 :
               ...
               break;
          case 2 :
               ...
               break;
          case 3 :
               ...
               break;
     }
}

L'idée est de n'écrire qu'une fois la condition C1 et C2 plutôt que de la répéter à chaque fois.
0
149_67 Messages postés 18 Date d'inscription dimanche 1 décembre 2013 Statut Membre Dernière intervention 26 septembre 2014
14 sept. 2014 à 11:36
Merci pour les remarques, mais ça ne servait à rien appart la lisibilité du programme :(


void deplacer_agent2(float **grille, int *px,int *py,int *px2,int *py2,bool ** cd,int dep1,int taille_grille,bool *init)

{
int k;
bool test;

    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>taille_grille-1 || py1<0 || py1>taille_grille-1) || ((dep1==-1)) ) && compt<20)
                {

           compt++;
           px1=*px;
           py1=*py;

do
{
        dep1=rand() %8;

        switch(dep1)
    {
        /* si dep1 == 0 */
        case 0:
            {py1=py1-1; }
            break;

        /* si dep1 == 1 */
        case 1:
            {
            py1=py1-1;
            px1=px1-1;
            }
            break;

        /* si dep1 == 2 */
        case 2:
            {px1=px1-1;}
            break;

        /* si dep1 == 3 */
        case 3:
            {
            py1=py1+1;
            px1=px1-1;
            }
            break;

        /* si dep1 == 4*/
        case 4:
            {
            py1=py1+1;
            }
            break;

        /* si dep1 == 5 */
        case 5:
            {
            py1=py1+1;
            px1=px1+1;
            }
           break;

        /* si dep1 == 6 */
        case 6:
            {px1=px1+1;}
           break;

        /* si dep1 == 7 */
        case 7:
            {
            py1=py1-1;
            px1=px1+1;
            }
           break;
}

if( (*px2<=px1) && (px1<=*px) && (*py2<=py1) && (py1<=*py) )
{test=true;}

else
{test=false;}

}
while(test);


        if((px1>=0) && (px1<=taille_grille-1) && (py1>=0) && (py1<=taille_grille-1))
        {
        if(!cd[px1][py1]){px1=-1;py1=-1;}
        }
}


      if((px1>=0) && (px1<=taille_grille-1) && (py1>=0) && (py1<=taille_grille-1))
        {
        cd[px1][py1]=false;
        *px=px1;
        *py=py1;
        }

      else
        {
        *px=-1;
        *py=-1;
        }

           }
    }

}
}

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
14 sept. 2014 à 20:21
Ben oui, mais justement, la lisibilité est hyper importante. C'est aussi pour ça qu'on met plus de temps à corriger ;-).
De plus, tu nous dis pas ce qui ne fonctionne pas précisément. A quel moment le programme cesse-t-il de fonctionner ?

Il nous faudrait également le type des arguments ci-dessous :
void deplacer_agent2(float **grille, int *px,int *py,int *px2,int *py2,bool ** cd,int dep1,int taille_grille,bool *init)
Car si tu as fait float grille[X][Y]; tu ne peux pas faire comme ça. D'ailleurs pourquoi un float ?

As-tu des erreurs lors de la compilation ? Des warnings ?
0
149_67 Messages postés 18 Date d'inscription dimanche 1 décembre 2013 Statut Membre Dernière intervention 26 septembre 2014
26 sept. 2014 à 11:39
Bonjour,
Chaque cellule dans la grille contient une valeur de probabilité, le type `'float'' vient d'ici.
Il y'as des warnings de type" unused variable", mais pas dans les lignes de la fonction concernée.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
26 sept. 2014 à 11:56
Comment as-tu initialisé float **grille ?
0
149_67 Messages postés 18 Date d'inscription dimanche 1 décembre 2013 Statut Membre Dernière intervention 26 septembre 2014
26 sept. 2014 à 12:20
float **grille=new float*[tg];

(tg: c'est la taille de la grille)

avec tg=15
0