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 :

Probleme tableau dynamique 2D


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut Probleme tableau dynamique 2D
    Bonjour à tous,

    je viens de commencer à découvrir le vaste monde de la programmation et déjà des questions se posent ... En fait, il s'agit d'un tableau dynamique à 2 dimensions avec la définition du "pointeur de pointeurs" si je puis dire.
    Il y a deux possibilités que j'ai mis en commentaire: l'une marche, l'autre pas, et j'aimerais savoir pourquoi...

    Merci d'avance.

    Code fonction.cpp : 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
    #include <iostream>
     
    using namespace std;
     
    int saisie_nombre()
    {
        int n;
        cout<<"Saisir le nombre de particules: ";
        cin>>n;
        return n;
    }
     
    void saisie_point(double* p)
    {
         // p=new double[3];    // 1ere possibilite: elle marche pas, pourquoi ? 
         cout<<"Coordonnees: "; // (a l'execution, il apparait une fenetre windows d'erreur)
         cin>>p[0]>>p[1]>>p[2];
    }
     
    void affiche_point(double*p)
    {
         cout<<"Coordonnees du point: "<<p[0]<<'\t'<<p[1]<<"\t"<<p[2];
    }
     
    int menu()
    {
        int m;
        do{
        cout<<"Voulez-vous: 1->Entrer les particules ?"<<endl;
        cout<<"             2->Calculer le centre d'inertie ?"<<endl;
        cout<<"             3->Quitter ?"<<endl;
        cout<<"Votre choix (1,2 ou 3)? ";
        cin>>m;
          }while(m!=1&&m!=2&&m!=3);
        return m; 
    } 
     
    void entree(int n,double**pts,double*masses)
    {
       /*  for(int i=0;i<n;i++)
         {
                pts[i]=new double[3];  //2eme possibilite qui marche
         }
       */ 
         for(int i=0;i<n;i++)
         {
                 cout<<"Saisir les coordonnees et la masse de la particule d'indice "<<i+1<<": "<<endl;
                 saisie_point(pts[i]);
                 cout<<"Masse: ";
                 cin>>masses[i];
         }
    }        
     
    void centre(int n,double**pts,double*masses)
    {
         double x=0;
         double y=0;
         double z=0;
         double m=0;
     
         for(int i=0;i<n;i++)
         {
            x+=masses[i]*pts[i][0];
            y+=masses[i]*pts[i][1];
            z+=masses[i]*pts[i][2];
            m+=masses[i];  
         }
     
         x/=m;
         y/=m;
         z/=m;
     
         cout<<"Coordonnees du centre d'inertie: "<<x<<"\t"<<y<<"\t"<<z<<endl;
    }

    Code fonctions.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int saisie_nombre();
    void saisie_point(double* p);
    void affiche_point(double*p);
    int menu();
    void entree(int n,double**pts,double*masses);
    void centre(int n,double**pts,double*masses);
    Code main.cpp : 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
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    #include "Fonctions.h"
     
    int main()
    {
        int n=saisie_nombre();
        double**points=new double*[n];
        double*masses=new double[n];
        entree(n,points,masses);
     
        int choix=0;
     
        do{
        choix=menu();
        if(choix==1) entree(n,points,masses);
        if(choix==2) centre(n,points,masses);
          }while(choix!=3);
     
     
        system("PAUSE");
        return 0;
    }

  2. #2
    Membre éprouvé Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par défaut
    Bonjour, je pense que tu as un soucis de comprehension des pointeurs,
    je vais essayer d'éclaircir tes idées.

    Dans la premiere solution, tu présentes ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void saisie_point(double* p)
    {
          p=new double[3];    // 1ere possibilite: elle marche pas, pourquoi ? 
         cout<<"Coordonnees: "; // (a l'execution, il apparait une fenetre windows d'erreur)
         cin>>p[0]>>p[1]>>p[2];
    }
    tu passes en parametre un pointeur (une adresse mémoire) qui permet
    à la fonction de modifier les élements pointés. Par contre, tu alloues une
    nouvelle zone mémoire et tu modifie la valeur du pointeur.
    Or cette valeur n'est pas mise a jour au retour de la fonction.
    Comme en C, avec le passage d'un int, il faut passer un pointeur sur un
    int pour que cela fonctionne.
    voila comment le modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void saisie_point(double** p)
    {
          *p=new double[3];    // 1ere possibilite: elle marche pas, pourquoi ? 
         cout<<"Coordonnees: "; // (a l'execution, il apparait une fenetre windows d'erreur)
         cin>>p[0]>>p[1]>>p[2];
    }
    si je n'ai pas ete assez claire, tu peux retrouver plus d'information ici:
    http://chgi.developpez.com/pointeur/

    bye

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut
    Merci bien pour cette explication. Je t'avoue que çà reste encore un peu flou mais bon faut que je relise les tutos pour bien assimiler les pointeurs ...

  4. #4
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut
    le premier point: le tableau est unidimensionel.
    Quand tu déclares un tableau (int tab[10]; ) tu déclares en fait un pointeur constant sur le premier élément du tableau. Donc les fonctions qui demandent un tableau en paramètre récupèrent déjà l'adresse désignée par le pointeur, et le tableau est passé par référénce.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void affiche(int t[]);
    int main(){
        int tab[10];
        for(int i=0; i<10; ++i)
            tab[i]=0;
        affiche(tab);
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void affiche(int* t);
    int main(){
        int tab[10];
        for(int i=0; i<10; ++i)
            tab[i]=2;
        affiche(tab);
        return 0;
    }
    un tableau ne connait pas sa propre taille, donc soit tu la mémorises dans une variable globale à laquelle la fonction a accès, soit tu la passe en paramètre à ta fonction .


    pour le cas des tableau multidimensionel
    Un tableau peut être converti en un pointeur sur son premier élément. Ici t est un tableau de tableau de 2 entiers. Donc t[0] est un tableau de 2 entiers (un int [2]) et donc t peut être converti en un pointeur sur tableau de 2 entiers contenant l'adresse du premier élément de t (&t[0]). En C++ (et en C) un pointeur sur tableau de 2 entiers se note int (*)[2].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void affiche(int (*tab)[2])
    {
     int i,j;
     for(i=0;i<2;i++) for(j=0;j<2;j++) cout<<tab[i][j];
    }
     
    main()
    {
       int t[][2]={{0,1},{2,0}};
       affiche(t);  
    }

Discussions similaires

  1. Tableau dynamique probleme
    Par G4uthier dans le forum C
    Réponses: 5
    Dernier message: 01/06/2009, 15h47
  2. Probleme tableau dynamique
    Par John-Doe dans le forum Débuter
    Réponses: 6
    Dernier message: 31/03/2008, 00h19
  3. Réponses: 9
    Dernier message: 23/12/2007, 19h51
  4. probleme dans tableau dynamique
    Par zulad dans le forum C#
    Réponses: 3
    Dernier message: 27/07/2007, 21h05
  5. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00

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