CStringArray an Methode übergeben?
-
Hallo,
ich habe hier eine Methode, die einen String in einem CStringArray suchen soll.
Ich verwende Visual C++ 6. Leider gibt es anscheinend keinen vordefinierten Suchoperator.
(Link: http://msdn2.microsoft.com/en-us/library/tddz3etf(VS.80).aspx)Nun zu meinem Problem:
Anscheinend kann ich kein CStringArray an eine Methode übergeben.Code:
// MyDlg.cpp int FoundKey = FindInArray( CStringArray MyArray, CString MySearchWord );
Deklariert wurde es so:
// MyDlg.h int FindInArray( CStringArray SearchArray, CString SearchText );
Folgender Fehler wird ausgespuckt:
C:\***\MyDlg.cpp(855) : error C2664: 'FindInArray' : Konvertierung des Parameters 1 von 'class CStringArray' in 'class CStringArray' nicht moeglich
Mit einem CString als Übergabewert gibt es, wie erwartet, keine Probleme.
Aber ich möchte ja das CStringArray mitübergeben, um flexibel zu bleiben.Hatte evtl. jemand schon mal das gleiche Problem? Ich bin für jede (schnelle) Hilfe dankbar.
Gruß
Alexander
-
ok, du hast zum einen
C/C++ Code: // MyDlg.h int FindInArray( CStringArray , CString );
dann brauchst du noch
// MyDlg.cpp int FindInArray( CStringArray MyArray, CString MySearchWord ) { tu dies und das... return 1; } void foo() { CStringArray MyArray, CString MySearchWord; tu dies und das... int FoundKey = FindInArray( MyArray, MySearchWord ); }
-
... hatte ich vergessen.
Alles war in meinem ersten Post bereit korrekt implementiert/deklariert.
Fehlermeldung bleibt die gleiche...
Gruß
Alexander
-
Wenn du nur suchst, solltest du lieber eine const Referenz als Parameter nutzen, anstatt eine Kopie des Arrays zu machen.
-
Ich wollte diese Lösung nur verfolgen, weil ich es nicht besser kann.
Hast Du evtl. ein kleines Beispiel?
Gruß und Danke
Alexander
-
int FindInArray(const CStringArray& MyArray, CString MySearchWord );
So habe ich das gemeint. Dadurch sparst du dir das Kopieren, was natürlich performanter ist.
Zum Suchen kannst du aber auch std::find aus der STL benutzen( im Header <algorithm>) Kann aber sein da musst du dir erst ein Funktionsobjekt schreiben, ich weis jetzt nicht inwieweit CStringArry Iteratoren anbietet.
-
Ich probier's aus und melde mich wieder.
Danke und Gruß
Alexander
-
Wenn ich meine Methode so deklariere:
int FindInArray( const CStringArray& MyArray, CString SearchText ) { CString test; test = MyArray.ElementAt( i ); // return 1; }
bekomme ich als Fehler
C:\***\MyDlg.cpp(1376) : error C2662: 'ElementAt' : this-Zeiger kann nicht von 'const class CStringArray' in 'class CString Array &' konvertiert werden
Also wie greife ich dann innerhalb der Methode auf das Array zu?! :=)
Vielen Dank
Gruß
Alexander
-
#include <algorithm> using namespace std; ... CString findeMich(_T("Hello world")); CString* strEnd = strArray.GetData() + strArray.GetCount(); if (find(strArray.GetData(),strEnd,findeMich) != strEnd) { AfxMessageBox(_T("Gefunden!")); }
Ist jetzt ungetestet kannst ja mal schauen, ob das geht.
-
Das Beispiel hat mit dem vorherigen nichts mehr zu tun, oder?
By the way: Das ganze Procedere soll mir den Schlüssel (index) eines Suchwortes innerhalb eines CStringArray zurückgeben.
// Beispiel: CStringArray testArray; testArray.Add( "Eins" ); testArray.Add( "Zwei" ); testArray.Add( "Drei" ); int Key; Key = FindInArray( testArray, "Zwei" ); // Ergebnis wäre index = 1. (also 2. Element)
Gruß
Alexander
-
#include <algorithm> int findIndex(const CStringArray& strArray,const CString& findThis) { const CString* strBegin = strArray.GetData(); const CString* strEnd = strBegin + strArray.GetSize(); const CString* strFind = std::find(strBegin,strEnd,findThis); if (strFind != strEnd) { return strFind - strBegin; } return -1; }
-
Läuft, funzt und hat Luft!
Vielen, vielen Dank
Gruß
Alexander