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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    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