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

Langage C++ Discussion :

problèmes de vector de pointeur vers des tableaux de structure


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut problèmes de vector de pointeur vers des tableaux de structure
    Bonjour à tous, j'ai un petit problème qui m'empêche d'avancer...

    J'ai une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct CelluleElement
    {
    	float   afPos[3];       //coordonnées x,y,z
    	float	fVal;              //niveau de gris du voxel
    }celluleElement;
    Cette structure représente un voxel du volume

    Pour mon programme, j'ai besoin de manipuler des tableaux de CelluleElement de taille constante (CelluleElement[8]) , que je veux insérer dans mon vecteur au travers une fonction récursive.

    J'ai déclaré mon vecteur comme ceci, mais ce n'est pas la bonne méthode...

    vector<CelluleElement*> voCell;

    et je fais un passage par référence à ma fonction.

    Le problème c'est que quand je fais un push_back() toutes les valeurs de mon vecteur prennent la valeur du dernier élément insérer.

    Je devine que mes pointeurs pointent tous vers la même zone mémoire, mais alors comment déclarer mon vecteur pour palier à ce problème?

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

    Informations professionnelles :
    Activité : aucun

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

    Pour commencer, je voudrais attirer ton attention sur le fait que, contrairement au C, une définition de type (qu'il s'agisse d'une énumération, d'une union, d'une structure ou d'une classe) sert de manière automatique à la définition de ce type.

    Il est donc totalement inutile d'utiliser typedef truc{contenu} untype, et tu peux te contenter d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct CelluleElement
    {
    	float   afPos[3];       //coordonnées x,y,z
    	float	fVal;              //niveau de gris du voxel
    };
    Ensuite, je voudrais attirer ton attention sur le fait que l'utilisation de pointeur devrait être réservée aux seuls cas où il n'y a pas moyens de faire autrement, c'est à dire, à des cas tout à fait particuliers, ne serait-ce que parce qu'ils sont souvent associés à la gestion dynamique de la mémoire et aux problèmes qu'elle sous entend.

    Y a-t-il donc la moindre raison pour que tu veuille gérer tes éléments sous la forme de pointeurs

    J'aurais, à titre personnel, tendance à dire que non:
    1. Ta structure ne semble pas être destinée à être utilisée de manière polymorphe
    2. L'objet est parfaitement copiable
    3. L'utilisation de copies (s'il est réellement impossible de les éviter) ne semble pas particulièrement handicapante au vu des performances actuelles du matériel, ni en terme d'utilisation de la mémoire (il n'y a que quatre float par élément), ni en terme de temps (la copie de quatre float est finalement très rapide )
    4. les inconvénients liés à la gestion dynamique de la mémoire sont, à mon sens, très largement supérieurs aux éventuels gains que tu pourrais espérer en terme de performance lors de la copie
    Cependant, tu ne nous donne malheureusement pas assez d'information pour nous permettre de t'aider à résoudre ton problème.

    Pourrais tu donc nous donner le code des différentes fonctions que tu as créées voir, idéalement, un code minimum compilable d'exemple qui reproduise le problème

    En effet, la première règle des forums est "aide nous à t'aider", car les boules de crystal de la plus part des membres sont, malheureusement, en réparation
    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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut
    Tout d'abord merci de m'avoir répondu si vite...

    En fait, je développe un algorithme de marching cube récursif pour la modélisation de surface, j'ai déjà un algorithme qui marche, mais j'essaie de l'optimiser, et pour effectuer cela je veux enregistrer mes cellules récursivement.

    Mes cellules sont des tableaux de 8 CelluleElement représentant les 8 sommets du cube
    Citation Envoyé par koala01 Voir le message
    Salut, et bienvenue sur le forum.

    Ensuite, je voudrais attirer ton attention sur le fait que l'utilisation de pointeur devrait être réservée aux seuls cas où il n'y a pas moyens de faire autrement, c'est à dire, à des cas tout à fait particuliers, ne serait-ce que parce qu'ils sont souvent associés à la gestion dynamique de la mémoire et aux problèmes qu'elle sous entend.

    Y a-t-il donc la moindre raison pour que tu veuille gérer tes éléments sous la forme de pointeurs

    J'aurais, à titre personnel, tendance à dire que non:
    1. Ta structure ne semble pas être destinée à être utilisée de manière polymorphe
    2. L'objet est parfaitement copiable
    3. L'utilisation de copies (s'il est réellement impossible de les éviter) ne semble pas particulièrement handicapante au vu des performances actuelles du matériel, ni en terme d'utilisation de la mémoire (il n'y a que quatre float par élément), ni en terme de temps (la copie de quatre float est finalement très rapide )
    4. les inconvénients liés à la gestion dynamique de la mémoire sont, à mon sens, très largement supérieurs aux éventuels gains que tu pourrais espérer en terme de performance lors de la copie
    Cependant, tu ne nous donne malheureusement pas assez d'information pour nous permettre de t'aider à résoudre ton problème.
    Le problème c'est que je traite des volumes de 512*512*512 voxels c'est pour ça que j'avais l'idée d'utiliser des pointeurs et un vecteur pour n'ajouter que les cellules à traiter et limiter l'occupation mémoire...

    Sachant qu'à la fin de mon algorithme le vecteur à approximativement une taille de 1500000 cellules de 8 CelluleElement

    Donc 4*4*8*1500000=192000000 octets

    En effet l'utilisation des pointeurs est discutable car toutes les cellules sont différentes, et je n'y accède que deux fois chacune dans mon programme...

    En fait, j'utilise un vecteur de pointeur car je n'ai pas réussi à faire un vecteur de tableau de structure.

    Merci de votre aide, je reste connecter pour répondre aux questions si tout n'est pas clair

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Par défaut
    Bonjour à tous,

    J'ai déclaré mon vecteur comme ceci, mais ce n'est pas la bonne méthode...
    vector<CelluleElement*> voCell;
    Si, c'est comme ça que j'ai toujours déclaré mes vecteurs.
    et je fais un passage par référence à ma fonction.

    Le problème c'est que quand je fais un push_back() toutes les valeurs de mon vecteur prennent la valeur du dernier élément insérer.
    Peux tu poster un exemple de ton code, qui peut nous expliquer comment tu fais ton passage par référence a ta fonction (et quelle fonction ?). Et comment tu définis les pointeurs que tu ajoutes à ton vecteur ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut
    pour mehdi :

    l'intitulé de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MarchingCube(
    const int *aiDim,
    const float *fPosBegin,
    const CROI &poRoi,
    const float *afNewPHYO,
    const int *aiDDO,
    unsigned char *aucCellSetting,
    vector<CelluleElement*> &voCell,
    unsigned int *aiPosCorres)
    et ce que j'insère dans le vecteur :

    déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CelluleElement	aoCell[8];
    insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voCell.push_back(*aoCell);

    peut-être serait-ce plus simple d'avoir un vecteur de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<CelluleElement[8]> voCell

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Par défaut
    Si j'ai bien compris tu veux insérer les 8 éléments de ton tableau aoCell dans un vecteur.
    A ta place j'essayerais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<CelluleElement*> voCell;
    CelluleElement	aoCell[8];
    for(i=0; i<8;i++)
         voCell.push_back(&aoCell[i]);

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut
    Cela ne résout pas le problème, les éléments sont identiques 8 à 8...

    En fait, je veux construire mes cellules récursivement, et arrivé à un certain niveau de récursivité je veux enregistrer ma cellule dans le vecteur.

    La question est pourquoi les pointeurs de mon vecteur pointent sur la même cellule?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut
    résolution du problème :

    déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CelluleElement	*aoCell;
    initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aoCell=new CelluleElement[8];
    insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voCell.push_back(aoCell);
    en fait, il manquait l'initialisation...

    En déclarant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CelluleElement	aoCell[8];
    cela ne fonctionne pas...

  9. #9
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Citation Envoyé par julienmalin Voir le message
    La question est pourquoi les pointeurs de mon vecteur pointent sur la même cellule?
    Non, la question serait plutôt : Mais qu'est-ce que tu essayes de faire à vrai dire ?

    Tes messages sont difficile à décrypter. Après plusieurs relecture je n'ai toujours pas compris qui, comment et où sont crée tes CelluleElement, quel est le rôle de ce mystérieux vecteur, que doit-il contenir avant/après l'algo, etc..

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

Discussions similaires

  1. Tableaux de pointeurs vers des objets
    Par Pinou421 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/07/2013, 12h59
  2. Réponses: 11
    Dernier message: 25/07/2011, 13h34
  3. Réponses: 2
    Dernier message: 18/07/2010, 11h43
  4. Réponses: 2
    Dernier message: 12/10/2006, 20h28
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

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