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 multidimensionnel et new []


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut tableau multidimensionnel et new []
    Bonjour,
    pour la fac j'ai besoin de faire un tableau multidimentionnel de hauteur donnée mais dont les lignes n'ont pas toutes la même taille.
    le type est imposé :

    je fait donc pour la hauteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _monMachin = new Machin**[_hauteur+1];
    et puis pour chaques lignes je boucle et j'alloue suivant la taille de ligne concernée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _monMachin[y] = new Machin*[nbElem];
    Ensuite chaque case doit pointer sur un objet soit sur NULL.
    Je trouve ca laborieux et j'aimerais pouvoir au moment de l'allocation de la ligne mettre tous les pointeurs à NULL puis ensuite traiter les cases qui sont interessantes.
    J'ai vu qu'il était possible de surcharger l'operateur new[] mais je ne sais pas exactement comment faire ...

    A l'heure actuelle, sur mes tests le tableau a 17 cases en hauteur pour un total de 109 cases en tout à traiter ...
    Si j'arrive à traiter une ligne entière d'un coup et vu que toutes les cases non NULL pointent sur un même objet ca ne me ferai plus boucler que 17 fois et non 109...

    En C il y calloc qui peut permettre de mettre tous les éléments à une valeur déterminée mais en C++ je sais pas.
    Comment puis je faire ?
    Merci d'avance
    Gwenhaël

  2. #2
    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
    Pour les tableaux utilise plutôt std:vector, c'est plus facile à utiliser, et sa fonction resize() met tous les nouveaux éléments à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std:vector< std::vector<Machin*> > _monMachin(_hauteur+1);
    _monMachin[y].resize(nbElem);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Citation Envoyé par Sylvain Togni
    Pour les tableaux utilise plutôt std:vector, c'est plus facile à utiliser, et sa fonction resize() met tous les nouveaux éléments à NULL :
    Je suis parfaitement d'accord avec toi ... Seulement comme je le disais dans le premier poste le type de _monMachin doit être obligatoirement :
    C'est imposé dans le sujet ...
    Me demande pas pourquoi ... On nous force à utiliser des char * au lieu de String alors plus rien ne m'étonne ...
    L'aprentissage du C++ à grand coup de C je trouve ça très moyen ...

    Gwenhaël

  4. #4
    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 compati !
    Alors j'opterai pour une fonction libre qui fait le new et l'initialisation à NULL.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Merci pour la compassion
    En fait entre temps j'ai réussit à surcharger new[] et delete[].
    Mais je n'arrive pas à savoir si on peux fournir une seconde valeur à new[] (en plus de la taille, pour spécifier qu'elle doit être la valeur à attribuer à la case...
    Gwenhaël

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A mon avis tu peux oublier la surcharge de new, ça ne sert absolument pas à ça. D'ailleurs comment ferais-tu pour faire la distinction entre une allocation de ta classe Machin et une autre allocation, dans ta surcharge ?

    Si tu veux t'économiser une ligne lors de l'initialisation à NULL, tu peux utiliser std::fill_n.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Je crois que je vais faire plaisir à mes profs ... Je vais leur faire un calloc... Histoire de faire un super code C++ ...
    Comme ça je vais pas me prendre la tête, je serais sûr que ça marcheras et ils seront content de ne pas nous apprendre à faire du C++
    Gwenhael

  8. #8
    doccpu
    Invité(e)
    Par défaut
    voir :
    http://c.developpez.com/faq/cpp/?pag..._new_array_dim
    si t'a un problème pour comprendre, contacte moi par mp
    Dernière modification par doccpu ; 05/02/2007 à 16h49.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    J'ai compris la fonction, elle me semble impec.
    Par contre j'ai pas réussit à être sur qu'elle n'est pas dans la stl (interdit par la fac) et vu que on est scencé bosser sous VC6 et que je bosse sous linux(le prof est ok), je sais pas si le prof va pas tout envoyer dans VC6 et dans ce cas marcheras pas ...
    Faut que je lui envoie un mail pour vérifier ...

  10. #10
    doccpu
    Invité(e)
    Par défaut
    Si tu créé une classe qui encapsule ça, t'aura pas de problème de STL, mais si t'a un problème avec un morceau de code il te suffit de me le montrer pour que je te dise ou ça foire. Je gere régulierrement des pointeur sur tableaux dynamiques à plusieurs dimensions.

    Les operations standard de tableaux sont :
    -Créer,
    -Detruire,
    -Ajouter,
    -Inserer,
    -Obtenir(juste pour lire),
    -Modifier(facultatif, uniquement si c'est necésaire),
    -Suprimer(1element),
    -Effacer(tous les elements).

    Le tout est de ne pas se planter ni dans les index, ni avec les adresses de pointeurs.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Ben disont que je n'ai pas de problémes...
    En fait je connais déjà pas trop mal les pointeurs, le C et le C++

    Seulement je cherche à trouver une solution qui soit efficace, qui m'évite de boucler une centaine de fois au lieu d'une dizaine tout ça parce que des profs casse pieds nous imposent des trucs absurdes, et nous brident sur un logiciel vieillissant.

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Seulement je cherche à trouver une solution qui soit efficace, qui m'évite de boucler une centaine de fois au lieu d'une dizaine
    De toute façon quelque soit la manière dont tu l'écris, si tu veux initialiser N éléments il faudra faire N itérations quoiqu'il arrive. En fait j'ai pas vraiment saisi ce que tu voulais éviter d'écrire exactement ?

  13. #13
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par gwenhael
    [...] parce que des profs casse pieds nous imposent des trucs absurdes, et nous brident sur un logiciel vieillissant.
    Crois moi ca te sera utile si par exemple tu veux faires des matrices de pointeurs sur fonctions pour gerer un automate a etat finis, ce que je fais, ou plus simplement des matrices de pointeurs d'objets.
    Quant à l'ancienneté, Stroupstup va sortir une nouvelle version de C++ bientôt avec une nouvelle stdlib et tout et tout, donc t'est loin d'en voir la fin !

    Sinon si tu t'y connait en template et meta-programme tu peux essayer de lire ça:
    http://loulou.developpez.com/tutoriels/cpp/metaprog/
    mais la je pourais pas t'aider vu que j'apprend ce truc moi aussi !

    Cordialement ...

    [Edit] Sans parler que les tableaux dynamiques sonts plus facile a utiliser que les listes chainées, car directement indexables.[/Edit]
    Dernière modification par doccpu ; 05/02/2007 à 18h49.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    C'est le jeu de dames chinoises qui faut refaire a deux contre l'ordi.
    donc c une étoile a 6 branches.
    Au début un joueur prend une branche et l'autre une autre
    Donc une enorme partie des cases au début de la partie pointent sur NULL.
    Donc j'aimerais pouvoir utiliser un truc genre calloc pour allouer l'ensemble des cases à 0.
    Gwenhael

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Quand je disais qu'ils nous cassaient les pieds, c'est que dans une certaine (grande) mesure on se retrouve à utiliser des fonctions venu du C, au final le cours est scencé être là pour nous apprendre la programmation en C++ /objet et non nous faire un truc batard C/C++.
    J'ai déjà eu le cour d'apprentissage à la prog objet à la fac de Bordeaux et faut bien reconnaitre que c'était mieux... Pas de contraintes vis à vis d'un logiciel commercial donc possible de bosser chez soit, et puis apprendre avec un éditeur est sans doute plus formateur dans un premier temps que de ce faire macher le travail... Après c'est sur qu'un IDE est pratique.
    Quand j'en voi certains de ma promo ils savent correctement utiliser VC6 mais sont incapable de se démerder à la main, une fois dans la vie active s'ils doivent bosser sur un autre IDE ils sont carrément mal ...
    Vala c'était ma pensée du soir
    Gwenhaël

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par gwenhael
    Donc une enorme partie des cases au début de la partie pointent sur NULL.
    Donc j'aimerais pouvoir utiliser un truc genre calloc pour allouer l'ensemble des cases à 0.
    Qu'est-ce qui te fais croire qu'un calloc ne va pas devoir itérer sur toutes les cases pour les mettre à 0 ?

    Eventuellement, si la performance est si importante (mais j'en doute, vu le peu de cases en jeu), il est peut-être préférable de justement ne pas initialiser à 0, mais directmeent à la bonne valeur.

    Autrement, comme le nombre de pions est fixé dans ce jeu, peut-être que ça vaudrait le coup de plutôt construire un tableau de pions qui contienne leur coordonnée, qu'un tableau de cases contenant des pions. Je n'ai pas réfléchi au sujet, donc je ne peux pas dire que qui est mieux. Encore une autre possibilité : Stocker ça dans une structure de graphe, afin de mieux rendre le voisinnage à 6 cases de ce jeu.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    il est peut-être préférable de justement ne pas initialiser à 0, mais directmeent à la bonne valeur.
    Impossible toujours et encore le sujet du projet.
    109 cases dont une petite poignée a une certaines valeur et les autres à NULL.

    Autrement, comme le nombre de pions est fixé dans ce jeu, peut-être que ça vaudrait le coup de plutôt construire un tableau de pions qui contienne leur coordonnée, qu'un tableau de cases contenant des pions. Je n'ai pas réfléchi au sujet, donc je ne peux pas dire que qui est mieux. Encore une autre possibilité : Stocker ça dans une structure de graphe, afin de mieux rendre le voisinnage à 6 cases de ce jeu.
    Toujours pareil pas le choix.
    Je suis parfaitement ok dans le principe, mais vu que j'ai pas le choix sur un certains nombres d'éléments ...

  18. #18
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par gwenhael
    ....Pas de contraintes vis à vis d'un logiciel commercial donc possible de bosser chez soit, et puis apprendre avec un éditeur est sans doute plus formateur dans un premier temps que de ce faire macher le travail... Après c'est sur qu'un IDE est pratique.
    Le problème d'un logiciel comercial c'est que bien souvent (pour ne pas dire tout le temp) il faut payer une licence. Beaucoups d'entreprises (en particulier les PME) n'ont pas les resources pour payer de telles licences ce qui implique qu'ils sont obligé de se rabatre sur des libs gratuites. Autre considerations : beaucoups d'entreprises font des choix technologiques via (entre autre) des audit. Une fois ce choix fait elle gardent cette technologie pour une duréé qui va de 3 a 10 ans. Te contraindre a ne pas utiliser certaines technologies est un tres bon exercice d'adaptations aux contraintes du metier. Essai de faire avec .

    Citation Envoyé par gwenhael
    Quand j'en voi certains de ma promo ils savent correctement utiliser VC6 mais sont incapable de se démerder à la main, une fois dans la vie active s'ils doivent bosser sur un autre IDE ils sont carrément mal ...
    Justement c'est peut-etre pour ca qu'ils vous imposent la technologie a utilisé. Perso je conseille d'apprendre a utiliser: eclipse, MinGW, MinGW Developer Studio(~= VC++6), wxWidget, QT, QDevelop, Delphi, VB.NET, C# et JAVA + STRUTS. Qui sont les outils les plus utilisés en entreprises.

  19. #19
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par gwenhael
    Impossible toujours et encore le sujet du projet.
    109 cases dont une petite poignée a une certaines valeur et les autres à NULL.
    Par rapport a tes posts precedents tu a surement la liberté de créer tes propres classes.
    donc essai :
    1-d'ecapsuler tes donnees dans des classes,
    2-de gerer ton plateau de jeu et tes joueurs dans des classes differentes(raports a leurs pions)

    Si j'ai bien compris tu devrais pouvoir créer un plateau de cases VIDES et rajouter les pions de chaques joueurs par la suite en indexant les pions de chaques joueurs dans les cases du plateau mais apres la création et l'initialisation a NULL du plateau, ce qui te donnera de la souplesse au niveau de l'emplacement de depart de tes joueurs !

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 88
    Par défaut
    Citation Envoyé par doccpu
    Le problème d'un logiciel comercial c'est que bien souvent (pour ne pas dire tout le temp) il faut payer une licence. Beaucoups d'entreprises (en particulier les PME) n'ont pas les resources pour payer de telles licences ce qui implique qu'ils sont obligé de se rabatre sur des libs gratuites. Autre considerations : beaucoups d'entreprises font des choix technologiques via (entre autre) des audit. Une fois ce choix fait elle gardent cette technologie pour une duréé qui va de 3 a 10 ans. Te contraindre a ne pas utiliser certaines technologies est un tres bon exercice d'adaptations aux contraintes du metier. Essai de faire avec .
    Je suis d'accord et en même temps pas convaincu, car le cours est un apprentissage au C++, donc pour moi ça serait plutôt un apprentissage de méthode de travail en objet, donc pas lié à un logiciel, juste le C++. Et l'idée de la contrainte doit leur être absolument lointaine... Sinon on coche des cases sans trop savoir comment c'est fait derriére mais le langage n'est pas connu ou peu

    Justement c'est peut-etre pour ca qu'ils vous imposent la technologie a utilisé. Perso je conseille d'apprendre a utiliser: eclipse, MinGW, MinGW Developer Studio(~= VC++6), wxWidget, QT, QDevelop, Delphi, VB.NET, C# et JAVA + STRUTS. Qui sont les outils les plus utilisés en entreprises.
    Je suis d'accord mais ça dépasse le cadre de l'apprentissage du C++... Apprendre l'utilisation d'un logiciel devrait être fait une fois que les bases du langage sont acquises.
    Par ailleur le projet qui est globalement assez conséquent (plusieurs niveau de difficultées pour l'ordinateur, sauvegarde et restauration d'une partie, pouvoir rejouer la partie, ...) le tout en moins d'un moins. Sachant que VC6 n'est plus dispo, cher. Il ne reste que deux solutions : travailler à la fac mais il n'y a pas tout le temps des postes dispo, ou télécharger le logiciel... Mais c'est illégal... Donc la fac nous force à pirater...
    Quand à utiliser une version plus récente, ça signifie une phase de modification non négligeable pour le rendre compatible avec VC6 une fois à la fac ( genre iostream.h ou lieu de iostream)

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/12/2005, 14h41
  2. Réponses: 2
    Dernier message: 27/11/2005, 23h36
  3. Nombre de dimensions d'un tableau multidimensionnel
    Par Bruno75 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/07/2005, 10h03
  4. type de donnée tableau multidimensionnel
    Par opheliegomes dans le forum Débuter
    Réponses: 2
    Dernier message: 03/02/2005, 12h29
  5. [langage] tableau multidimensionnel
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2002, 15h58

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