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 / matrice à n dimensions


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Par défaut tableau / matrice à n dimensions
    Bonjour tout le monde,
    Bon pour commencer super site vraiment

    Voilà je me promenais dans les tutos et les cours pour en savoir un peu plus sur les pointeur style ****M. Si j'ai bien compris c'est pour faire comme une matrice. Je sais qu'on peux noter ça aussi M[20][20][20][20] mais comme je l'ai noté ça oblige a le déclarer comme une constante. J'ai déjà programmé un peu en Python où c'est beaucoup plus simple... mais j'ai été très peiné de lire ça dans un des cours:
    Pour un tableau, la dimension n peut être donnée par une variable, c'est-à-dire être inconnue lors de la compilation, mais la taille des composantes doit être connue. Il en découle que dans le cas d'un tableau à plusieurs indices, seule la première dimension peut être non constante :
    http://cpp.developpez.com/cours/polyCpp/#LI-I

    Si c'est vrai c'est vraiment naz
    Dites moi que j'ai mal compris.

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Tu peux faire des tableaux à plusieurs dimensions dynamiques, mais il faut passer par des pointeurs de pointeurs de... et des instanciantions dynamiques (avec des new, qui entrainent des delete).

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Tu peux faire des tableaux à plusieurs dimensions dynamiques, mais il faut passer par des pointeurs de pointeurs de... et des instanciantions dynamiques (avec des new, qui entrainent des delete).
    Ou utiliser des outils qui masquent ce genre de chose, comme des vecteurs de vecteurs de vecteurs (mauvaise idée) ou boost::multi_array
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Par défaut
    Les matrices me paraissent un outil puissant pour programmer mais j'ai l'impression que tout le monde s'en tape plus ou moins, y a t-il une façon de contourner avec des classes ou je sais pas quoi?

    La question peut paraitre bête parce qu'elle l'ai

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Les matrices au sens mathématique du terme ?

    Dans ce cas, ll faut plutôt regarder du coté de Blitz++ ou de boost::ublas
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Par défaut
    Non dans le sens tableau de tableau de tableau (un peu comme des ensembles en maths), mais je viens de commencer a lire le tuto sur les class et je me rentre compte - enfin je crois m'être rendu compte - que les class sont comme des ensembles et que les méthodes sont un peut comme les applications (quand y a plusieurs class d'imbriquées).

  7. #7
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Tu as déjà fait de la programmation orientée objet (je veux dire créé des classes, utilisé l'héritage, pas juste utilisé des objets dans une application) ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Par défaut
    euuuuhhh non c'est la première fois que je m'attaque aux class, je compare ca aux maths parce que j'ai l'impression que ça marche pareil. Je dis application au sens mathématique i.e relation entre ensembles. l'héritage on va dire que c'est l'inclusion d'ensemble, etc..

    Mais peut-être que j'ai rien compris

  9. #9
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Pour une matrice multidimensionnelle, tu peux éventuellement utiliser boost::multi_array. La seule chose que tu as besoin à la compilation, c'est le nombre de dimensions. Chaque dimension peut avoir une taille différente.

    J'ai fais une petite application d'exemple d'utilisation récemment (pour répondre à cette question sur StackOverflow).

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum.

    Déjà, il faut savoir qu'il est *relativement* rare de se trouver face à une situation dans laquelle il soit nécessaire de travailler sur un tableau ayant plus de trois ou quatre dimensions.

    Ceci dit, l'une des solutions les plus facile pour gérer des dimensions multiples consiste à n'en gérer... qu'une dont le nombre d'éléments est le produit de la taille de chaque dimensions.

    Ainsi, si tu veux gérer trois dimensions, contenant respectivement 3, 5 et 10 éléments, tu peux envisager de gérer un tableau à dimension unique de... 3*5*10 = 150 éléments

    Pour atteindre un élément donné, il s'agit alors d'utiliser la formule
    (position1*(max_dim2*max_dim3))+(position2*(max_dim3))+position3

    D'un autre coté, il semble que tu aie mal compris le principe de l'héritage

    En effet, la relation d'héritage est la relation la plus forte qui puisse exister entre deux classes.

    Pour savoir s'il est réellement utile de l'utiliser, le plus simple est de te poser la question de savoir si tu peux dire d'un point de vue purement sémantique que l'objet du type dérivé peut être considéré comme un objet du type de base.

    Si tu peux répondre oui en toute honnêteté répondre oui à cette question, tu peux envisager l'héritage.

    Sinon, il est plus que vraisemblable que tu doive t'orienter plutôt vers une relation de composition
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Bele'nos Voir le message
    Non dans le sens tableau de tableau de tableau (un peu comme des ensembles en maths), mais je viens de commencer a lire le tuto sur les class et je me rentre compte - enfin je crois m'être rendu compte - que les class sont comme des ensembles et que les méthodes sont un peut comme les applications (quand y a plusieurs class d'imbriquées).
    En fait, pour faire une comparaison avec les maths (à la volée, donc c'est peut être un peu approximatif), une classe peut être définie comme suit:
    1/ Un ensemble d'états E={e1, e2, ..., en} ;
    2/ Un ensemble de méthodes de E->E ;
    3/ Un ensemble d'invariants, c'est à dire de propositions toujours vérifiée I={P}: quelque soit ei, pour tout p de I, p(ei) est vrai.

    Une classe Fille dérivée Mère est une classe qui vérifie:
    1/ Soit E' les états de fille, E les états de mère, alors Pour tout e' de E', il existe une méthode M de E'->E. M n'est pas une méthode à proprement implémentée en C++. Elle correspond juste au fait que 'caster' de Fille vers Mère donne un objet Mère valide.
    2/ Soit I' les invariants de Fille et I les invariants de Mère, alors I est inclus dans I'.
    C'est cette deuxième assertion qui est la plus forte: elle dit que les classes dérivées doivent respecter les invariants de la classe Mère. Il en découle ce que dit Koala: que la relation d'héritage est une relation très forte et que sémantiquement elle doit avoir un sens.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Par défaut
    Bonjour,

    Déjà je vous remercie pour vos réponses. Réponses que je n'ai pas très bien compris parfois . Je reviens poster après quelques jours car j'ai trouvé mes réponses ailleurs qui, après relecture, correspondent parfaitement a vos réponses .

    PS: Faite pas comme moi et ne vous embrouillez pas avec les maths

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Turbo Pascal] Transformation d'une matrice en un tableau à une seule dimension
    Par med.ycf dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 20/05/2014, 19h35
  2. Tableau a trois dimension!!!
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/10/2005, 15h52
  3. Réponses: 1
    Dernier message: 30/09/2005, 19h17
  4. [Tableau]comment connaitre la taille d'un tableau à 2 dimensions
    Par Kyti dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/04/2005, 10h27
  5. [Tableau][matrices]changement d'index et variables variables
    Par The Wretched dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/04/2005, 10h01

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