CStringArray in CMap

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

CStringArray in CMap

Post by mesajflaviu » 24 May 2011, 18:54

Intr-o clasa derivata din CObject as vrea sa serializez niste variabile membru de tip CMap. Si pentru ca aceste obiecte CMap ar putea creste mult , m-am gandit sa pun valori in aceste CMap-uri pointeri de tip CStringArray :

Code: Select all

// Pack.h
	CMap<CString,LPCTSTR,CStringArray*,CStringArray*> m_mapType;
in care cheia este de tip CString. Toate bune pana aici :

Code: Select all

void CPack::SomeFunction()
{
	CFile file;
	CString sFileName;
	::GetModuleFileName(NULL,sFileName.GetBuffer(_MAX_PATH),_MAX_PATH);
	sFileName.ReleaseBuffer();
	sFileName = sFileName.Left(sFileName.ReverseFind('\\') + 1);
	sFileName += _T("test.xyz");

	CString sTemp = _T("test value");
	CStringArray* psaTest = new CStringArray;
	psaTest->Add(sTemp);
	sTemp = _T("test value 2");
	psaTest->Add(sTemp);
	m_mapType[_T("index")] = psaTest;

	if(! file.Open(sFileName,CFile::modeCreate | CFile::modeWrite))
	{
		AfxMessageBox("can't open file for writing");
		return;
	}
	CArchive ar(&file,CArchive::store);
	m_mapType.Serialize(ar);

	ar.Close();
	file.Close();
	psaTest->RemoveAll();
	delete psaTest;

	///	read	/////
	if(! file.Open(sFileName,CFile::modeRead))
	{
		AfxMessageBox("can't open file for reading");
		return;
	}
	CArchive ar2(&file,CArchive::load);
	m_mapType.Serialize(ar2);

	TRACE("%d\n",m_mapType.GetCount());    // result 1
}
dar nu stiu cum sa recuperez continutul obiectului m_mapType !? ( CStringArray-ul din CMap )

Am incercat asa :

Code: Select all

	CStringArray* psaRes = new CStringArray;
	if(m_mapType.Lookup(_T("index"),psaRes))AfxMessageBox("Found index");
	else AfxMessageBox("Not found");
	psaRes->RemoveAll();
	delete psaRes;
codul imi spune ca gaseste 'index'-ul dar la sfarsit totul crapa cu un ASSERT de toata minunea (array_s.cpp , line 92).

Orice ajutor este binevenit . Multumesc anticipat.



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

Re: CStringArray in CMap

Post by Ovidiu Cucu » 24 May 2011, 21:36

Exemplul urmator arata cum adaug elemente la map, cum caut dupa o cheie si cum la urma fac curatenie:

Code: Select all

   CMap<CString, LPCTSTR, CStringArray*, CStringArray*> map;

   // Cum adaug elemente
   CStringArray* pArrIn = new CStringArray;
   pArrIn->Add(_T("Cell 0-0"));
   pArrIn->Add(_T("Cell 0-1"));
   pArrIn->Add(_T("Cell 0-2"));
   map.SetAt(_T("Key 0"), pArrIn);

   pArrIn = new CStringArray;
   pArrIn->Add(_T("Cell 1-0"));
   pArrIn->Add(_T("Cell 1-2"));
   map.SetAt(_T("Key 1"), pArrIn);
   // s.a.m.d.

   // Cum caut dupa dupa o cheie
   CStringArray* pArrOut = NULL;
   if(map.Lookup(_T("Key 0"), pArrOut))
   {
      const int nSize = pArrOut->GetSize();
      for(int nIndex = 0; nIndex < nSize; nIndex++)
      {
         CString str = pArrOut->GetAt(nIndex);
         // s.a.m.d.
      }
   }

   // Cum fac curatenie
   POSITION pos = map.GetStartPosition();
   while(NULL != pos)
   {
      CString strKey;
      CStringArray* pArr = NULL;
      map.GetNextAssoc(pos, strKey, pArr);
      pArr->RemoveAll();
      delete pArr;
   }
   map.RemoveAll();
Cu serializarea e putin mai nashpa.
Nu poti folosi pur si simplu CMap::Serialize pentru ca, odata ce contine pointeri, ea nu stie sa serializeze altceva decat... pointeri.
Eu sugerez sa scrii o clasa, sa-i zicem CMapStringToStringArray in care sa implementezi inclusiv functia de serializare.

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

Re: CStringArray in CMap

Post by mesajflaviu » 24 May 2011, 21:54

Interesant ... multumesc de exemplificari , o sa incerc sa implementez serializarea acestui obiect CMap.

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

Re: CStringArray in CMap

Post by mesajflaviu » 24 May 2011, 22:00

Ma gandesc ca daca pana la urma la trebuie sa serializez valorile din pointerii CStringArray , atunci n-are nici un rost sa folosesc pointeri CStringArray* ...

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

Re: CStringArray in CMap

Post by Ovidiu Cucu » 24 May 2011, 22:15

mesajflaviu wrote:Ma gandesc ca daca pana la urma la trebuie sa serializez valorile din pointerii CStringArray , atunci n-are nici un rost sa folosesc pointeri CStringArray* ...
Ba DA, are rost si inca cum...
Nu stii la design time cate elemente va contine map-ul la run-time.
Asta-i principalul motiv pentru care s-a inventat alocarea dinamica si nu pentru "economie de spatiu". ;)

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

Re: CStringArray in CMap

Post by Ovidiu Cucu » 25 May 2011, 11:03

Am scris o clasa CMapStringToStringArrayPtr derivata din CMapStringToPtr care cred ca are cam tot ce-ti trebuie.
Am implementat serializarea (poti sa vezi ca n-a fost deloc greu) plus cateva functioare care sa faca viata programmerului mai usoara (StoreToFile, LoadFromFile, etc).

Pentru si mai putin cod scris in partea de "client" s-ar putea deriva de aici si adauga metode cu care sa lucrezi direct cu strigurile din array-uri, sa-i zicem CStringArrayMap.
Attachments
MapTest.zip
(9.91 KiB) Downloaded 272 times

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

Re: CStringArray in CMap

Post by mesajflaviu » 25 May 2011, 13:56

Simplu si la obiect , exact ce imi trebuia ! ... de multam ii plin podu ? Sper sa ma pot revansa vreodata ...

Post Reply