Problema con matrice di Byte

di il
9 risposte

Problema con matrice di Byte

Ciao a tutti, scrivo questo argomento perchè inesperto programmatore C/C++.
Ho bisogno di dichiarare una matrice di Byte a partire dalla seguente situazione:

In un file di header ho la seguente dichiarazione
typedef CArray <BYTE, BYTE> ByteArray;
e in un un secondo file di header la uso così
ByteArray m_MemArray;
Nel mio progetto ho un metodo che ogni volta che viene richiamato, carica da disco nella variabile m_MemArray una immagine.
Ogni volta che il metodo suddetto viene eseguito, la variabile m_MemArray viene svuotata e caricata con una nuova immagine.
Quello di cui ho bisogno è di salvare di volta in volta il contenuto di m_MemArray in una posizione di un array (es. m_MemMatrix) prima che m_MemArray perda il suo contenuto.
Alla fine del codice che richiama il metodo che riempie m_MemArray vorrei che la matrice m_memMatrix contenga n righe per quante immagini sono state caricate da disco.

Il mio dubbio è ora come dichiarare m_MemMatrix, dove dichiararla (forse nello stesso file di header dove è dichiarata m_MemArray) e come utilizzarla per riempirla.

Spero di aver spiegato con un minimo di chiarezza il mio problema. Grazie in anticipo per eventuali risposte.

9 Risposte

  • Re: Problema con matrice di Byte

    Allora prima di tutto lascia stare le implementazioni CArray di MFC quando hai STL che fa delle meraviglie. Detto questo:

    un std::vector<BYTE> può contenere la tua immagine.
    un std::vector<std::vector<BYTE> > può contenere la tua lista delle immagini.

    il std::vector crea una copia ogni volta che aggiunge un elemento nella sua struttura quindi nel tuo caso è utile. Puoi utilizzare le variabili nella stessa classe o in classi separate non è quello il problema. Il problema secondo me è che stai occupando tanta memoria con tutte ste immagini. e dopo un pò ti diventerà dificile lavorarci su.
  • Re: Problema con matrice di Byte

    Grazie skynet per la tempestiva risposta.
    Il mio problema è che sono vincolato ad utilizzare il ByteArray dato che sto collaborando ad un progetto scritto da altre persone che utilizzano questa struttura dati.
    Le immagini che utilizzo sono di pochi Kb al massimo 10 e non ne devo caricare più di una 15na.
    La difficoltà che incontro è legata essenzialmente a come dichiarare questa matrice e in che punto del codice in modo che sia visibile globalmente (immagino che debba essere globale).
    Questa poi mi servirà successivamente quando scriverò un wrapper per C# dal quale poi caricherò le immagini, le manipolerò in qualche modo e le visualizzerò in una GUI.
  • Re: Problema con matrice di Byte

    Usa std::vector<ByteArray>. Rimangono tutte le osservazioni fatte sopra.
  • Re: Problema con matrice di Byte

    Ok, proverò ad utilizzare un vettore.
    Mi rimane però un dubbio; se dichiaro il vettore nel seguente modo
    std::vector<BYTE> m_MemVector
    in un file di header e poi lo utilizzo in un cpp, dopo aver incluso il .h, aggiungendo nuovi elementi in coda, la dimensione del vettore non cambia ed è sempre 1.
    Se invece lo dichiaro nel file cpp dove poi lo utilizzo, mi viene correttamente aggiornato.
    Che cosa mi sta sfuggendo?
  • Re: Problema con matrice di Byte

    Non so. Posta la tua situazione e vediamo. Poi vector<BYTE> ti mette solo un BYTE, non volevi tutte le immagini?
  • Re: Problema con matrice di Byte

    Riporto qui di seguito alcune parti del codice, in modo da dare un'idea dell'utilizzo di vector:

    File header:
    class SOTTOSIST_DB_API ImagePtr : ImageBase
    {
    public:
    	ImagePtr ();
    
    public:
    	~ImagePtr();
    
    	void Reset();
    
    	int GetSize() const;
    
    	bool HasOwnership() const { return m_bOwnBuffer; }
    
    	bool Load     (HANDLE h, CString & ErrString);
    
    	bool Load     (ByteArrayManaged & StreamArray, CString & ErrString);
    
    	std::vector<BYTE> m_MemVector;
    };
    File cpp:
    #include <afxwin.h>
    #include <WinCrypt.h>
    #include <afxtempl.h>
    
    # include <vector>;
    
    #include "Immagini.h"
    
    #ifdef _DEBUG
    	#define new DEBUG_NEW
    #endif
    
    	int n = 0;
    
    ImagePtr::ImagePtr()
    {
    	std::vector<BYTE> m_MemVector;
    }
    
    ImagePtr::~ImagePtr()
    {
    	Reset();
    }
    
    [ ... un po di implementazioni di metodi ...]
    
    // metodo temporaneo per verificare il funzionamento di vector
    bool ImagePtr::CreateVector()
    {	
    	m_MemVector.push_back(m_MemArray.GetData());
    	n = m_MemVector.size();
    
    	return true;
    }
    
  • Re: Problema con matrice di Byte

    
    std::vector<BYTE> m_MemVector;
    
    ..................
    
    
    
    ImagePtr::ImagePtr()
    {
       std::vector<BYTE *> m_MemVector;
    }
    
    
    bool ImagePtr::CreateVector()
    {   
       m_MemVector.push_back(m_MemArray.GetData());
       n = m_MemVector.size();
    
       return true;
    }
    
    Come vedi stai confondendo le cose. Da una parte hai una variabile definita come vector<BYTE>, dall'altra hai vector<BYTE *>.

    Nel push_back stai mettendo solo l'indirizzo dell'inzio dati e non tutti i dati. io farei una cosa così:
    
    std::vector<BYTE> m_immagine;
    ........
    const size_t sz = m_MemArray.GetSize();
    const BYTE *ptr = m_MemArray.GetData();
    m_immagine.reserve(sz);
    std::copy(ptr, ptr + sz, m_immagine.begin());
    
  • Re: Problema con matrice di Byte

    Scusami skynet,
    ho sbagliato a postare il codice; ho messo una versione di prova dove le due dichiarazioni erano incongruenti.
    Ho corretto il codice nel post precedente ma rimane il fatto che non funziona ancora.
    C'è da precisare che la variabile m_MemArray contiene una sola immagine per volta e non tutte insieme; queste vengono lette da disco una ad una e prima che venga letta la successiva, voglio salvare il contenuto di m_MemArray in una nuova posizione di vector.
    Quando tutte le immagini saranno state lette da file, m_MemVector le conterrà tutte.
  • Re: Problema con matrice di Byte

    Spiegami una cosa. Questa classe chiamata ImagePtr è incaricata alla gestione di un solo immagine giusto? se è così allora il vector non deve stare quì ma nella classe/modulo/main che gestisce la classe ImagePtr. Il vector sarà definito come std::vector<ImagePtr> e ogni cella del vettore conterrà un immagine.
    
    std::vector<ImagePtr> m_immagini;
    ImagePtr thisImage;
    .......
    
    m_immagini.push_back(thisImage);
    
    il vettore per definizione copia l'oggetto.
Devi accedere o registrarti per scrivere nel forum
9 risposte