Vector to CArray

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Vector to CArray

Post by mesajflaviu » 25 Aug 2014, 11:11

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; 
};



User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Vector to CArray

Post by bu7ch3r » 25 Aug 2014, 13:33

Mai bine ii bagi un & lui GetBitmaArray si pui un ::reserve in LoadBitmap decat C(4)Array.
Cu stima,
Lupu Claudiu

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 25 Aug 2014, 14:34

Motivul pentru care vreau sa inlocuiesc acel vector este pentru ca nu vreau sa mixez MFC cu STL ...

Viorel
Microsoft MVP
Microsoft MVP
Posts: 287
Joined: 13 Jul 2007, 12:26

Re: Vector to CArray

Post by Viorel » 25 Aug 2014, 21:05

Cred că-l poți înlocui cu CArray<CArray<COLORREF>>.

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 26 Aug 2014, 09:33

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 ?

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Vector to CArray

Post by Silviu Ardelean » 26 Aug 2014, 12:48

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.
Last edited by Silviu Ardelean on 26 Aug 2014, 14:01, edited 3 times in total.

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 26 Aug 2014, 13:37

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();

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Vector to CArray

Post by Silviu Ardelean » 26 Aug 2014, 14:39

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.

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 27 Aug 2014, 09:42

O sa incerc sa returnez BitmapData cu pointer, sa vad ce iese .. multumesc.

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 27 Aug 2014, 10:43

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; 
};

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Vector to CArray

Post by bu7ch3r » 27 Aug 2014, 11:51

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:)
Last edited by bu7ch3r on 20 Feb 2015, 10:04, edited 1 time in total.
Cu stima,
Lupu Claudiu

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 27 Aug 2014, 12:20

smart_pointer nu pot sa folosesc, fiindca vreau sa folosesc aceasta clasa si in VC6. Da, ai dreptate, pentru astazi, ajung problemele de acum ...

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Vector to CArray

Post by bu7ch3r » 27 Aug 2014, 22:09

Poti sa tragi un sp in cateva linii de cod. Sp+rc au fost chestii triviale inainte de standard, boost sau alte nebunii;)
Cu stima,
Lupu Claudiu

mesajflaviu
Membru++
Membru++
Posts: 684
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Vector to CArray

Post by mesajflaviu » 28 Aug 2014, 11:01

O sa incerc sa returnez tipul acela de data cu referinta ...

mislaura7
Junior
Junior
Posts: 1
Joined: 06 Feb 2015, 12:26
Judet: Bacău

Re: Vector to CArray

Post by mislaura7 » 06 Feb 2015, 12:27

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 ?
sajid33

Post Reply