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 :

Resize d'un veteur 2D d'une structure personnalis�e.


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par d�faut Resize d'un veteur 2D d'une structure personnalis�e.
    Bonjour,

    Sur les conseils avis�s d'un t�nor C++ du forum, je tente de convertir mes tableaux tab[tailletab] en "vectors".
    Je m'en sors plus ou moins bien dans l'ensemble, mais � un endroit mon compilateur refuse d'ob�ir est plante lamentablement (TI.exe a cess� de fonctionner...). J'ai r�ussi � isoler le code en question mais je n'arrive pas � le corriger :

    Il s'agit d'un .resize() d'un vecteur 2D :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
     m_BitmapVector.resize(m_Header.m_Height, std::vector< rgba >(m_Header.m_Width));
    A savoir que, dans mon .h, j'ai d�fini :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
     typedef struct s_rgba
        {
            unsigned char r;
            unsigned char g;
            unsigned char b;
            unsigned char a;
        } rgba;
    et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::vector< std::vector<rgba> > m_BitmapVector;
    Voil�, comme je ne comprends pas trop d'o� vient l'erreur, je ne sais pas si je vous ai donn� l'ensemble des informations susceptibles de nous aider � r�soudre ce probl�me.

    Merci d'avance!

  2. #2
    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
    Ta fonction demande de retailler le vecteur externe, en utilisant si besoin est des vecteurs internes de la taille que tu indiques. �a ne retaille absolument pas les vecteurs internes existant d�j�. Peut-�tre est-ce l� ton probl�me ?

    Sinon, j'ai tendance � trouver plus simple pour un tableau 2D d'avoir un seul vecteur et d'acc�der aux �l�ments par x + y*width, ou une autre formule du genre.

    J'utilise un vector<vector<T> > si chaque vecteur interne peut avoir une taille diff�rente.
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par d�faut
    Je te remercie JolyLoic de m'avoir r�pondu.
    Je pr�f�rerais utiliser la structure que j'ai d�finie si dessous... �a reste plus clair pour moi, du moins pour l'instant...

    J'ai identifi� une grosse erreur se situant dans ce que contient m_Header.m_Width. Ce n'est pas ce que je veux. Malheureusement je n'ai pas pens� � tester mon code dans des cas num�riques particuliers.

    Si je remplace m_Header.m_Width par une valeur num�rique, mon code ne fait plus d'erreur (ce qui ne veut pas dire qu'il fasse ce que je voudrais, en �cho � ton analyse de mon resize). Du coup, il faut que je r�pare ce m_Header.m_Width.

    Donc voici une nouvelle question : comment je peux faire pour extraire une portion d'un vecteur de char longue de 4 octets vue comme un (unsigned int)?

    L'ancienne version de mon code (portion qui n'�tait pas de moi) utilisait memcopy et strcpy qui sont des fonctions C. Donc j'essaie de m'en d�barasser...

    J'avais :
    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
    37
    // Extrait les infos des deux headers à partir des données brutes (Data) du fichier.
    bool ClassBMPHeaders::Read(unsigned char *Data)
    {
     
    	if(Data==NULL || (Data[0x0]!='B')) return false;    // Si il n'y a pas de données, ou si les données de proviennent pas d'un BMP.
        if(Data[0x1]!='M') m_isWinBmp = false;              // Si Data ne commence pas par "BM", c'est un Bitmap OS/2.
     
    // BITMAPFILEHEADER
        strncpy(m_Type,(char *)Data,2); m_Type[2]='\0';     // Construction de m_Type sur les 2 premiers octets, plus le "\0".
    	memcpy(&m_FileSize,&Data[0x2],4);                   // Extraction de m_FileSize sur les 4 octets suivants.
    	memcpy(&m_Reserved,&Data[0x6],4);                   // Extraction de m_Reserved sur les 4 octets suivants.
    	memcpy(&m_OffBits,&Data[0xA],4);                    // Extraction de m_OffBits qur les 4 octets qui suivent.
        m_FileHeaderSize = 0x0C;                            // Taille de la structure BITMAPFILEHEADER : 2+4+4+4 = 14 octets = 0x0C (en base 8).
     
    // BITMAPINFOHEADER
    	memcpy(&m_InfoHeaderSize,&Data[0xE],4);             // Extraction de m_InfoHeaderSize.
     
    	if ((m_InfoHeaderSize!=0x28)
            &&(m_InfoHeaderSize!=0x0C)
            &&(m_InfoHeaderSize!=0xF0)) return false;       // Si m_InfoHeaderSize est incorrect (cf. doc. pour les valeurs).
     
    	memcpy(&m_Width,&Data[0x12],4);                     // Extraction de m_Width sur les 4 octets suivants.
    	memcpy(&m_Height,&Data[0x16],4);                    // Extraction de m_Height sur les 4 octets suivants.
    	memcpy(&m_Planes,&Data[0x1A],2);                    // Extraction de m_Planes sur les 2 octets suivants.
     
    	if (m_Planes!=0x01) return false;                   // Si m_Planes est incorrect (il doit être égale à 01, d'aprés la doc.).
     
    	memcpy(&m_BitCount,&Data[0x1C],2);                  // Extraction de m_BitCount sur les 2 octets suivants.
    	memcpy(&m_Compression,&Data[0x1E],4);               // Extraction de m_Compression sur les 4 octets suivants.
    	memcpy(&m_ImageSize,&Data[0x22],4);                 // Extraction de m_ImageSize sur les 4 octets suivants.
    	memcpy(&m_XPelsPerMeter,&Data[0x26],4);             // Extraction de m_XPelsPerMeter sur les 4 octets suivants.
    	memcpy(&m_YPelsPerMeter,&Data[0x2A],4);             // Extraction de m_YPelsPerMeter sur les 4 octets suivants.
    	memcpy(&m_ColorUsed,&Data[0x2E],4);                 // Extraction de m_ColorUsed sur les 4 octets suivants.
    	memcpy(&m_ColorImportant,&Data[0x32],4);            // Extraction de m_ColorImportant sur les 4 octets suivants.
     
    	return true;
    }
    Que j'ai transform� (pendant une nuit trop longue vu que je n'ai pas vu qu'il �tait �vident que �a ne marcherait pas vu que je ne renseigne pas la taille du pr�l�vement) en :
    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
    // Extrait les infos des deux headers à partir des données brutes (Data) du fichier.
    bool ClassBMPHeaders::Read(std::vector< char > DataVector)
    {
    	if(DataVector.empty() || (DataVector[0x00]!='B')) return false;  // Si il n'y a pas de données, ou si les données de proviennent pas d'un BMP.
     
    // BITMAPFILEHEADER
        m_Type[0] = DataVector[0x00]; m_Type[1] = DataVector[0x01]; // Construction de m_Type sur les 2 premiers octets.
    	m_FileSize = (unsigned int) DataVector[0x02];                              // Extraction de m_FileSize sur les 4 octets suivants.
    	m_Reserved = (unsigned int) DataVector[0x06];                              // Extraction de m_Reserved sur les 4 octets suivants.
    	m_OffBits = (unsigned int) DataVector[0x0A];                               // Extraction de m_OffBits qur les 4 octets qui suivent.
        m_FileHeaderSize = 0x0C;                                    // Taille de la structure BITMAPFILEHEADER : 2+4+4+4 = 14 octets = 0x0C (en base 8).
     
    // BITMAPINFOHEADER
    	m_InfoHeaderSize = (unsigned int) DataVector[0x0E];                        // Extraction de m_InfoHeaderSize.
    	if ((m_InfoHeaderSize!=0x28)
            &&(m_InfoHeaderSize!=0x0C)
            &&(m_InfoHeaderSize!=0xF0)) return false;               // Si m_InfoHeaderSize est incorrect (cf. doc. pour les valeurs).
     
    	m_Width = (int) DataVector[0x12];                            // Extraction de m_Width sur les 4 octets suivants.
    	m_Height = (int) DataVector[0x16];                           // Extraction de m_Height sur les 4 octets suivants.
     
    	m_Planes = (unsigned int) DataVector[0x1A];                                // Extraction de m_Planes sur les 2 octets suivants.
    	if (m_Planes!=0x01) return false;                           // Si m_Planes est incorrect (il doit être égale à 01, d'aprés la doc.).
     
    	m_BitCount = (unsigned int) DataVector[0x1C];                              // Extraction de m_BitCount sur les 2 octets suivants.
    	m_Compression = (unsigned int) DataVector[0x1E];                           // Extraction de m_Compression sur les 4 octets suivants.
    	m_ImageSize = (unsigned int) DataVector[0x22];                             // Extraction de m_ImageSize sur les 4 octets suivants.
    	m_XPelsPerMeter = (unsigned int) DataVector[0x26];                         // Extraction de m_XPelsPerMeter sur les 4 octets suivants.
    	m_YPelsPerMeter = (unsigned int) DataVector[0x2A];                         // Extraction de m_YPelsPerMeter sur les 4 octets suivants.
    	m_ColorUsed = (unsigned int) DataVector[0x2E];                             // Extraction de m_ColorUsed sur les 4 octets suivants.
    	m_ColorImportant = (unsigned int) DataVector[0x32];                        // Extraction de m_ColorImportant sur les 4 octets suivants.*/
     
    	return true;
    }
    Je regarde les possibilit�s que j'ai (notamment copy() ) mais si tu sais comment faire, je serais d'une ou�e attentive.

    Merci!

    PS : o�
    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
    /*  BITMAPFILEHEADER
        http://msdn.microsoft.com/en-us/library/aa930979.aspx */
        char m_Type[3];                     // La signature du BMP : "BM" (WIN) ou "BA" (OS/2), puis le "\0" de fin de chaîne.
        unsigned int m_FileSize;            // Taille totale du fichier BMP.
        unsigned short int m_Reserved;      // Doit être égale à 00 00 00 00.
        unsigned int m_OffBits;             // Décalage octale du début de fichier vers le début des données(?) du bitmap.
        unsigned int m_FileHeaderSize;      // Taille de la structure BITMAPFILEHEADER.
     
    /*  BITMAPINFOHEADER
        http://msdn.microsoft.com/en-us/library/aa930622.aspx */
        unsigned int m_InfoHeaderSize;      // Taille de la structure BITMAPINFOHEADER.
        int m_Width;                        // Largeur de l'image.
        int m_Height;                       // Hauteur de l'image. Peut être NéGATIVE!
        unsigned short int m_Planes;        // Doit être égale à 01.
        unsigned short int m_BitCount;      // 2^x==[1,(2,) 4, 8, 16, 24, 32] bits par pixel.
        unsigned short int m_Compression;   // Cf. les variables globales "Type de compression".
        unsigned int m_ImageSize;           // Vaut 00 00 00 00 si l'image n'est pas compressée.
        int m_XPelsPerMeter;                // Résolution horizontale.
        int m_YPelsPerMeter;                // Résolution verticale.
        unsigned int m_ColorUsed;           // Nombre de couleurs indexées dans la "table de couleurs". 0 pour avoir toutes les couleurs permises par m_BitCount.
        unsigned int m_ColorImportant;      // Nombre de couleurs nécéssaire à l'affichage de l'image. 0 pour toutes.

Discussions similaires

  1. [XL-2003] Boucle sur une structure personnalis�e ?
    Par pedritodelgado dans le forum Macros et VBA Excel
    R�ponses: 4
    Dernier message: 07/08/2011, 23h01
  2. sizeof() d'une structure
    Par tut dans le forum MFC
    R�ponses: 12
    Dernier message: 29/08/2006, 18h21
  3. Comment mettre en place une structure 3 tiers.
    Par WOLO Laurent dans le forum D�bats sur le d�veloppement - Le Best Of
    R�ponses: 13
    Dernier message: 27/07/2003, 22h01
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    R�ponses: 15
    Dernier message: 23/04/2003, 15h47
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    R�ponses: 6
    Dernier message: 28/05/2002, 18h31

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