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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 : 51
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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...

  6. #6
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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...

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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()];

  10. #10
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Oublie memcpy, et relis le code de loulou.

  11. #11
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Ha oui exact, j'vaais pas vu que loulou avait mis �a

    Je test...

  13. #13
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

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

  16. #16
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2004
    Messages
    1 825
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 1 825
    Par d�faut
    Oups ouais j'avais laiss� en VOID*

    Ok �a compile maintenant

    J'vous remercie beaucoup beaucoup


    A bient�t

+ 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