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 :

Encore un probleme de tableau


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut Encore un probleme de tableau
    Bonjour tous.

    Voila... J'ai un tableau qui contient une heightmap. Afin de lisser les données contenues dans ce tableaux, je crée un tableaux temporaires. Je copie les données et je calcule les nouvelles. A la fin, je libère le tableau temporaire.

    Puis tout de suite, mais dans une autre fonction, je me sers de ce tableaux. Et là j'obtient n'importe quoi.

    Si avant de réutiliser le tableau, je veux inscrire les données dans un fichier. Pas de problèmes et tout remarche comme il faut.

    Je me dis donc il y a un probleme.

    Comme je suis confus dans mes explications... voici un peu de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void CreateHeightMap()
    {
    // Création du tableau d'altitude du terrain
    m_pfHeightMap = new float[m_uiNbPointX * m_uiNbPointY];
     
     
    // On remplis le tableau en parcourant l'image
    ...
     
    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
      for(unsigned int X=0; X<m_uiNbPointX; X++)
        HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];
     
    //Lissage centre de l'image
    for(unsigned int Y=1; Y<m_uiNbPointY-1; ++Y)
    {
      for(unsigned int X=1; X<m_uiNbPointX-1; ++X)
      {
        m_pfHeightMap[ X + m_uiNbPointX*Y ] =  HeightMap[...]*...+...;    
      }
    }
     
    //Lissage des bords
    idem...
     
    delete[] HeightMap;
     
    //        for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
    //            for(unsigned int X=0; X<m_uiNbPointX; X++)
    //            {
    //               LogDbg(m_pfHeightMap[X + m_uiNbPointX*Y ])<<"\n";
    //            }
    }
    Si je décommente les dernières lignes qui me servent à inscrire mon tableaux dans un fichier, tout est OK (les valeurs dans le fichier et le calcule de mes normales).

    Bref, il doit y avoir un probleme de synchronisation calcule, libération de la mémoire (ou quelque chose comme ça).

    Donc que puis-je faire (std::vector?)

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
      for(unsigned int X=0; X<m_uiNbPointX; X++)
        HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];
    ca serait pas plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
      {
         for(unsigned int X=0; X<m_uiNbPointX; X++)
        HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];
     }

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Corrige moi si je me trompe sleigh mais je pense que le compilateur lui aurait dit un truc genre "obsolete use of Y" si c'etait ca non ?

  4. #4
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    Citation Envoyé par Albenejean
    Bonjour tous.

    Puis tout de suite, mais dans une autre fonction, je me sers de ce tableaux. Et là j'obtient n'importe quoi.

    Si avant de réutiliser le tableau, je veux inscrire les données dans un fichier. Pas de problèmes et tout remarche comme il faut.

    Ce serait pas lié à la manière dont tu passe ton tableau "dans une autre fonction", à tout hasard ?

    T'aurait pas glissé un delete de ton tableau entre le moment où tu le rempli et le moment où tu l'utilise ?

    Ou t'aurais pas fait un m_pfHeightMap=HeightMap;
    par mégarde avant le moment où tu delete HeightMap ?

    ca m'a l'air d'etre ce genre de trucs, mais si ca se trouve je suis complètement à coté.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Citation:

    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
    for(unsigned int X=0; X<m_uiNbPointX; X++)
    HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];

    ca serait pas plutot :
    Citation:

    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
    {
    for(unsigned int X=0; X<m_uiNbPointX; X++)
    HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];
    }
    Ces deux formes sont identiques.

    Ce serait pas lié à la manière dont tu passe ton tableau "dans une autre fonction", à tout hasard ?

    T'aurait pas glissé un delete de ton tableau entre le moment où tu le rempli et le moment où tu l'utilise ?

    Ou t'aurais pas fait un m_pfHeightMap=HeightMap;
    par mégarde avant le moment où tu delete HeightMap ?

    ca m'a l'air d'etre ce genre de trucs, mais si ca se trouve je suis complètement à coté.
    Non. Il n'y a pas de delete. Mon tableau est membre d'une classe. Les fonctions concernées sont aussi membre de la classe.

    De plus je rappelle que si j'ecris le tableaux dans un fichier, tout est OK. Si j'utilise un tableaux de plus petites tailles, tout est OK.

    Je viens de tester et maintenant tout est de nouveau OK. Pourtant je n'ai rien modifié.... Bizarre (j'en reviens à mon idée de probleme de synchro).

  6. #6
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    Citation Envoyé par Albenejean
    Ces deux formes sont identiques.



    Non. Il n'y a pas de delete. Mon tableau est membre d'une classe. Les fonctions concernées sont aussi membre de la classe.

    De plus je rappelle que si j'ecris le tableaux dans un fichier, tout est OK. Si j'utilise un tableaux de plus petites tailles, tout est OK.

    Je viens de tester et maintenant tout est de nouveau OK. Pourtant je n'ai rien modifié.... Bizarre (j'en reviens à mon idée de probleme de synchro).
    Je dirais que le code que tu as copié n'est pas responsable. Je sais pas ce que c'est que des problèmes de synchro.
    T'es sûuuur que tu t'es pas loupé dans la gestion de ton tableau quelquepart (un operator = ou un constructeur par copie qui oublie de dupliquer le tableau)
    J'avais déjà eu des merdes en passant des gros tableaux en argument de fonctions, mais je crois que c'était différent, je passait tout le tableau sur la pile au lieu d'un pointeur et ca faisait des overflow...

    A mon avis il va falloir que tu colles plus de code si tu veux que quelqu'un trouve le bug...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    A mon avis il va falloir que tu colles plus de code si tu veux que quelqu'un trouve le bug...
    Pas de problème, je vais chercher ça.

    Mais cette partie est vraiment simple (normallement) et je n'est AUCUNE erreur si après mes calculs, j'écris quelque chose sur le disque.

    C'est pour ça que je commence à penser à des problemes de gestion de mémoires (et là ça dépasse mes compétences).

    2 minutes et le code est là...

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Extrait de la fonction Create
    {
    ...
    CreateHeightMap(FileHeightMap.c_str());
    CreateMiniTerrain();
    ...
    }


    void CTerrain::CreateHeightMap(const char* FileName)
    {
    ...

    // Création du tableau d'altitude du terrain
    m_pfHeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y < m_uiNbPointY; ++Y)
    {
    for(unsigned int X = 0; X < m_uiNbPointX; ++X)
    {
    m_pfHeightMap[ X + m_uiNbPointX*Y ] = (float)piSurfaceBuffer[X + Y*(LockRect.Pitch)]);
    }
    }

    if( FAILED( TexHeightMap->UnlockRect(0) ) )
    {
    std::string Message = "Erreur lors du Unlock de la texture de densite pour le miniterrain X=";
    LogDbg(Message)<<"\n";
    }
    SAFE_RELEASE(TexHeightMap);

    //Lissage
    float* HeightMap = new float[m_uiNbPointX * m_uiNbPointY];
    for(unsigned int Y=0; Y<m_uiNbPointY; Y++)
    for(unsigned int X=0; X<m_uiNbPointX; X++)
    HeightMap[X + m_uiNbPointX*Y ] = m_pfHeightMap[X + m_uiNbPointX*Y ];

    //idem pour les bords et les coins
    ...

    delete[] HeightMap;

    //LogDbg("\n");
    }

    void CTerrain::CreateMiniTerrain()
    {
    //Calcul des normals
    D3DXVECTOR3 vX;
    vX.x = 0;
    D3DXVECTOR3 vZ;
    vZ.x = 0;
    D3DXVECTOR3 vY0, vY1, vY2, vY3;
    D3DXVECTOR3 tpNormal;
    D3DXVECTOR3* Normals;
    Normals = new D3DXVECTOR3[m_uiNbPointX * m_uiNbPointY];

    //Coin bas gauche
    vX.x = 1;
    vZ.z = 1;
    vX.y = (GetAltitude(1, 0) - GetAltitude(0, 0));
    vZ.y = (GetAltitude(0, 1) - GetAltitude(0, 0));
    D3DXVec3Cross(&vY0, &vZ, &vX);
    D3DXVec3Normalize(&vY0, &vY0);
    //Calcul
    Normals[ 0 ].x = vY0.x;
    Normals[ 0 ].y = vY0.y;
    Normals[ 0 ].z = vY0.z;

    ...
    }

    float CTerrain::GetAltitude(int TileX, int TileY)
    {
    if(m_pfHeightMap != NULL)
    {
    if( TileX<0 )
    TileX=0;
    if( TileX>m_uiNbPointX-1)
    TileX=m_uiNbPointX-1;
    if( TileY<0 )
    TileY=0;
    if( TileY>m_uiNbPointY-1)
    TileY=m_uiNbPointY-1;
    return (m_pfHeightMap[TileX + m_uiNbPointX * TileY]);
    }
    LogDbg("Erreur GetAltitude")<<"\n";
    return 0;
    }
    A noter que si apres mes calcules, j'écris quelque chose sur le disque (ligne en gras), tout est OK. LogDbg n'influe en rien sur le tableau ou la classe.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Je suis passé à des std::vector et tout est nickel chrome

    Si quelqu'un a une explication (probleme de mémoire lors de ""grosses"" (et encore...) allocations).

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

Discussions similaires

  1. [CR8.5] Probleme de tableau
    Par Sto59 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/02/2007, 15h07
  2. jolie probleme de tableau
    Par racoon971 dans le forum C++
    Réponses: 2
    Dernier message: 04/03/2005, 11h31
  3. Réponses: 7
    Dernier message: 16/07/2004, 13h24
  4. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00
  5. [C#] Probleme de tableau
    Par djsbens dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/06/2004, 14h04

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