Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
652 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Desallocation d'un tableau a trois dimension

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Desallocation d'un tableau a trois dimension

n°1050192
EvilRyoga
Posté le 17-04-2005 à 17:51:13  profilanswer
 

Salut,
J'ai un petit soucis au niveau de la désallocation d'un tableau a trois dimension.
J'initialise mon tableau comme ceci :
 
tableauUVFaces = new float**[nbUVFaces];
for (i=0; i < nbUVFaces; i++) {
   tableauUVFaces[i] = new float*[3];
   for (j=0; j < 3; j++) {
      tableauUVFaces[i][j] = new float[3];
   }
}
 
et ensuite je l'efface comme cela :
delete[] tableauUVFaces;
 
Cela ne me donne aucune erreur mais je me demande si ca me libere bien ainsi tout la mémoire.
Si quelqu'un pouvait m'éclairer à se sujet, je lui en serais très reconnaissant...
Je n'ai pas trouvé de réponse à ce sujet sur d'autre posts mais j'ai peut etre mal cherché...
Merci à celui qui me répondra.
+++

mood
Publicité
Posté le 17-04-2005 à 17:51:13  profilanswer
 

n°1050194
chrisbk
-
Posté le 17-04-2005 à 17:52:33  profilanswer
 

bin non, pour un new tu dois avoir le delete associé, donc vala
 
toi tu fais un importeur de données 3d [:god]


---------------
NP: HTTP Error 764 Stupid coder found
n°1050197
Tarabiscot​e
Posté le 17-04-2005 à 17:54:19  profilanswer
 

Tu dois faire autant de delete que de new si tu veux libérer toute la mémoire.
 
Arf trop tard ;)


Message édité par Tarabiscote le 17-04-2005 à 17:55:21
n°1050207
Taz
bisounours-codeur
Posté le 17-04-2005 à 18:06:29  profilanswer
 

oh le massacres :/
 
tu veux pas au moins utiliser une banale
 
struct XYZ { float x; float y, float z };
 
pour limiter la fragmentation mémoire ?

n°1051684
maxmoi_la
Posté le 19-04-2005 à 02:06:31  profilanswer
 

Taz a écrit :

oh le massacres :/
 
tu veux pas au moins utiliser une banale
 
struct XYZ { float x; float y, float z };
 
pour limiter la fragmentation mémoire ?


 
Je comprend ce que tu veux dire mais tu n'es pas assez precis il me semble, car
"new float[3]" est identique à "new XYZ" en ce qui concerne la fragmentation du moins.
 
le mieux dans ce cas pour eviter la fragmentation est ceci
 

Code :
  1. typedef float Matrix3x3[3][3];
  2. void function()
  3. {
  4.    // l'allocation ce fait comme ceci
  5.    Matrix3x3* tableauUVFaces = new  Matrix3x3[nbUVFaces];
  6.    // l'acces au differentes cellules est indexé comme ceci
  7.    for (int i = 0; i < nbUVFaces; i++)
  8.      for(int j = 0; j < 3; j++)
  9.        for(int k = 0; k < 3; k++)
  10.          tableauUVFaces[i][j][k] = f(i,j,k);
  11.   // la liberation de la memoire ce fait comme ceci.  
  12.   delete tableauUVFaces;
  13. }


Message édité par maxmoi_la le 19-04-2005 à 02:10:00
n°1051712
EvilRyoga
Posté le 19-04-2005 à 08:24:47  profilanswer
 

Je suis en effet en train de réaliser un importeur de fichier ase (3ds au format ascii) pour mon projet de master premiere annee. Je dois en fait faire un salon de discussion en 3d.
J'avais pensé aux structs mais je préfère utiliser un tableau pour rendre plus simple l'utilisation des commandes opengl. Par exemple, glVexter3fv( tableau3 );
Je vais essayer la solution de maxmoi_la.
Merci pour toutes vos réponses.
(^-^)

n°1051718
chrisbk
-
Posté le 19-04-2005 à 08:39:22  profilanswer
 

glVertexMachin, c'est le mal
 
regarde plutot au moins du coté des glArray ou chaipuquoi


---------------
NP: HTTP Error 764 Stupid coder found
n°1051736
Taz
bisounours-codeur
Posté le 19-04-2005 à 09:03:44  profilanswer
 

non c'est pas pareil, mais bon, je crois bien que t'es à des centaines d'années lumières de ces problèmes de fragmentation mémoire ... quel massacre

n°1051737
Taz
bisounours-codeur
Posté le 19-04-2005 à 09:04:29  profilanswer
 

d'ailleurs, je suis con, nul besoin de struct, tu peux allouer d'un coup N tableau de 3 éléments.

n°1051746
EvilRyoga
Posté le 19-04-2005 à 09:13:14  profilanswer
 

LoL, c'est vrai pour les glVertex mais j'utilise glCallList et du coup ca commence a devenir bien compliqué avec les glArray. Faut que je fasses une version qui marche et j'essayerai apres d'optimiser...
Sinon j'ai fait un delete[] tableauUVFaces.
 
http://drouet.aurelien.free.fr/PSTL/

mood
Publicité
Posté le 19-04-2005 à 09:13:14  profilanswer
 

n°1051766
poule55
Posté le 19-04-2005 à 09:29:32  profilanswer
 

coucou tout le monde j'ai un petit doute pour supprimer le tableau de la mémoire, ca serais pas plutot du genre :  
 
<code>
for(int i=0;i<nbUVFaces;i++)
  for(int j=0;j<3;j++)
    for(int k=0;k<3;k++)
      free(tableauUVFaces[i][j][k]);
</code>
 
c'est peut etre pas ca mais c'est juste pour savoir

n°1051825
Taz
bisounours-codeur
Posté le 19-04-2005 à 10:05:58  profilanswer
 

ignoble
 
 

Code :
  1. #include <cstddef>
  2. #include <new>
  3. #ifdef DEBUG
  4. #include <iostream>
  5. #endif
  6. template<typename T>
  7. T** make(size_t d1, size_t d2)
  8. {
  9.   T **matrix;
  10.   unsigned char *storage;
  11.   size_t header_size, data_size;
  12.   header_size = d1 * sizeof(T*);
  13.   data_size   = d1 * d2 * sizeof(T);
  14.   storage = new unsigned char[header_size + data_size];
  15. #ifdef DEBUG
  16.   std::cout << "Allocated " << (header_size + data_size) << "B at "
  17.     << static_cast<void*>(storage) << '\n'
  18.     << "header size = " << header_size << "B \n"
  19.     << "data_size   = " << data_size << "B \n";
  20. #endif
  21.   matrix = new (storage) T*[d1];;
  22.   for(size_t i = 0; i < d1; ++i)
  23.     {
  24.       size_t offset = 0;
  25.       offset += header_size;
  26.       offset += d2 * i * sizeof(T);
  27. #ifdef DEBUG
  28.   std::cout << "Allocated " << (d2 * sizeof(T)) << "B at "
  29.     << static_cast<void*>(storage + offset) << '\n';
  30. #endif
  31.       matrix[i] = new (storage + offset) T[d2];
  32.     }
  33.   return matrix;
  34. }
  35. template<typename M, typename E>
  36. void fill3(M &m, size_t x, size_t y, size_t z, const E &e)
  37. {
  38.   for(size_t i = 0; i < x; ++i)
  39.     for(size_t j = 0; j < y; ++j)
  40.       for(size_t k = 0; k < z; ++k)
  41. m[i][j][k] = e;
  42. }
  43. template<typename M, typename N>
  44. bool equal3(const M &m, const N &n, size_t x, size_t y, size_t z)
  45. {
  46.   for(size_t i = 0; i < x; ++i)
  47.     for(size_t j = 0; j < y; ++j)
  48.       for(size_t k = 0; k < z; ++k) {
  49. if(m[i][j][k] != n[i][j][k]) return false;
  50.       }
  51.   return true;
  52. }
  53. int main()
  54. {
  55.   const size_t X = 10, Y = 20, Z = 30;
  56.   typedef double Inner[Z];
  57.   Inner **m1, **m2;
  58.   m1 = new Inner*[X];
  59.   for(size_t i = 0; i < X; ++i)
  60.     m1[i] = new Inner[Y];
  61.   m2 = make<Inner>(X, Y);
  62.   fill3(m1, X, Y, Z, 3.14);
  63.   fill3(m2, X, Y, Z, 3.14);
  64.   bool eq = equal3(m1, m2, X, Y, Z);
  65.   for(size_t i = 0; i < X; ++i)
  66.     delete m1[i];
  67.   delete m1;
  68.   delete m2;
  69.   return eq;
  70. }


 
 
un petit exemple avec 2 techniques pour faire des allocations plus sympa pour la fragmentation de la mémoire.
 
1) vu que la taille des éléments interne est fixe (pour toi double[3]) et bien il faut s'en servir -> m1
2) j'avais dans un coin un truc pour allouer une matrice de manière contigüe. une matrice2D de double[3] et voilà, c'est plié.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Desallocation d'un tableau a trois dimension

 

Sujets relatifs
probleme de bordure de tableauComment rendre un tableau insécable
Découpage,et rempir un tableauRécupérer en php les valeurs d'un tableau excel d'une feuille Html
transfert de tableau entre 2 fichiers phpEspace entre un tableau et le bord de page
Mon tableau s'agrandit avec le texte... HelpTableau automatique des scores...
taille des cases d'un tableau[Javascript] Ajouter une ligne a un tableau
Plus de sujets relatifs à : Desallocation d'un tableau a trois dimension


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR