Rückgabewert (String) von Funktionen: wie macht man das?
-
hm. Keine produktiven Vorschläge?
Habs mal so versucht, sieht aber irgendwie umständlich aus:
Am Beispiel footer:Deklaration:
void FKT_footer_str (std::string::iterator*);Definition:
void FKT_footer_str (std::string::iterator *fi) { std::string footer1; footer1= "\n\n<!-- Hauptinhalt Ende-->" "</TD></TR>\n" "<TR><TD colspan=\"2\">" "<DIV CLASS=\"NACHOBEN\"><a href=\"#oben1\">Nach oben...</a>\n</DIV>\n" "<!--tooltipp start-->" "<script language=\"JavaScript\" type=\"text/javascript\" src=\"../images/bla"\">" "</script>" "<!--tooltipp ende-->" "<!-- Haupttabelle Ende-->\n" "</TD></TR></TABLE>\n" "<!-- DIV Container Ende-->\n" "</DIV>\n" "</body>\r\n</html>\r\n"; [b]*fi=footer1.begin();[/b] }Ausfuf:
std::string footer; std::string::iterator fi=footer.begin(); FKT_footer_str(&fi);Es funktioniert, aber ist das so richtig? Kann ich das so verwenden?
Es greifen mehrere USer gleichzietig auf das Programm zu, deshalb nur lokale variablen.
Wichtig ist in der Funktion footer die Zuweisung des Iterator auf den String, der ja außerhalb liegt.Kann man das so machen?
Vorschläge?Mondmann
-
Mondmann schrieb:
1. Wie kann ich das machen, daß ich nicht immer den riesen String aus der Funktion zurückgeben muss.?
was willst du sonst machen?
Du hast einen string und den willst du zurueck geben. Genau wie in deinem C code. Wo ist das Problem?
-
Nach verlassen der Methode/Funktion existiert footer1 nicht mehr, somit ist auch der Iterator ungültig.
Warum übergibst Du nicht std::string & und verwendest diesen innerhalb der Funktion ?
-
Knuddlbaer schrieb:
Nach verlassen der Methode/Funktion existiert footer1 nicht mehr, somit ist auch der Iterator ungültig.
Warum übergibst Du nicht std::string & und verwendest diesen innerhalb der Funktion ?
Knuddlbaer schrieb:
Nach verlassen der Methode/Funktion existiert footer1 nicht mehr, somit ist auch der Iterator ungültig.
Warum übergibst Du nicht std::string & und verwendest diesen innerhalb der Funktion ?
Wäre das dann so korrekt?
declaration:
void FKT_footer_str (std::string&);definition:
void FKT_footer_str (std::string &footer1 )Aufruf:
string footer; FKT_footer_str(footer);So funktioniert es, heißt ja aber nicht, daß es korrekt ist:-)
Grüße Mondmann
-
Die Deklaration sieht gut aus, wenn Du dann intern noch
footer1 = "bla blubb blubb";
hast, passt es.
-
Hab ich , vielen Dank.
Man kann doch immer nur dazulernen.Ich kann doch annehmen, daß die (lokale) String variable "footer" nach rückkehr aus der aufrufenden Funktion freigegeben wird?
Grüße Mondmann
-
Ja, sobald der Scope verlassen wird, wird diese zerstört.
Der exakte Zeitpunkt hängt jedoch ein wenig davon ab, wo
diese erstellt wird. Generell liese sich als Faustregel sagen,was Du nicht per new anforderst muss Du auch nicht selbst entsorgen.
(Natürlich gibt es dann später Ausnahmnen aber für den Anfang sollte
es so reichen).
-
Ok, aber dann hätte ich gleich mal noch ein anderes Problem:
ich verwende auch vectoren und greife auf diese mit einem Iterator drauf zu
std::vector<std::string> arr_get; std::vector<std::string>::const_iterator p_arr_get;Ich "befülle" das array mit push.back:
arr_get.push_back(p);Und lese das nachher mit dem Iterator aus.
Freigegben wird das ja hoffentlich auch ohne mein zutun.Mein Problem ist nun, daß wenn ich das Programm debugge, meckert er zweimal (zweimal vector) daß er einen haltepunkt ausgelöst hat,was durch eine beschädigung des Heaps ausgelöst werden kann.
Keine Zugriffsverletzung, sondern einen Haltepunkt.
An dieser Stelle bleibt er dann hängen:
__CLR_OR_THIS_CALL ~basic_string() { // destroy the string _Tidy(true); ----> }in der Datei xstring.
Damit kann ich nu gar nichts anfangen und ich wollte mal fragen ob du weist was das für ein Problem sein könnte?
Mondmann
-
Hallo
Falls du zuerst den Iterator festlegst (also einem Konkreten Element des vectors zuweist) und dann anfügst, ist das der grund für den Zugriffsfehler. Denn das Verändern der Anzahl der Items führt dazu, das alle vorherigen Iteratoren ungültig werden. Liegt daran das vector u.u. in neuen Speicher verlegt wird.
bis bald
akari
-
Danke für den Tip, werde ich mal überprüfen.
Aber mein Problem war ganz einfacher Art:Ich hatte das "alte" C-Array in einen vector umgewandelt und am Ende der Funktion noch das delete[] dringelassen.
Das löste de Fehler aus.Ich hatte das Problem aber noch an einer anderen Stelle und dann weiß ich daß ich meine Iteratoren überprüfen muss. SOwieso, denn ich habe öfters den It. gleich auf den Vector zugewiesen und dann erst "befüllt".
Vielen Dank Mondmann