Funktion mit variablen Parameterliste?
-
Hallo Dravere,
ich meine, ich kann keine Werte zurückspeichern in diese Variablen, wenn
iAnfang und iEnd Werte aus der Funktion zurücknehmen sollen?!
Beispiel:
int iAnfang = 0, iEnd = 0; if(CSFind(csQuell, "Welt", &iAnfang, &iEnd)) // ich möchte das iAnfang und iEnd Werte zurück bekommen?! AfxMessageBox("Gefunden!");iAnfag und iEnd sollten aus der Funktion diese Positionen haben!?

diese Zuweisung meinte ich, die auch Funktioniert, aber nur in ersten Beispiel!Als Notlösung hab ich jetzt zwei Funktionen geschreiben mit unterschiedlichen Parametern, so hab ich aber wieder zwei Funktionen die eigentlich die selben sind,
und wenn ich in einer etwass geändert habe muß ich das auch in der zweiten,
so hätte ich alles in einem!lg
-
Hallo,
hat sich erledigt, ich hab die Funktion so erstellt:BOOL CSFind(CString csQuell, CString csSuch, int* iAnfang = NULL, int* iEnd = NULL);jetzt kann ich in iAnfang und iEnd Werte zurückspeichern und die Funktion auch ohne
die zwei int Parameter aufrufen!LG und danke
pixel
-
mist, hab mich zu früh gefreut!

jemand ne idee wie ich das machen kann?lg
pixel
-
pixel schrieb:
BOOL CSFind(CString csQuell, CString csSuch, int* iAnfang = NULL, int* iEnd = NULL);
jetzt kann ich in iAnfang und iEnd Werte zurückspeichern und die Funktion auch ohne
die zwei int Parameter aufrufen!Hab ich das richtig verstanden, dass Du, obwohl Du iAnfang und iEnd nicht als Parameter übergibst, Du trotzdem Werte in diese speichern willst?
Wie soll das gehen?
-
@pixel, zeig mal die Funktion CSFind. Also den Bodyteil (Das Zeugs in den geschweiften Klammern ^^) ...
Wenn du einem Pointer etwas zuweisen willst und er auch auf etwas zeigt, dann musst du dies so machen:
int a = 0; int* p = &a; *p = 1; // so ist nun in a der Wert 1Wenn du nur folgendes machst:
int a = 0; int* p = &a; p = 1;Dann änderst du nur den Zeiger, aber nicht den Wert in a. p Zeigt danach auch nicht mehr auf a, sondern sonst wo hin. Auf die Adresse 1 halt, was dort auch immer ist.
Grüssli
-
Hi,

Hab ich das richtig verstanden, dass Du, obwohl Du iAnfang und iEnd nicht als Parameter übergibst, Du trotzdem Werte in diese speichern willst?
Wie soll das gehen?@cosmixx, ich weis war ne blöde idee von mir!!!
Da bleibt mir nichts anders als 2 funktionen zu schreiben???@Dravere, wenn ich das so mache wie in deinen Beispiel und ich die Parameter übergebe dann funktioniert alles bestens...
Hier was ich gemeint habe:BOOL FindSubString(CString csSuch, int* iStart = NULL, int* iEnd = NULL) { BOOL bGefunden = FALSE; LPCTSTR lpsz = (LPCTSTR) this->csContent; // ist ein Dateiinhalt, in dem wird gesucht! int iSuchLen = csSuch.GetLength(); int iPos = 0; while(*lpsz) { LPSTR lpstr = (LPSTR) (lpsz + iSuchLen); char cSave = *lpstr; *lpstr = '\0'; if(0 == lstrcmp(lpsz, csSuch)) // vergleiche ob die gesuchten identisch sind?! { // *iStart = iPos; *iEnd = iPos + iSuchLen; bGefunden = TRUE; } *lpstr = cSave; lpsz++; iPos++; if(bGefunden) break; } lpsz = (LPCTSTR)this->csContent; return bGefunden; }so hab ich das gemeint, ich will aber nicht immer wissen an welcher Stelle der
Begriff beginnt und endet, ich will manchmal nur wissen ob er da ist, dazu langt
mir der return!
Da könnte ich auf die zwei parameter verzichten, jetzt hab ich einfach eine zweite Funktion geschreiben ohne die int Parameter, ich glaube das es anders garnicht geht?!lg
-
Ein Vorschlag von mir:
BOOL FindSubString(CString csSuch, int* iStart = NULL, int* iEnd = NULL) { BOOL bGefunden = FALSE; LPCTSTR lpsz = (LPCTSTR) this->csContent; // ist ein Dateiinhalt, in dem wird gesucht! int iSuchLen = csSuch.GetLength(); int iPos = 0; int tmpStart = 0; int tmpEnd = 0; while(*lpsz) { LPSTR lpstr = (LPSTR) (lpsz + iSuchLen); char cSave = *lpstr; *lpstr = '\0'; if(0 == lstrcmp(lpsz, csSuch)) // vergleiche ob die gesuchten identisch sind?! { tmpStart = iPos; tmpEnd = iPos + iSuchLen; bGefunden = TRUE; } *lpstr = cSave; lpsz++; iPos++; if(bGefunden) break; } lpsz = (LPCTSTR)this->csContent; if( bGefunden ){ if( iStart != NULL ) *iStart = tmpStart; if( iEnd != NULL ) *iEnd = tmpEnd; } else{ if( iStart != NULL ) *iStart = 0; if( iEnd != NULL ) *iEnd = 0; } return bGefunden; }
-
Hi,
@Cosmixx, dein Vorschlag wars, wobei ich nur noch auf die temp-int's verzichtet
habe, und direkt abgefragt habe ob iStart und iEnd != NULL sind.BOOL FindSubString(CString csSuch, int* iStart = 0, int* iEnd = 0) { BOOL bGefunden = FALSE; LPCTSTR lpsz = (LPCTSTR) this->csContent; int iSuchLen = csSuch.GetLength(); int iPos = 0; while(*lpsz) { LPSTR lpstr = (LPSTR) (lpsz + iSuchLen); char cSave = *lpstr; *lpstr = '\0'; if(0 == lstrcmp(lpsz, csSuch)) // casesensitive, groß/klein wird unterschieden! { if(iStart != NULL) *iStart = iPos; if(iEnd != NULL) *iEnd = iPos + iSuchLen; bGefunden = TRUE; } *lpstr = cSave; lpsz++; iPos++; if(bGefunden) break; } lpsz = (LPCTSTR)this->csContent; return bGefunden; }mist, warum ist mir das nicht eingefallen!??

danke!
lg
pixel
-
pixel schrieb:
mist, warum ist mir das nicht eingefallen!??

So unglaublich dies klingt, ich kann dir sagen wieso. Du hast nicht gedebuggt. Denn wenn du dies gemacht hättest, wäre dir aufgefallen, dass die zwei Adressen, NULL-Zeiger sind und du ihnen Werte zuweisen willst ^^
Es lebe der Debugger ^^
Grüssli
-
Es lebe der Debugger ^^
du sagst es!

lg
pixel