Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wo landen temporäre Daten?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.01.2005, 15:36 Uhr
nAvi



Also ich hab vorhin ein bisschen programmiert und da bin auf was gestoßen dass mich interessiert.
Und zwar hab ich die Funktion substr() bei den C++ Strings verwendet.

C++:
void func(string *t){...}

string m;
func(&m.substr(1,10));



Mein compiler meckert dann daran rum da ja die Rueckgabe von der Funktion nur temprär ist. Es ist aber nur ein warning und das Programm hat trotzdem getan. Jetzt wollt ich wissen kann es dei diesem Beispiel sein dass da auch mal mit einem Wert gearbeitet wird der nicht stimmt oder ob das immer geht. Und wenn wo wird dieser Wert gespeichert? Wird der dann nur als Argument für die Funktion aufm Stack gespeichert? Weil dann muesste doch alles in Butter sein oder?
--
Lebe als wolltest du täglich sterben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2005, 16:38 Uhr
~Th
Gast


Es geht darum, daß du den Parameter als nicht-const definierst hast "string *t", d.h. wenn du in der Funktion "func" den Parameter "t" änderst, hast du nach dem Aufruf von func keine Möglichkeit auf diesen Wert mehr zuzugreifen.
Um die Warnung zu eliminieren einfach "void func(const string *t)" definieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2005, 16:46 Uhr
mmc20
puss in boots


hi, ich glaube nicht das dies den gewünschten erfolg bringt, da du ja sicher den übergebenen string in deiner func() verändern willst

C++:
// substr(1,10) liefert ja einen string zurück und nicht einen pointer
// also kannst das ja nur so verwenden:
string temp = m.substring(1, 10);
// dann kannste mit temp deine funktion aufrufen
func(&temp);




Bearbeitung von ich:
mist wieder zu langsam...

Dieser Post wurde am 20.01.2005 um 16:50 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2005, 16:52 Uhr
nAvi



Das heisst ich fufe die Funktion auf, der Wert vom Argument wird auf dem Stack abgelegt und ich kann ihn in der Funktion lesen, aber nicht mehr ändern oder was? Wie funzt dass dann aber mit dem Pointer? Auf dem Stack stehen doch dann nur die Adressen. Dann wäre ein Zugriff ja trotzdem nicht möglich oder eben reines Glücksspiel auf was ich zugreife. Oder hab ich da was falsch verstanden. Weil ja der Wert eigentlich keine Speicherstelle haben dürfte außer auf dem Stack (da ja hier keine eigene Variable)
--
Lebe als wolltest du täglich sterben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2005, 17:06 Uhr
nAvi



@ mmc20: Hmm ja gelöst hab ichs nun auch so. Aber mir fehlt das Verständniss warum und wie es auch ohne diese Lösung getan hat.
--
Lebe als wolltest du täglich sterben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.01.2005, 10:37 Uhr
Th



Also, gestern hatte ich nicht mehr viel Zeit, es genauer zu erklären.

Wenn du eine Funktion definierst hast, die einen nicht-konstanten Zeiger oder Referenz auf einen Typ (z.B. string*, string& oder auch int *) als Parameter erwartet und übergibst dieser Funktion den Rückgabewert einer anderen Funktion, so wird hierfür vom Compiler ein temp. Objekt (namenlose Variable) angelegt, die nach dem Funktionsaufruf wieder zerstört wird (auf dem Stack), d.h. man kann zwar in der Funktion den Wert dann ändern, aber nach dem Funktionsaufruf wird dieses Objekt wieder gelöscht und die Wirkung ist gleich null.
Es kommt hierbei zu keinem Absturz (außer die Funktion ist fehlerhaft).

Besser ist es bei STL-Objekten mit Referenzen zu arbeiten, also "func(string& s)", da diese Objekte selbst nur Wrapper für Zeiger sind. Aber wenn du in der Funktion den Wert NICHT ändern willst, dann definiere alle Parameter als "const string&". Alternativ kann man auch nur "string" schreiben, aber dann wird das gesamte Objekt mittels Defaultkonstruktor kopiert (bei STL-Objekten meist nur Zeiger kopieren), aber generell sollte man sich die "constness"-Programmierung angewöhnen (wie bei Nur-Lese-Methoden "const" angeben).

Man braucht Zeiger nur verwenden, wenn man explizit den NULL-Zeiger zulassen will, ansonsten besser Referenzen verwenden (vermeidet das lästige Dereferenzieren).

Beispiele:
1. mit Referenz:

C++:
void func(string &s)
{
  if(s.empty())
     s += "Hello World or the whole Universe!";
}



2. mit Zeigern

C++:
void func(string *s)
{
  if(s->empty)
     (*s) += "Hello World or the whole Universe!";
}



Ich hoffe, dies führt nicht zu mehr Verwirrung...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.01.2005, 18:29 Uhr
nAvi



Huh dass war jetzt aber ganz schoen schwerer Stoff ;-)

Das mir Referenz hab ich noch gar ned gewusst dass das auch geht. Was da jetzt aber der Unterschied ist weis ich immer noch ned. Ich hab gedacht das & ist nur nötig wenn ich auf die Adresse eines Objektes zugreifen will.


C++:
void func(int *a) {...}
int a = 5;
func(&a);


Damit mache ich es ja möglich dass das Objekt nicht kopiert wird.
Was ist aber jetzt mit diesem:

C++:
void func(string &s)
{
  if(s.empty())
     s += "Hello World or the whole Universe!";
}


Was ist da nun ein Aufruf der Funktion?

C++:
string x;
func(&x);


Und was ist da bei der Übergabe nun der Unterschied? Habe ich es richtig verstanden dass das Objekt dann kopiert wird? (was ist Ziegerkopieren?)
Und was ändert sich da bei dem const? Und was sind STL-Objekte?
Hab da wohl ein sehr grosses Defizit.
--
Lebe als wolltest du täglich sterben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.01.2005, 08:12 Uhr
~Gast
Gast


Hallo!

C++:
void func(string &s)
{
  if(s.empty())
     s += "Hello World or the whole Universe!";
}

// Ruft man so auf:

string m;
func(m);


Bei s handelt es sich nicht um eine Kopie, sondern um die selbe Variable.
Eine Änderung von s verändert dem zu Folge auch m.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.01.2005, 11:54 Uhr
mmc20
puss in boots


hallo,
also zu diesem thema solltest du dir dringend mal unter e-books (oben auf dieser seite) das "C++ in 21 tagen" anschauen, in tag 8 und 9 geht es um pointer (zeiger) und referenzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.01.2005, 19:48 Uhr
nAvi



Ja ok mach ich. Danke nochmal
--
Lebe als wolltest du täglich sterben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: