Page 1 of 2

Vector to CArray

Posted: 25 Aug 2014, 11:11
by mesajflaviu
Am gasit o clasa derivata din CBitmap, care foloseste intern un vector:

Code: Select all

vector<vector<COLORREF>>
Cu ce structura de date MFC as putea folosi pentru a inlocui vectorul ?
Asa arata header-ul clasei:

Code: Select all

#include <vector>
using namespace std; 

class CBitmapOp
{
public:
	CBitmapOp(void);
	~CBitmapOp(void);

public:
	BOOL SaveDcToBitmapFile( LPCTSTR szFile, CPaintDC* pDC, CRect rect);
	BOOL WriteDIBToFile( LPCTSTR szFile, HANDLE hDIB);
	HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal ) ;
	BOOL LoadBitmapFileToCBitmap( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette* pPal );
	BOOL GetBitmapPixels(CBitmap& bitmap);
	void SetBitmapDataSize(const int x, const int y);
	vector<vector<COLORREF>> GetBitmapArray();

private:
	int m_PixelNumberX;
	int m_PixelNumberY;
	vector<vector<COLORREF>> BitmapData; 
};

Re: Vector to CArray

Posted: 25 Aug 2014, 13:33
by bu7ch3r
Mai bine ii bagi un & lui GetBitmaArray si pui un ::reserve in LoadBitmap decat C(4)Array.

Re: Vector to CArray

Posted: 25 Aug 2014, 14:34
by mesajflaviu
Motivul pentru care vreau sa inlocuiesc acel vector este pentru ca nu vreau sa mixez MFC cu STL ...

Re: Vector to CArray

Posted: 25 Aug 2014, 21:05
by Viorel
Cred că-l poți înlocui cu CArray<CArray<COLORREF>>.

Re: Vector to CArray

Posted: 26 Aug 2014, 09:33
by mesajflaviu
Multumesc pentru idee, as mai avea o intrebare: la metoda

Code: Select all

CArray<CArray<COLORREF>> GetBitmapArray();
am eroarea:
error C2976: 'CArray' : too few template arguments
cum as putea trece de eroarea asta ?

Re: Vector to CArray

Posted: 26 Aug 2014, 12:48
by Silviu Ardelean
Oarecum offtopic, intr-un context similar unii fug de containerele MFC bazate pe row-pointers spre STL in ideea de-a face usor debugging si aici treaba o poti face mai bine cu containere STL. Bine, in cazul dat cand ai niste octeti nu e vreo imbunatatire folosind std::vector.

Re: Vector to CArray

Posted: 26 Aug 2014, 13:37
by mesajflaviu
Am inlocuit

Code: Select all

CArray<CArray<COLORREF>> GetBitmapArray();
cu

Code: Select all

CArray<CArray<COLORREF, COLORREF>> GetBitmapArray();
iar acuma am
syntax error : missing ',' before identifier 'GetBitmapArray'
ciudat ...
nici asa nu ii place:

Code: Select all

CArray<CArray<COLORREF, COLORREF>, CArray<COLORREF, COLORREF>> GetBitmapArray();

Re: Vector to CArray

Posted: 26 Aug 2014, 14:39
by Silviu Ardelean
mesajflaviu wrote:Am inlocuit

Code: Select all

CArray<CArray<COLORREF>> GetBitmapArray();
Chiar vrei sa copiezi datele tinute in CArray<CArray<COLORREF>> in alte instante de genul via GetBitmapArray() sau doar ai nevoie de acces la acel buffer BitmapData?
Daca da, as zice sa te mai gandesti daca chiar merita sa ai "puritate MFC". Cu un std::vector pe compilator de C++11 si move semantics "copierea" ar trebui sa fie eficienta (shallow copy). Cu vechile containere MFC ai deep copy.
In al doilea caz un pointer/referinta la containerul intern ar fi suficient.

Re: Vector to CArray

Posted: 27 Aug 2014, 09:42
by mesajflaviu
O sa incerc sa returnez BitmapData cu pointer, sa vad ce iese .. multumesc.

Re: Vector to CArray

Posted: 27 Aug 2014, 10:43
by mesajflaviu
Nu imi dau seama ce tip de data pot returna ca pointer la CArray<CArray<COLORREF, COLORREF>> (CArray bidimensional):

Code: Select all

class CBitmapOp
{
public:
	CBitmapOp(void);
	~CBitmapOp(void);

public:
	BOOL SaveDcToBitmapFile(LPCTSTR szFile, CPaintDC* pDC, CRect rect);
	BOOL WriteDIBToFile(LPCTSTR szFile, HANDLE hDIB);
	HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal ) ;
	BOOL LoadBitmapFileToCBitmap( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette* pPal );
	BOOL GetBitmapPixels(CBitmap& bitmap);
	void SetBitmapDataSize(const int x, const int y);
	CArray<CArray<COLORREF, COLORREF>> GetBitmapArray(){return &m_arrBitmapData;}; // <--

private:
	int m_PixelNumberX;
	int m_PixelNumberY;
	CArray<CArray<COLORREF, COLORREF>> m_arrBitmapData; 
};

Re: Vector to CArray

Posted: 27 Aug 2014, 11:51
by bu7ch3r
Nu stiu cum declari un CArray de CArray-uri de DWORDS dar...
Varianta mea e: CArray< CArray<COLORREF> >(intre < CArray si > > este spatiu - am citit pe net si cred ca asta-i smecheria) - incercarea moarte n-are.

Si...

Imi dau cu parerea in alte privinte - care sunt sigur ca sunt irelevante pentru problema ta:

Metoda aia GetBitmapArray intoarce valoare la aray de array. Chiar daca tu ai pus & acolo tot iti copiaza, nici nu stiu daca compileaza de fapt.

Faza e ca tu te invarti in cerc. Ideea e asta:

Ai un membru privat care este destul de mare incat n-ai vrea sa trimiti copie la el in getter.

Deci solutia ar fi sa intorci referinta.
Acum daca intorci referinta si referinta nu e const, dai voie la oricine sa-ti modifice tie array-ul ala - si private in cazul asta nu-si mai are sensul. Poti la fel de bine sa-l faci public, getterul ala e doar asa, de fun.

Nu stiu cum e cu move semantics dar in cazul tau nu prea conteaza ca e MFC sau STL, move sau RVO nu se aplica pe membrii clasei sau pe lvalue tocmai din motivul mai sus mentionat - ca nu vrei sa expui un obiect membru al clasei tale la toti apelantii - ca de asta l-ai pus in clasa si l-ai facut privat - sa nu-l porcaiasca nimeni - si move n-o sa se intample ca e membru si nu vrea nimeni sa lase sa se fure un membru - move e pentru altceva.

Practic tu ai 2 probleme:
1. Sa declari o matrice de CArray-uri de COLORREF-uri.
2. Ai un membru privat pe care vrei sa-l dai la toti. - Bine daca returnezi prin valoare e ok, ca fiecare isi ia copia lui. Daca tu modifici m_arrBitmapData - ceilalti utilizatori ai lui n-o sa stie de ea.
De fapt oricum ai face ai probleme:
Conteaza mult ce faci si cum faci, ca si daca intorci referinta si tu distrugi clasa CBitmapOp - referentiatorii o sa ramana cu, vorba aia, "referinta in soare".
Daca intorci prin valoare fiecare apelant o sa aibe o copie. Daca tu vrei sa propagi modificarile lui m_arrBitmapData in timp real la toti utilizatorii ei/lui(oare CArray e femeie?) atunci ai o problema.
Acum, ca sa fii sigur si smecher -- il faci pe m_arrBitmapData ala smart_pointer si ai rezolvat balciul. - Dar, bineinteles o sa ai alta problema - aceeasi pe care o ai daca intorci referinta si ai 100 de threaduri.
Deci ca sa fie safe cumva ai putea sa-l faci vaca-smartpointer . Adik daca unu vrea sa il editeze atunci copiezi.

O sa ma opresc aici ca ai destule probleme pentru azi si nici n-ai aflat raspunsul la prima intrebare:)

Re: Vector to CArray

Posted: 27 Aug 2014, 12:20
by mesajflaviu
smart_pointer nu pot sa folosesc, fiindca vreau sa folosesc aceasta clasa si in VC6. Da, ai dreptate, pentru astazi, ajung problemele de acum ...

Re: Vector to CArray

Posted: 27 Aug 2014, 22:09
by bu7ch3r
Poti sa tragi un sp in cateva linii de cod. Sp+rc au fost chestii triviale inainte de standard, boost sau alte nebunii;)

Re: Vector to CArray

Posted: 28 Aug 2014, 11:01
by mesajflaviu
O sa incerc sa returnez tipul acela de data cu referinta ...

Re: Vector to CArray

Posted: 06 Feb 2015, 12:27
by mislaura7
problema e ca daca incerc sa inserez vreun rand in aceasta lista imi da eroare ... care sa fie problema : nu am obtinut bine pointer-ul spre CListCtrlEx ? Daca e asa , de ce pot seta coloanele listei ?