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 :

Problèmes de pointeurs


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut Problèmes de pointeurs
    bonjour,

    j'ai un problème avec mon programme de bataille navale :
    Tout d'abord j'ai crée un bateau avec cette fonction :
    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
     
    typedef struct 
    {
       int colonne;
       int ligne;
       int longueur;
       char orientation;
       int nbtouches;
    }bateau;
     
    typedef struct 
    {
       bateau *contenu;
       int etat;
    }Case;
     
    typedef struct 
    {
       Case tableau[9][9];
    }grille;
     
    bateau SaisirBateau (int l)
    {
    bateau b;
    b.longueur = l;
    printf("\nLigne 1ere case : ",b.ligne);
    scanf("%d",&b.ligne); 
     
    printf("\nColone 1ere case : ",b.colonne);
    scanf("%d",&b.colonne);
     
    printf("\nOrientation : ",b.orientation);
    scanf("%c%c",&b.orientation,&b.orientation);
    b.nbtouches=0;
    return (b);
    }
    Ensuite j'utilise cette action qui permet de placer les informations d'un bateau pointé dans les cases correspondantes.
    La voici :
    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
     
    void Ajouterbateau (bateau *pb, grille *g)
    {
         int i,j,l,x;
         char o;
         l = (*pb).longueur;
         i = (*pb).ligne;
         j = (*pb).colonne;
         o = (*pb).orientation;
         (*pb).nbtouches=0;
     
         if (o=='b')
         {
            for (x=0;x<l;x++)
            {
              g->tableau[i][j].contenu = pb;
              g->tableau[i][j].etat = 1; 
            }
         }
         else if (o=='d')
         {
            for (x=0;x<l;x++)
            {
               g->tableau[i][j].contenu = pb;
               g->tableau[i][j].etat = 1; 
            }
         }
    }
    le probleme c'est que lorsque je retourne le pointeur sur un bateau placé à une case (i,j) du tableau avec cette fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bateau* casebateau (grille g,int i, int j)
    {  
       return(g.tableau[i][j].contenu);
    }
    je constate que ce pointeur est le même pour tous les bateaux rentrés !!!! Lorsque je veux modifier les informations d'un bateau à la case (i,j), il me modifie en fait celles du dernier bateau rentré. Comprend pô
    En fait je voudrai que les pointeurs soient differents pour chaque bateau.

    voila si vous pouvez me donner un ptit coup de main, c'est pas de refu

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    L'erreur est sans doute dans le code qui appelle SaisirBateau puis Ajouterbateau . Il a probablement la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bateau bat;
    ....
    bat = SaisirBateau(....);
    Ajouterbateau (&bat,...);
    Si c'est le cas, tous les bateaux de la grille comportent l'adresse d'un même bateau, bat.
    D'après ce que je crois comprendre, la logique voudrait que SaisirBateau non seulement initialise les données du bateau mais crée de façon dynamique les bateau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bateau  * SaisirBateau (int l)
    {
    bateau  * b = malloc(sizeof(bateau));
    b->longueur = l;
    ....
    return (b);
    }
    .....
    bateau * bat;
    .....
    bat = SaisirBateau(....);
    Ajouterbateau (bat,...);
    Ne pas , dans ce cas oublier de détruire les bateau quand on n'en a plus besoin.

  3. #3
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    C'est certainement dut à ta fonction :
    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
    bateau SaisirBateau (int l)
    {
       bateau b;
       b.longueur = l;
       printf("\nLigne 1ere case : ",b.ligne);
       scanf("%d",&b.ligne); 
    
       printf("\nColone 1ere case : ",b.colonne);
       scanf("%d",&b.colonne);
    
       printf("\nOrientation : ",b.orientation);
       scanf("%c%c",&b.orientation,&b.orientation);
       b.nbtouches=0;
       return (b);
    }
    La variable "b" étant locale à ta fonction, elle est indéfinie au retour.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    crocodilex :
    La variable "b" étant locale à ta fonction, elle est indéfinie au retour.
    C'est exact, mais la fonction retourne une COPIE de la variable locale et la valeur de retour est elle bien définie (ce code ne retourne pas l'adresse de la variable locale)

  5. #5
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par diogene
    crocodilex : C'est exact, mais la fonction retourne une COPIE de la variable locale et la valeur de retour est elle bien définie (ce code ne retourne pas l'adresse de la variable locale)
    Tu as entièrement raison. Je me rends compte que je viens de dire une grosse bêtise (trop de précipitation). Merci de m'avoir corrigé...

  6. #6
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    merci de toutes vos réponses mais je dois faire ma bataille en statique. Et je crois que avec du malloc c'est dynamique

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gealex
    merci de toutes vos réponses mais je dois faire ma bataille en statique. Et je crois que avec du malloc c'est dynamique
    Alors dans ce cas, crée un tableau de bateau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bateau bat[NB_MAX_BATEAU];

  8. #8
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    ok merci je vais essayer de faire ça

  9. #9
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    En fait, au lieu de faire un tableau de cases je fais un tableau de bateau c'est bien ça ?

  10. #10
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gealex
    En fait, au lieu de faire un tableau de cases je fais un tableau de bateau c'est bien ça ?
    Ben je ne sais pas trop ce que tu veux faire. Si tu ne veux pas créer des bateaux de manière dynamique comme le propose Diogène, tu peux essayer comme cela (c'est un exemple incomplet) :
    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
    #define NB_BATEAU  3
     
    void SaisirBateau (bateau *b)
    {
        char c;
        printf("\nLongueur : ");
        scanf("%d",&b->longueur); 
        while ((c = getchar()) != '\n' && c != EOF);
     
        printf("\nLigne 1ere case : ");
        scanf("%d",&b->ligne); 
        while ((c = getchar()) != '\n' && c != EOF);
     
        printf("\nColone 1ere case : ");
        scanf("%d",&b->colonne);
        while ((c = getchar()) != '\n' && c != EOF);
     
        printf("\nOrientation : ");
        scanf("%c",&b->orientation);
        while ((c = getchar()) != '\n' && c != EOF);
        b->nbtouches=0;
    }
     
    int main (void)
    {
        int i;
        bateau bat[NB_BATEAU];
     
        for (i=0; i<NB_BATEAU; i++) {
            SaisirBateau(&bat[i]);
        }
     
        return EXIT_SUCCESS;
    }
    J'ai fais quelques corrections dans la fonction "SaisirBateau", mais saches que la fonction scanf est déconseillée pour les débutants (d'ailleurs cela ne marchait pas dans le code original).

  11. #11
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    oki oki, je vais essayer comme ça. Encore une fois

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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