Umsetzung mit einem Array?
-
Hi,
ich muss aus einer Datei die etwa so aufgebaut ist:
Max;c:\maxmuster;ON;
Peter;D:\PeterMeier;OFF;
Hans;Z:\Wurst;ON;Daten auslesen und den ersten Wert in eine Combobox schreiben.
Das ist ansich auch kein Problem. Allerdings soll
später, wenn z.B. der Eintrag "Max" gewählt wurde, auch gleich
eine Meldung aufgehen, ob dort ON oder OFF als dritter Wert hinterlegt war.Ich frage also die Combobox ab:
GetDlgItem(IDC_STATICNAME)->GetWindowText(name);Nun müsste ich den Wert aus "name" auf dessen dritten Wert in der Textdatei
prüfen (also ON oder OFF).Wie löst man das am besten schon beim ersten parsen der drei Werte?
Mit einem vector, array oder sowas?
-
Z.B. indem du gleich in ein CStringArray einliest.
-
oder macht dir ne struct
struct MyStruct { CString Name; CString Directory; bool state; }und pack die in eine
CMap<CString, CString, MyStruct, MyStruct*> myMapDann kannst du sobald der Name in der ComboBox aufgerufen wird per CMap-Befehl
CString csName = _T( "Max" ); // csName natürlich aus der ComboBox initialisieren MyStruct* pmyStruct; myMap.LookUp( _(csName), pmyStruct ); if( pmyStruct->state ) { // on } else { // off }direkt die passende struct zurückliefern lassen und hast ja dort den Statuswert ON/OFF drin. Die Map hat 'nen kleinen Vorteil gegenüber 'nem Array, dass du Dir da keine Schleife zum Durchsuchen des Namens basteln musst und ist normalerweise schneller (insbesondere bei mehr Daten
).
-
Super. Ich danke euch für die Vorschläge

-
Hmm, ich raffe u.a das mit dem Zeiger noch nicht.
Wenn ich es so mache:struct MyStruct { CString Name; CString Directory; bool state; }; void CmappaDlg::OnBnClickedButton1() { CMap<CString, CString, MyStruct, MyStruct*>wahl; CString csName = _T( "Max" ); MyStruct* mow; mow->Name="Max"; mow->Directory="c:\\"; mow->state=true; wahl.Lookup( _T(csName), mow ); if( mow->state ) { // on } else { // off } }Erhalte ich den Fehler fürs Lookup:
'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::Lookup': Konvertierung des Parameters 2 von 'MyStruct *' in 'MyStruct &' nicht möglich
-
ups ... sry. glaube das sollte besser so lauten. Hab das gestern von unterwegs geschrieben.
hier mal die Struktur
#define MAX_NAME_LENGTH 50 struct MyStruct { TCHAR Name[MAX_NAME_LENGTH]; // 50 halt gegen die maximale namenslänge austauschen TCHAR Directory[MAX_PATH]; // MAX_PATH ist in windef.h auf 260 definiert bool state; };hier der code
CMap<CString, LPCTSTR, MyStruct*, MyStruct*> myMap; MyStruct* pMyStruct = new MyStruct(); CString csName = _T( "test" ); memset( pMyStruct, 0, sizeof( MyStruct ) ); // // hier dann die Struktur mit deinen Werten füllen und // dann in der Map speichern. // _tcscpy_s(pMyStruct->Name, MAX_NAME_LENGTH, csName); //pMyStruct->Name = csName; myMap.SetAt( pMyStruct->Name, pMyStruct ); // // so ... oben wurde die map gefüllt. und so kommst du wieder // an die Objekte ran // MyStruct* pMyStruct2 = NULL; myMap.Lookup(csName, pMyStruct2); // // nicht vergessen den speicher, der mit new reserviert // worden ist wieder freizugeben. Dazu müsste man einmal // mittels schleife/iterator durch die map laufen und den // speicher der MyStruct Strukturen wieder freigeben, wenn // die Objekte in der map nicht mehr gebraucht werden. // CMap<CString, LPCTSTR, MyStruct*, MyStruct*>::CPair* pPair = myMap.PGetFirstAssoc(); while( pPair ) { delete pPair->value; pPair = myMap.PGetNextAssoc(pPair); } myMap.RemoveAll();Gruß
Hiho