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 :

[c++] Tableau avec taille initiale dynamique


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut [c++] Tableau avec taille initiale dynamique
    Bonjour à tous,

    J'ai un tableau et j'aimerai lui attribuer une taille que je ne connais pas encore lors de la compilation, est-ce que c'est possible?

    int size = _vector->size();
    int tab[size];

    Le compilateur me signale une erreur "expected constant expression".

    Qu'est-ce que je peux faire?

    Merci beaucoup

    A bientôt

    Aurélien
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Utiliser un pointeur et de l'allocation dnamique...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int *tab = new int[size];
     
    //et quand tu as fini
    delete[] tab
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Utiliser std::vector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<int> tab(size);
    // et quand tu as fini
    // rien à faire de spécial
    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.

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oups, je crois que je me suis mal exprimé.

    En fait je veux transformer un vector en tab[], c'est pour l'utiliser par la suite dans un memcpy...
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    tu peux utiliser std::copy, qui s'utilise naturellement avec vector. memcpy est plutôt à éviter en C++.
    Sinon, un vector peut s'utiliser sans rien faire de spécial là où un tableau C est attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<int> vect( 10 );
    int *tab = &vect[ 0 ];

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Parceque en fait je fais une apply avec DirectX. Là je m'occupe du générateur de map. Ma class (Ground) prends des valeurs comme la longueur, la hauteur, la largeur, le nombre de "cases" de la map etc...

    J'ai une fonctions qui crée les Vertex dynamiquement, c'est pour ça que j'utilise un vector, puisque je ne connais pas la taille du tableau tout de suite, donc j'ai un algo qui crée les vertex et les ajoute au vector.

    Voici le vector:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Création du vector
    std::vector<CUSTOMVERTEX*>* _vertexVector = new std::vector<CUSTOMVERTEX*>();
    Dans mon algo il y a plusieurs appel du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Création d'un Vertex
    CUSTOMVERTEX* vertex = new CUSTOMVERTEX();
    vertex->x = (*j)->points[k].x;
    vertex->y = (*j)->points[k].y;
    vertex->z = (*j)->points[k].z;
    vertex->color = 0xff000000;
    //Ajout du Vertex dans le vector
    _vertexVector->push_back(vertex);
    Donc ici, j'ai un vector avec les vertex que j'ai besoin.
    La procédure pour envoyer ces vertex à la carte graphique est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //on blok le buffer
    _vertexBuffer->Lock(0, sizeof(vertexTab), (void**)&pVertices, 0);
    //on copy les vertex dedant
    memcpy(pVertices, vertexTab, sizeof(vertexTab));
    //on débloque le buffer
    _vertexBuffer->Unlock();
    vertexTab doit être un tableau CUSTOMVERTEX[].

    Là je cherche à partir du vector<CUSTOMVERTEX*> à faire un tableau CUSTOMVERTEX[]. Mais la taille initiale d'un tableau doit être constante, je peux pas faire CUSTOMVERTEX vertexTab[_vertexVector->size()]...

    J'ai fait des recherches sur std::copy mais je sais pas si il pourrait m'être utile, ou alors je sais pas comment l'utiliser pour mon cas...
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  8. #8
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CUSTOMVERTEX*>* _vertexVector
    Pourquoi pas std::vector<CUSTOMVERTEX> ?

    Là je cherche à partir du vector<CUSTOMVERTEX*> à faire un tableau CUSTOMVERTEX[]. Mais la taille initiale d'un tableau doit être constante, je peux pas faire CUSTOMVERTEX vertexTab[_vertexVector->size()]...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //on bloque le buffer 
    _vertexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pVertices), 0); 
     
    //on copie les vertices dedans
    std::copy(_vertexVector.begin(), _vertexVector.end(), pVertices); 
     
    //on débloque le buffer 
    _vertexBuffer->Unlock();
    PS : évite les préfixage par un underscore, par convention c'est reservé aux implémentations de la SL.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<CUSTOMVERTEX> vertexVector;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CUSTOMVERTEX vertex;
    vertex.x = (*j)->points[k].x;
    vertex.y = (*j)->points[k].y;
    vertex.z = (*j)->points[k].z;
    vertex.color = 0xff000000;
    vertexVector.push_back(vertex);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _vertexBuffer->Lock(0, sizeof(vertexTab), (void**)&pVertices, 0);
    memcpy(pVertices, vertexTab, sizeof(vertexTab));
    _vertexBuffer->Unlock();
    Mais bon, le problème est le même, dans le memcpy je peux pas mettre le vector<CUSTOMVERTEX>, il me faut un CUSTOMVERTEX[].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //error C2057: expected constant expression
    CUSTOMVERTEX vertexTab[vertexVector.size()];
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Oublie memcpy, et relis le code de loulou.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    En fait j'ai une solution mais bon, ça me paraît un peu trop bricolage foireux:

    Faire un tableau de 10 cases par exemple
    Faire une boucle sur le vector
    Si le tableau est plein, on fait un malloc de 10 par exemple
    On met le Vertex à l'index courant
    Une fois sorti de la boucle, on redimensionne le tableau pour qu'il n'y ai plus de place vide...

    Ca sent pas bon comme solution ça :s
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha oui exact, j'vaais pas vu que loulou avait mis ça

    Je test...
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Oublie malloc, oublie même new. vector s'occupe de tout pour toi, Essaye de bien comprendre comment il fonctionne (exemple FAQ). Une fois que tu maîtriseras std::vector, tu auras pas mal progressé en C++

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Alors j'ai recopié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _vertexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pVertices), 0);
    std::copy(vertexVector.begin(), vertexVector.end(), pVertices);
    _vertexBuffer->Unlock();
    et j'obtien cette erreur:

    error C2182: 'reference' : illegal use of type 'void'
    C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility

    sur la ligne "typedef _Ty& reference;" de xutility
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  15. #15
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as bien déclaré pVertices en CUSTOMVERTEX* et non en void* ?

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oups ouais j'avais laissé en VOID*

    Ok ça compile maintenant

    J'vous remercie beaucoup beaucoup


    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2011, 18h28
  2. [HTML] Tableau avec Taille Fixe
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/05/2008, 14h42
  3. Un tableau avec des colonnes dynamiques
    Par Cronycs dans le forum Struts 1
    Réponses: 5
    Dernier message: 07/06/2007, 13h38
  4. [XSL~FO]tableau de taille dynamique
    Par sozie9372 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 13/07/2006, 17h57
  5. [HTML] DIV avec taille dynamique ?
    Par graphicsxp dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/02/2006, 15h42

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