Site web : http://www.exodus-lilium.com

>> Actuellement sur Aurore Cataclysm <<
 
AccueilSiteCalendrierFAQRechercherS'enregistrerMembresGroupesConnexion

Partager | 
 

 Probleme Programmation C

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : 1, 2, 3  Suivant
AuteurMessage
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Probleme Programmation C   Lun 22 Nov 2010 - 0:16

Voila, je dois coder un déplacement aléatoire d'un robot dans un tableau que je crée.

Le tout est regroupé dans une fonction de mise à jour qui effectue un déplacement et calcule son cout ( y'a un nombre limité d'energie pour se déplacer ) et il ne doit pas y avoir plus de 5000 mises à jour...

Donc moi , je veux que le robot se déplace aléatoirement sur une des cases adjacentes sauf si il y a un obstacle. La taille de la grille est [x][y], tab c'est le tableau, les coordonnées du robot sont (n,m).
( z c'est l'orientation du robot mais pour l'instant je ne m'en occupe pas )

Les obstacles sont représentés par des 'X'.

Si vous avez besoin de la donnée du projet pour mieux comprendre ce que je fais ou me proposer de meilleures solutions : Projet_Aspirator ( PDF )

Voici la partie de code que je n'arrive pas à faire fonctionner :

Code:


void mise_a_jour(char *tab, int x, int y, int n, int m, int z)
{
    int nbr_maj, nrj;
    int alea;
    srand (time(0));

    for( nbr_maj=5000, nrj=5200 ; nbr_maj!=0&&nrj!=0 ; nbr_maj-- )
    {
        alea=rand()%7;

    printf("%d", alea);

        switch(alea)
        {
            case 0 :
                if (*(tab+x*(n-1)+(m-1)) != 'X' )
                {
                    n=n-1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 1 :

                if (*(tab+x*n+(m-1)) != 'X' )
                {
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 2 :

                if (*(tab+x*(n+1)+(m-1)) != 'X' )
                {
                    n=n+1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 3 :

                if (*(tab+x*(n+1)+m) != 'X' )
                {
                    n=n+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 4 :

                if (*(tab+x*(n+1)+(m+1)) != 'X' )
                {
                    n=n+1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 5 :

                if (*(tab+x*n+(m+1)) != 'X' )
                {
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 6 :

                if (*(tab+x*(n-1)+(m+1)) != 'X' )
                {
                    n=n-1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 7 :

                if (*(tab+x*(n-1)+m) != 'X' )
                {
                    n=n-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
        }
    }
}



Si vous voulez le code en entier :
Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int define(int);
void orientation(char*, int, int, int, int);
void position_obstacle(char*, int, int);
void mise_a_jour(char*, int, int, int, int, int);
void affiche(char*, int, int);

int main()
{
    int x, y, n, m, z;
    x = define(x);
    y = define(y);
    char tab[x][y];

    //initialisation du tableau par des espaces vides
    memset(tab[0], ' ', sizeof(tab));

    n = define(n);
    m = define(m);
    z = define(z);

    orientation(*tab, x, n, m, z);

    position_obstacle(*tab, x, y);

    mise_a_jour(*tab, x, y, n, m, z);

    affiche(*tab, x, y);
}

int define(int x)
{
    static int i, X, Y;

    switch (i)
    {
        case 0 :
            printf("\n Entrez la dimension verticale de l'espace ( nombre de lignes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entrée est incorrecte. Veuillez l'entrer à nouveau."));
            X=x;
            break;
        case 1 :
            printf("\n Entrez la dimension horizontale de l'espace ( nombre de colonnes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            Y=x;
            break;
        case 2 :
            printf("\n Entrez l'abscisse du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>=X)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
        case 3 :
            printf("\n Entrez l'ordonnee du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>=Y)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
        case 4 :
            printf("\n Entrez l'orientation du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>3)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
    }

    i++;
    return x;
}

void orientation(char *tab, int x, int n, int m ,int z)
{
    switch(z)
    {
        case 0 :
            *(tab+x*n+m)='|';
            break;
        case 1 :
            *(tab+x*n+m)='/';
            break;
        case 2 :
            *(tab+x*n+m)='-';
            break;
        case 3 :
            *(tab+x*n+m)='';
            break;
    }

}


void position_obstacle(char *tab, int x, int y)
{
    int a=0, b=0;

    while(1)
    {
        printf("\n Entrez l'abscisse de l'obstacle (ou -1 si pour ne pas ajouter d'obstable) : ");
        scanf("%d", &a);
        if(a==-1)
            break;
        printf("\n Entrez l'ordonnee de l'obstacle : ");
        scanf("%d", &b);

        if ((0<=a)&&(a<=x-1)&&(0<=b)&&(b<=y-1))
            switch (*(tab+x*a+b))
            {
                case ' ':
                    *(tab+x*a+b)='X';
                    break;
                case 'X':
                    printf("\n ! Il y a des obstacles à la meme position. ! ");
                    break;
                default :
                    printf("\n ! Des obstacles sont à la meme position que le robot et n'apparaitrons pas ! ");
            }
        else
        {
            printf("\n Erreur : L'obstacle n'est pas dans l'espace. Il n'y apparaitra donc pas.");
            break;
        }
    }
}

void mise_a_jour(char *tab, int x, int y, int n, int m, int z)
{
    int nbr_maj, nrj;
    int alea;
    srand (time(0));

    for( nbr_maj=5000, nrj=5200 ; nbr_maj!=0&&nrj!=0 ; nbr_maj-- )
    {
        alea=rand()%7;

    printf("%d", alea);

        switch(alea)
        {
            case 0 :
                if (*(tab+x*(n-1)+(m-1)) != 'X' )
                {
                    n=n-1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 1 :

                if (*(tab+x*n+(m-1)) != 'X' )
                {
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 2 :

                if (*(tab+x*(n+1)+(m-1)) != 'X' )
                {
                    n=n+1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 3 :

                if (*(tab+x*(n+1)+m) != 'X' )
                {
                    n=n+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 4 :

                if (*(tab+x*(n+1)+(m+1)) != 'X' )
                {
                    n=n+1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 5 :

                if (*(tab+x*n+(m+1)) != 'X' )
                {
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 6 :

                if (*(tab+x*(n-1)+(m+1)) != 'X' )
                {
                    n=n-1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 7 :

                if (*(tab+x*(n-1)+m) != 'X' )
                {
                    n=n-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            default :
                printf("BUG");
                break;
        }
    }
}


//fonction affiche : affichage du tableau
void affiche(char *tab, int x, int y)
{
    //declaration des variables
    int i, j;

    //affichage du tableau avec bordures
    for(i=0;i<x;i++)
    {
        printf("\n");

        for(j=0;j<y;j++)
            printf("----");

        printf("-");
        printf("\n");

        for(j=0;j<y;j++)
            printf(": %c ", *(tab+x*i+j));

        if(j==y)
            printf(":");
    }
    printf("\n");

    for(j=0;j<y;j++)
    {
        printf("----");
    }
    printf("-");

}



Voila,

Merci de votre aide Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Blip
Gardien


Nombre de messages: 793
Age: 22
Date d'inscription: 19/02/2008

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 0:38

C'est quoi qui ne fonctionne pas dans la partie que tu nous montres ?

Le printf s'affiche ?
Je te conseillerais également de sortir tes break de tes { } dans ton switch.

______________________________
Gardien de l'Exodus Lilium.

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 0:48

ça me met que la console cesse de fonctionner ... :s


sinon je peux pas les sortir car sinon, si y'a un obstacle ça va pas regarder la case d'apres ... :s
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire


Nombre de messages: 143
Age: 21
Date d'inscription: 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 12:20

j ai TP d info cet aprem je regarderais ca.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 13:14

ok merci Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire


Nombre de messages: 143
Age: 21
Date d'inscription: 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 13:52

y as des partie que je comprend aps tu te casse al tete sur des truc vachment compliquer pour aps grand chose.
J aurai besoin d info supplementaire car ton lien ne marche pas
1: c est du C ou du C++.


Sinon

int define(int x)
{
static int i, X, Y;

switch (i)
{
case 0 :
printf("\n Entrez la dimension verticale de l'espace ( nombre de lignes ) : ");
do (scanf("%d", &x)); while (x<=0 && printf("Erreur la valeur entrée est incorrecte. Veuillez l'entrer à nouveau."));
X=x;
break;
case 1 :
printf("\n Entrez la dimension horizontale de l'espace ( nombre de colonnes ) : ");
do (scanf("%d", &x)); while (x<=0 && printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
Y=x;
break;
case 2 :
printf("\n Entrez l'abscisse du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>=X)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
case 3 :
printf("\n Entrez l'ordonnee du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>=Y)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
case 4 :
printf("\n Entrez l'orientation du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>3)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
}

i++;
return x;
}


Ton i n'est pas initialiser
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:10

alors c'est du C
le lien marche bien normalement :s

sinon le static intialise i à 0

le probleme se situe dans la la fonction de mise_a_jour car ça marche tres bien sans ( mais le robot ne se déplace pas )

comment heberger un pdf pour que vous puissiez le voir ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:22

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire


Nombre de messages: 143
Age: 21
Date d'inscription: 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:38

Moi en fait la console ce lance mais effectivement arrivé a la mise a jour y as un bug de segmentation
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire


Nombre de messages: 143
Age: 21
Date d'inscription: 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:50

alors j'ai repéré une petite erreur
dans ta fonction tu met %7 et une case 7 Or tu n'aura jamais 7 vu que s'il reste 7 ca veut dire que c est divisible par 7 et donc ca fera 0.

Quand au probleme de segmentation:
Tu fait 5000 fois la meme chose en tres peu de temp.
reduit juste ton nbr_Maj a 20 tu vera

Sinon je te conseille de mettre plus d affichage genre a chaque deplacement en indiquant les deplacement precedent du robot et en mettant distinctivement la position actuel du robot.

PS ton programme marche avec ces modification:
alea=rand()%8;
nbr_maj=20
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:55

mais je dois mettre 5200 maj c'est dans la donnée :s

sinon peut etre que l'affichage intermediaire enleve la segmentation ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire


Nombre de messages: 143
Age: 21
Date d'inscription: 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:56

peut etre j essaye de te le faire avec 5k alors
je vien de tester malheureusement il y as un probleme au niveau d la memoire. Je vais essayer de voir au bout de combiend essai ca bug.
bon alors mon prof vien de me dire que c'est ta memeoire qui est pas asez grande et que pour que cela marche il faut utiliser des conaissance qui me depassent actuelement desoler


EDIT: ca bug ver 150 pour moi si je vais suffisament lentement apres j ai une saturation de memoire ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 15:28

Je pense pas que le probleme vienne de la mémoire :s

j'ai 8 giga de ram donc normalement je peux faire tourner un truc comme ça je pense ...

pareil j'ai un i7 720Q comme processeur :s
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire


Nombre de messages: 84
Age: 21
Date d'inscription: 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 15:52

En fait je dois pas m'y prendre correctement.

Je pense que ce que je fais est trop compliqué et peut etre remplacé par quelque chose de simple ( je ne fait de la programmation que 4h par semaine depuis 3 mois ... )

Peut etre que si j'ajoute la condition de sortie de la boucle une fois toute les cases visitées ça va marcher ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Zildark
OWien


Nombre de messages: 1124
Age: 17
Localisation: Dans ton cul ^^ Sinon c'est Dijon xD
Date d'inscription: 26/04/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:49

Bonne chance Wink

En tout cas moi je sais que je ferais jamais ça ><
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
 

Probleme Programmation C

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 3Aller à la page : 1, 2, 3  Suivant

 Sujets similaires

-
» probléme vous rejoindre
» Problème avec le forum !
» Probleme s'il vous plait
» [A LIRE] Comment créer un topic "problème"
» Probleme Programmation C

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
 :: Discussion-