Vector to CArray

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Vector to CArray

Post by Ovidiu Cucu » 20 Feb 2015, 00:35

Silviu Ardelean wrote:
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.
Serios? :)



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Vector to CArray

Post by Ovidiu Cucu » 21 Feb 2015, 14:42

Silviu, nu este o problema de "puritate sau impuritate MFC".
Atunci cand incerci sa copii un obiect de tip CArray, compilatorul tipa si pe buna dreptate.
De ce oare?
Simplu, CArray este derivata din CObject iar in CObject constructorul de copiere si operatorul egal este declarat private.

Code: Select all

	// Disable the copy constructor and assignment by default so you will get
	//   compiler errors instead of unexpected behaviour if you pass objects
	//   by value or assign objects.
protected:
	CObject();
private:
	CObject(const CObject& objectSrc);              // no implementation
	void operator=(const CObject& objectSrc);       // no implementation
De ce oare?
Pai simplu, ca sa evite situatia in care un architect grabit s-ar apuca sa genereze cod cu "clone" la clase derivate din CObject care tin un handle la o fereastra, resursa GDI, whatsoever.
Daca una dintre clone inchide acel handle (sa zicen ca e o fereastra care este distrusa), clelalte clone devin un fel de zombie iar aplicatia ta intra intr-un fel de scenariu post-apocaliptic in care developeri satui de vanat zombies, se inarmeaza cu furci si topoare ca sa taie gatul la boieri, pardon, architecti care au doar o idee despre MFC. :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Vector to CArray

Post by Ovidiu Cucu » 21 Feb 2015, 16:34

@ mesajflaviu
Daca ai de a face cu structuri de date bi-dimensionale, evita pe cat posibil chestii gen vector<vector<...>> sau CArray<CArray<...>> sau...
Poti foarte simplu sa-ti definesti o clasa care-ti tine elementele pe o linie/rand intr-un array iar apoi o alta clasa care tine un array de randuri. E mai usor si e mai C++.
Cat despre metodele de a pune mana pe membrii de tip array dintr-o clasa...
Kernighan si Ritchie au bagat cu mult timp in urma pointerii si C iar Bjarne Stroustrup a mai pus de la el un varf de cutit de referinte in C++.
Asa ca, cu C++11 " move semantics" sau nu, poti scapa de dureri de cap daca folosesti ceva de genul

Code: Select all

class CBar
{
// ...
    CArray<CFoo> m_arrFoo;
public:
 //...
    CArray<CFoo>& GetFooArray()
    {
        return m_arrFoo;
    }
    const CArray<CFoo>& GetFooArray() const
    {
        return m_arrFoo;
    }
//...
};


@ Silviu Ardelean
Despre STL vs. MFC containers in aplicatii MFC (incluzand despre compilatoare care suporta C++11, plus "move semantics", RVO si altele asemenea) sunt dispus sa discutam si o saptamana.
Daca ma convingi cu argumente (nu numai "pe derost" ca-n presa, pardon "pe surse" :) ) ca e mai optim sa folosesc, sa zicem, std::vector<std::string> in loc de CStringArray, ma las de programare.
Daca nu, te rog nu mai arunca cu pietre in contaierele MFC pana nu inveti cat de cat cu ce se manaca!

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Vector to CArray

Post by Ovidiu Cucu » 21 Feb 2015, 17:19

Revenind la OP
mesajflaviu wrote:Am gasit o clasa derivata din CBitmap, care foloseste intern un vector:

Code: Select all

vector<vector<COLORREF>>
[...]
La ce dracu' ar fi bun asa ceva?

CBitmap e o clasa care contine un hahdle la un GDI object (HBITMAP) si expune cateva metode de lucru cu acesta.
Un HBITMAP valid iti poate da printre altele adresa unei zone de memorie in care se afla bitmap-ul respectiv.
De ce ar mai trebui si vector<vector<COLORREF>> cand un bitmap deja ocupa memorie cu carul?
Cum il cheama pe architect? :)

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

Re: Vector to CArray

Post by mesajflaviu » 23 Feb 2015, 22:40

Ovidiu Cucu wrote:Revenind la OP
mesajflaviu wrote:Am gasit o clasa derivata din CBitmap, care foloseste intern un vector:

Code: Select all

vector<vector<COLORREF>>
[...]
La ce dracu' ar fi bun asa ceva?

CBitmap e o clasa care contine un hahdle la un GDI object (HBITMAP) si expune cateva metode de lucru cu acesta.
Un HBITMAP valid iti poate da printre altele adresa unei zone de memorie in care se afla bitmap-ul respectiv.
De ce ar mai trebui si vector<vector<COLORREF>> cand un bitmap deja ocupa memorie cu carul?
Cum il cheama pe architect? :)
Promit sa revin cat de curand cu proiectul pentru care am adaptat vector<vector<COLORREF>> cu CArray<Cbitmap> ... atunci voi stii si proiectantul ... din cate imi aduc aminte, era de pe codeproject ... :)
Last edited by mesajflaviu on 25 Feb 2015, 11:21, edited 1 time in total.

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

Re: Vector to CArray

Post by mesajflaviu » 23 Feb 2015, 22:41

Daca una dintre clone inchide acel handle (sa zicen ca e o fereastra care este distrusa), clelalte clone devin un fel de zombie iar aplicatia ta intra intr-un fel de scenariu post-apocaliptic in care developeri satui de vanat zombies, se inarmeaza cu furci si topoare ca sa taie gatul la boieri, pardon, architecti care au doar o idee despre MFC. :)
:biggrin: Tare !

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

Re: Vector to CArray

Post by mesajflaviu » 23 Feb 2015, 22:50

In multe post-uri, din multe forumuri, mai ales straine, am vazut ca multi programatori spuneau ca e o prostie ca, operatorul de atribuire si contructorul de copiere al clasei MFC CObject sa fie privat ... daca nu pricepi rostul, ai de ales: ori zici ca are un sens [pe care nu-l pricepi inca], ori spui ca e prostie ... a doua cale e cea mai usoara ... :biggrin:

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

Re: Vector to CArray

Post by mesajflaviu » 02 Mar 2015, 14:50

Am promis ca revin cu link-ul spre proiectul unde se folosea vector<vector<COLORREF>>

Atasez si proiectul refacut de mine pentru a merge in batranul VC6:

Code: Select all

#include <afxtempl.h>

class CMovingPixels
{
public:
	CMovingPixels(void);
	CMovingPixels(int x, int y);
	~CMovingPixels(void);

private:
	int m_size_x;
	int m_size_y;
	int m_color_start;
	COLORREF m_color;

public:
	CArray<COLORREF, COLORREF&> m_Array; 
	void SetColor(int value);
	COLORREF GetColor();
	void SetSize(int x, int y);
	void SetStartColor(int start);
	void IterateNewContent();
	const CArray<COLORREF, COLORREF&>& GetArray(){return m_Array;}
};
Sper ca nu am facut iar o gogomanie, caci de functionat functioneaza ca cel original, dar fara acel <vector<vector<...
Attachments
BitmapOpenAndSave.zip
(33.96 KiB) Downloaded 149 times

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Vector to CArray

Post by Ovidiu Cucu » 05 Mar 2015, 11:56

Trecand peste amanunte gen fatait bitmapuri dintr-o parte in alta pixel cu pixel, bune de dat ca tema pentru acasa dar nu de pus intr-o aplicatie "profesionala"...

Code: Select all

////////////////////////////////////////////////////////////////////
// www.codeguru.com
// Creating a bitmap object from a BMP file
// Zafir Anjum
////////////////////////////////////////////////////////////////////
Mai traieste batranul Zafir Anjum? :)
Bineinteles, pe vremea cand traia (sau daca n-a murit inca, pe vremea cand era tanar) se mai justifica sa (re)inventeze roata.
Acuma nu prea, ai 1001 librarii de incarcat/prelucrat/afisat/salvat imagini, gata preparate.
Una (deja cu un pic de iz de mucegai) este GDI+.
Mai nou ai WIC + Direct2D, si mai sunt multe altele third-party, numai sa le cauti.
Daca inca mai folosesti VC6.0, poti pune cu mana headerele si lib-urile de GDI+ sau mai bine, poti instala SDK-ul de GDI+ (vezi link-urile de mai jos).
Daca ai trecut in secolul XXI si folosesti un Visual Studio mai nou, atunci WIC + Direct2D ar fi o buna optiune.
Alternativ, poti folosi clasa ATL/MFC CImage care in spate are GDI+ insa iti poate face viata mai usoara decat sa lucrezi direct cu GDI+.

Vezi si:

Post Reply