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 :

tableau a deux dimenssion


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par d�faut tableau a deux dimenssion
    bonjour tout le monde.
    Je fais du c++ et comme j'ai un petit probl�me de pointeur, je viens vous embeter ^^.

    Bon, pour r�sumer la situation : j'ai fait une classe en c++ qui permet de creer des matrices. J'ai d'abord commencer par en faire des de taille 4*4 (la classe s'appelant Matrice4) puis j'ai chang� tous les "4" en N et j'ai utilis� un define. Ce passage c'est fait sans probl�me : je pouvais encore les multiplier, les d�clarer ect.

    Maintenant, je voudrais pouvoir finir cette partie de taille (si je puis dire ) et donc g�n�rer une matrice de taille N avec n entr� par l'utilisateur.

    L'ennui c'est que j'ai cherch� comme faire un tableau de n*n �l�ment � l'aide du malloc, mais que dans tous les cas, j'obtiens des d�passement m�moire, et mon programme plante.

    Je voulais donc savoir si vous aviez une id�e de comment faire en C++ pour pouvoir retoucher cette partie sans devoir reprendre tout le code (genre en passant pas les alias, vu que la taille de la matrice est d�termin�e � la cr�ation).

    Je vous met l'"en-t�te" de ma classe, si vous avez besoin d'info sur telle ou tele m�thode, vous demandez

    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
     
    #ifndef DEF_MATRICE
    #define DEF_MATRICE
    #define N 5
     
    class Matrice
    {
      public:
     
        Matrice();
        Matrice(unsigned int taille);
        Matrice(unsigned int taille, std::string type); //sert à creer des matrice de type ide ou autre
        //Matrice(unsigned int nbLigne, unsigned int nbColonne);//dans le futur, crées des matrices non carrées
        ~Matrice();
     
        void setElt(unsigned int ligne, unsigned int colonne, int value);
        int getElt(unsigned int ligne, unsigned int colonne);
        void affiche();
     
        void displayError(std::string error);//centralisation des message d'erreur, pour un meilleur controle du comportement (tout désactiver , attendre l'appui d'une touche)
     
        bool T1(int ligne, int value);
        bool T2(int ligne1, int ligne2);
        bool T3(int ligne1, int ligne2, int value);
     
     
        Matrice operator+(const Matrice matrice);//addition de matrice
        Matrice operator*(const Matrice matrice);//multiplication de matrice
        Matrice operator*(int valeur);//multiplication par un scalaire
        Matrice operator/(int valeur);//division par un scalaire
     
     
      protected:
     
        bool initialise(unsigned int nb_ligne, unsigned int nb_colonne);//prévu pour réserver l'espace mémoire, ne marche pas
     
     
        int **m_elt;// avant : m_elt[N][N]
        int m_largElt;//sert pour l(affichage, pour aligner tous les nombres il faut connaitre celui qui prend le plus de caractères.
        int m_nbLigne;
        int m_nbColonne;
     
     
    };
     
     
    #endif

  2. #2
    Membre �clair� Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par d�faut
    Citation Envoy� par bubuche87 Voir le message
    [...]L'ennui c'est que j'ai cherch� comme faire un tableau de n*n �l�ment � l'aide du malloc, mais que dans tous les cas, j'obtiens des d�passement m�moire, et mon programme plante.

    Je voulais donc savoir si vous aviez une id�e de comment faire en C++ [...]
    c++, malloc -->2 mots qui ne vont pas ensemble

    E, c++ on utilise new et delete

    Si tu as toujours un pb apr�s �a montre nous justement le code o� tu alloues ta m�moire

  3. #3
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Je dirais m�me plus, en c++ on utilise std::vector pour la gestion de la m�moire, c'est plus facile � utiliser que new/delete.

  4. #4
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    La c'est bien.
    Pour les vecteurs certes, mais quitte � faire cet exo de r�-invention de roue (ce n'est pas comme s'il existait profusion de biblioth�ques matricielles), autant aller jusqu'au bout et g�rer la m�moire � la main.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  5. #5
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Voir m�me �crire les instructions machine...

    Bref, si les deux dimensions sont fixes, tu peux utiliser boost::array.

  6. #6
    Membre chevronn� Avatar de stephdim
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    462
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 462
    Par d�faut
    Je dirais m�me plus, en c++ on utilise std::vector pour la gestion de la m�moire, c'est plus facile � utiliser que new/delete.
    Bref, si les deux dimensions sont fixes, tu peux utiliser boost::array.
    Et puis quoi encore ?

    un simple

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    new int [m_nbLigne*m_nbColonne];
    fait largement l'affaire et est bien plus performant que n'importe quelle autre solution bas�e sur des lib stl, boost et j'en passe...

    suffit de surcharger l'op�rateur () pour faciliter l'acc�s au tableau

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int& operator () (int col,int row)
    {
      return m_elt[row*m_nbColonne+col];
    }
     
    int operator () (int col,int row) const
    {
      return m_elt[row*m_nbColonne+col];
    }
    avec m_elt de type int* et non int**

    c++, malloc -->2 mots qui ne vont pas ensemble
    le malloc() est encore tr�s pratique en c++ pour une seule raison : c'est la possibilit� d'utiliser realloc() - c'est toujours mieux que de faire 2 new diff�rents, un memcpy et un delete quand on veut agrandir une zone m�moire surtout si c'est faisable sur place par la CRT

    d'ailleurs le new et delete donne sur malloc() et free() (s'ils ne sont pas surcharg�s ... )

  7. #7
    Membre exp�riment�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 190
    Par d�faut
    Citation Envoy� par Alp Voir le message
    Voir m�me �crire les instructions machine...

    Bref, si les deux dimensions sont fixes, tu peux utiliser boost::array.
    Il aurait peut-�tre fallu que tu lises le post initial plus pr�cis�ment tu aurais alors remarqu� que le but de bubuche87 est de g�rer une matrice dont la taille est fournie par l'utilisateur. Ensuite je ne vois pas le mal qu'il y a � vouloir apprendre � g�rer la m�moire "� la main". Alors oui dans le cadre professionnel il est pr�f�rable d'utiliser std::vector ou boost::array mais visiblement l'objectif de bubuche87 est d'apprendre donc les remarques du style "utilise vector" ou "utilise "boost::array" n'ont � mon avis pas grand int�r�t.
    Maintenant pour en revenir au sujet qui int�resse bubuche87, si tu tiens absolument � utiliser un int ** tu peux faire quelque chose comme �a :
    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
    #include <new>
     
    using namespace std;
     
     
     
    int main(void)
    {
     
      size_t N=5;
      int **matrix=NULL;
     
      //on alloue l'espace mémoire nécessaire pour la matrice
      matrix=new int *[N];
      for(size_t i=0; i<N; ++i)
        {
          matrix[i]=new int[N];
        }
     
     
      //...
     
     
      //libération de la mémoire
      for(size_t i=0; i<N; ++i)
        {
          delete[] matrix[i];
        }
      delete[] matrix;
     
      return 0;
     
    }

  8. #8
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Citation Envoy� par stephdim Voir le message
    a- fait largement l'affaire et est bien plus performant que n'importe quelle autre solution bas�e sur des lib stl, boost et j'en passe...

    b- le malloc() est encore tr�s pratique en c++ pour une seule raison : c'est la possibilit� d'utiliser realloc() - c'est toujours mieux que de faire 2 new diff�rents, un memcpy et un delete quand on veut agrandir une zone m�moire surtout si c'est faisable sur place par la CRT

    c- d'ailleurs le new et delete donne sur malloc() et free() (s'ils ne sont pas surcharg�s ... )
    a- Ce n'est pas necessaire. Et puis cela ne veut rien dire. Certaines de ces biblioth�ques encapsulent des appels inlin�s � new, et autres acc�s direct aux �l�ments des tableaux.

    b- c'est aussi pour les r�allocations que les vecteurs standards sont r�guli�rement conseill�s

    c- C'est faux. C'est laiss� � l'enti�re discr�tion du fournisseur du compilo. S'il pr�f�re utiliser un autre allocateur propre au syst�me, il le fera.
    Citation Envoy� par Norme/�18.4.1.1
    Whether the attempt involves a call to the Standard C library function malloc is unspecified

    EDIT: @montag, la r�ponse ... robuste est d�j� dans la FAQ.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  9. #9
    Membre exp�riment�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 190
    Par d�faut
    @Luc Hermitte : Effectivement la solution dans la FAQ est plus robuste. J'ai �crit le mien juste dans le but de donner une piste. D�sol�.

  10. #10
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Ne le sois pas. On est tous l� pour apprendre ^^
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  11. #11
    Membre chevronn� Avatar de stephdim
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    462
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 462
    Par d�faut
    a- Ce n'est pas necessaire. Et puis cela ne veut rien dire. Certaines de ces biblioth�ques encapsulent des appels inlin�s � new, et autres acc�s direct aux �l�ments des tableaux.

    b- c'est aussi pour les r�allocations que les vecteurs standards sont r�guli�rement conseill�s

    c- C'est faux. C'est laiss� � l'enti�re discr�tion du fournisseur du compilo. S'il pr�f�re utiliser un autre allocateur propre au syst�me, il le fera.
    a- je suis d'accord mais l� on est en pr�sence d'un tableau statique et non dynamique. Alors exclu les std::vector entre autres. Bien sur qui peut le plus peut le moins, mais trimballer des vars style 'count' , 'maxcount' et 'ptr' �a mange un peu de pain. sans compter que les compilos sont loin d'etre parfait, alors compiler un simple new int[] versus un template qui donne sur la meme chose ... pourquoi faire simple ?

    b- chacun sa religion

    c- ok c'�tait pour illustrer, mais 9x / 10 �a tombe sur malloc / free

  12. #12
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    a- Donc potentiellement boost.array qui ne coutera rien.

    b- Je sacrifie r�guli�rement des �toiles � Saint RAII. ^^
    Les ressources brutes, je n'aime pas trop -- et quand leur acquisition foire sans balancer d'exception, c'est encore pire (-> *alloc()).
    (La realloc du vecteur est alors un bonus, en ce qui me concerne)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  13. #13
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Pour info, boost::array est un tableau statique, aucune allocation, mais qui pr�sente une interface "� la STL".

    Document sur le sujet : http://alp.developpez.com/tutoriels/boost/array/

  14. #14
    Membre �clair�
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par d�faut
    Je me suis amus� � faire une classe matrice en template avec les op�rateurs de base... est ce qu'il y aurait moyen de la proposer au site de developpez pour que d'autres personnes puissent y acc�der? car c'est quant m�me une question r�currente.

  15. #15
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Le top dans ce cas serait que tu cr��s un sujet dans le sous-forum "Contribuez" de C & C++ (qui se trouve ici : http://www.developpez.net/forums/forumdisplay.php?f=372) avec un titre du genre :
    [C++] Classe template Matrice

  16. #16
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Il y en a d�j� une dans la zone "contribuez". Mais il lui manque des choses.
    Et puis bon c'est un exercice assez classique qui m�riterait carr�ment une s�rie de tutos. Mais si les gens prennent directement la solution, il vont passer � c�t� de tout si qui l�verait tout l'int�r�t de l'exo.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  17. #17
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    C'est vrai que ce serait un tr�s bon sujet d'article... Hein Luc ?

  18. #18
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Pour ce sujet, je pr�f�re d'abord laisser chercher et corriger apr�s.

    (et puis je suis assez occup� � �crire la doc des mes plugins pour vim ... en anglais de surcroit)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Question sur tableau � deux dimenssions
    Par Loack- dans le forum C++
    R�ponses: 19
    Dernier message: 29/10/2006, 18h55
  2. Un string dans un tableau de deux dimensions...
    Par FinalSpirit dans le forum C++
    R�ponses: 5
    Dernier message: 15/01/2006, 14h29
  3. [PERL] Trier un tableau a deux dimensions
    Par piregwan dans le forum Langage
    R�ponses: 3
    Dernier message: 26/12/2005, 22h29
  4. R�ponses: 6
    Dernier message: 26/11/2005, 19h55
  5. R�ponses: 13
    Dernier message: 13/10/2005, 16h03

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