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

VC++ .NET Discussion :

[C++ .NET] Tableau dynamique


Sujet :

VC++ .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut [C++ .NET] Tableau dynamique
    Bonjour tous le monde

    Voici mon problème :

    au chargement de mon formulaire je dois instantier une variable tableau de type "MACLASSE" ou "MACLASSE" est ma classe de base MAIS je connai pas d'avance la taille de mon tableau, j'ai donc besoin de pouvoir ajouter des éléments à mon tableau de manière dynamique (une structure chaînée ou équivalent (je ne veux pas déclarer par exemple un tableau de 100 éléments ce qui serait soit trop grand soit pas assez et de toute maière pas optimisée)).


    Je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MACLASSE *tt = new MACLASSE *[];
    tt[0]->MA_METHODE();
    Le problème c'est qu'au lancement du programme je recois une exception "index out of range". Comme instancié l'index 0 du tableau au démarrage pour pouvoir l'utiliser ? (et comment ajouter d'autres élements à mon tableau dynamiquement par la même occasion ? )

    On m'a parlé de la fonction "vector" également mais j'aimerai plutôt m'en passer (ce n'est pas moi qui décide).

    Merci d'avance je commence à perdre la tête


  2. #2
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 82
    Points : 92
    Points
    92
    Par défaut
    tu as la classe ListArray qui existe et qui fonctionne comme un liste chainée.

    Tu peux ajouter et supprimer des élements de ta liste sans la surdimmensionner.
    Tu peut mettre toute sorte de valeur (objet, entier, string ...).

    @+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    ok merci

    mais j'ai un problème

    je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ArrayList *Alist = new ArrayList();
    MACLASSE *test = new MACLASSE();
    Alist->Add(test);
    Ensuite je veux utiliser mon objet test qui contient une méthode nommé MAMETHODE et je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Alist[0]->MAMETHODE();
    mais ca ne fonctionne pas il me propose aucun élement quand je fais -> pourtant ma classe MACLASSE possède bien plusieurs méthodes en public.

    Comment faire pour que cela fonctionne ?(j'ai testé regardé sur plusieurs sites mais sans trouver la raison de mon problème)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    bon une solution en faisant un cast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MACLASSE* ti = new MACLASSE;
    ti = static_cast<MACLASSE *>(Alist->Item[0]);
    a partir de ce moment je peux bien accéder au méthode de "MACLASSE" grâce à l'objet "ti" mais existe t'il une méthode plus simple pour enregistrer directement dans mon ArrayList mon objet sans avoir à faire un cast après pour pouvoir l'utiliser ?

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Tu es obligé de caster car le type d'éléments contenus dans ArrayList est Object.
    Les templates avec .NET 2 permettront de faire des collections typées

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par abelman
    Tu es obligé de caster car le type d'éléments contenus dans ArrayList est Object.
    Les templates avec .NET 2 permettront de faire des collections typées
    et ben on en apprend toutes les minutes avec .net Vivement la version 2 du framework alors Je pensai que c'était possible car en cherchant dans MSDN j'ai vu qu'on pouvait enregistrer dans un array list en donnant le type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     myAL->Add( S"brown" );
    Le fait de rajouter S siginifie String n'est-ce pas et on peut également ajouter Object si c'est un objet ce qui est mon cas. A quoi cela sert t'il de préciser le type de l'objet enregistré dans l'ArrayList si on est tout de même obliger de faire un cast si la valeur enregistré est un objet ?

  7. #7
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Toutes les classes de .NET dérivent (directement ou non) de la classe Object.
    Donc ArrayList peut contenir n'importe quel type .NET
    On est pas obligé de préciser le Type (Tu le fais toi car c'est une variable littérale que tu insères et c'est du C++ qui est hybride (.NEt et natif))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System::String* s;
    myAL->Add(s);
    Pour utiliser l'élément du tableau, tu es obligé de caster car pour le compilo, le type d'un elt ArrayList est Object.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myAL->Item[0].ToLower(); // Erreur de compilation ToLower n'est pas membre de la classe Object
    static_cast<System::String*>(Alist->Item[0]).ToLower(); // ça passe bien

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    ok ok c'est très clair merci


    Sujet clos

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    Un autre problème que j'ai depuis un moment

    Dans mon appli je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    using namespace System::Windows::Forms;
     
    ...
     
    Messagebox::Show("test", "test");
    L'erreur renvoyée est :

    MessageBoxA n'est pas un nom de classe ou d'espace de noms

    puis

    System::Windows::Forms::Control::Show : la fonction ne prend pas 2 arguments

    Je précise que je suis en c++ managé avec Visual Studio 2003

  10. #10
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par tidou

    MessageBoxA n'est pas un nom de classe ou d'espace de noms
    MessageBoxA ou MessageBox tout vourt (sans le A) :

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    non mais j'utilise bien MessageBox et PAS MessageBoxA c'est bien ca qui est bizarre

  12. #12
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    C'est que quelque par dans ton code, tu as mis MessageBoxA par erreur : dans Visual Studio, double clic sur l'erreur pour atterir directement dessus dans ton code.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    non non vraiment je n'ai pas mis MessageBoxA lol je ne suis pas encore gateux et je connai bien l'astuce du double clic sur l'erreur pour arriver directement sur la ligne ayant provoquer l'erreur !!!

    il y a bien un "vrai" problème ....

  14. #14
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C'est parce qu'il te manque aussi l'importation de la référence à l'assembly .NET system.windows.forms.dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #using <system.windows.forms.dll>
    using namespace System::Windows::Forms;
    L'explication pour MessageBoxA.

    Vu qu'il te manquait la reference à la 'assembly windows Forms, et qu'il existe dans Win32 une fonction MessageBox, et que certaines fonctions Win32 qui manipulent les chaines de caractères sont en fait des Macros qui redirige sur des fonctions différentes selon que tu sois en Unicode où non, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // déclaration de messageBox dans Win32 ... 
    #ifdef _UNICODE
    #define MessageBox MessageBoxW(.....)
    #else
    #define MessageBox MessageBoxA(.....)
    #endif
    Si tu n'es pas en unicode en C++, MessageBox win32 est en fait MessageBoxA.

    Voilà

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    ok ok merci pour les explications mais je n'arrive toujours pas à le faire fonctionner :-(

    j'ai bien une référence System.Windows.Forms dans mon projet

    puis j''ai ajouté dans mon fichier CPP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #using <system.windows.forms.dll> 
    using namespace System::Windows::Forms;
    puis utilisé MessageBox en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     MessageBox::Show("test", "test");
    L'erreur renvoyée est :

    MessageBoxA n'est pas un nom de classe ou d'espace de noms

    puis

    System::Windows::Forms::Control::Show : la fonction ne prend pas 2 arguments

    Les mêmes erreurs qu'auparavant

  16. #16
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C'est bizarre ton truc, chez moi ça fonctionne
    poste voir toutes tes déclarations using sur le cpp en question (fais un copier coller stp)
    Sinon essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System::Windows::Forms::MessageBox("toto", "toto");

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    donc dans Form1.cpp j'ai ceci en using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #using <system.windows.forms.dll>
    using namespace System::Windows::Forms;
    using namespace monTest; // c est le nom de mon programme 
     
    ...
     
    System::Windows::Forms::MessageBox("toto", "toto");
    Dans les références de mon projet j'ai :

    System.Windows.forms
    System.XML
    System.Drawing
    System.Data
    System
    mscorlib

    voila

    est-ce bien ce que tu voulais ?

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 99
    Points : 72
    Points
    72
    Par défaut
    Ouf voici la solution (merci google )

    Il suffisait de mettre

    #undef MessageBox; après le #include <windows.h>

    If you are doing a #include <windows.h", MessageBox is a macro which expands
    to either MessageBoxA or MessageBoxW depending in whether you have UNICODE
    defined. So your MessageBox::Show then expands to MessageBoxA::Show and the
    compiler says correctly there is no MessageBoxA class or namespace in .NET,
    which is correct. As a workaround try an #undef MessageBox after your
    #include <windows.h>
    Voir ici le thread complet :

    http://groups.google.com/groups?hl=en&lr=&newwindow=1&threadm=OPIbQz46DHA.2760%40TK2MSFTNGP09.phx.gbl&rnum=1&prev=/groups%3Fnum%3D100%26hl%3Den%26lr%3D%26newwindow%3D1%26q%3DMessageBoxA%2Bis%2Bnot%2Ba%2Bclass%2Bor%26btnG%3DSearch

    Topic clos, merci à tous pour votre aide je reviendrai sous peu je pense

  19. #19
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut

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

Discussions similaires

  1. [ASP.NET/C#] Tableau dynamique
    Par baptx dans le forum ASP.NET
    Réponses: 7
    Dernier message: 22/01/2011, 21h00
  2. Réponses: 1
    Dernier message: 27/05/2008, 11h20
  3. [VB.NET]Tableau dynamique - identation
    Par frankiboy dans le forum ASP.NET
    Réponses: 5
    Dernier message: 05/03/2008, 00h23
  4. [1.1][vb.net] création de tableau dynamique
    Par elastoplas dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/12/2006, 09h44
  5. [VB.NET] - affichage dynamique dans un tableau
    Par karibouxe dans le forum ASP.NET
    Réponses: 8
    Dernier message: 20/06/2005, 15h07

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