char mit return übergeben?
-
Danke für die schnelle Hilfe!
Kann mir jemand eine kurzen Code als Beispiel schreiben.
Danke
Frostie
-
char * funktion (void) {
return new char[8];
}aber schöner ist
string & funktion (void) {
return new string;
}und noch schöner:
string & funktion (string * pointer) { // der Benutzer muss eine Variable übergebn die man füllt, statt heimlich new zu benutzen
pointer = new string;
return *string;
}
-
char * f(){ char * a = new char[9]; return a; }
Ich würde allerdings nicht behaupten das ein char eine Länge hat, sondern eine Größe und das wäre dann 1 Byte.
-
Wenn die Länge aus irgendeinem Grund fest ist, kannst du das Array in eine struct verpacken und zurückgeben. Ansonsten einen std::string zurückgeben, aber bitte ohne new, Referenzen und Zeiger:
std::string funktion() { return "Hallo Spencer!"; }
-
Hab das jetzt so gemacht, aber,
char * f(){ char a[9]; cout << "Char eingeben: " << endl; cin >> a; char * a = new char[9]; return a; } void main(char *a) { char b[9]; f(); b = *a; cout << "Char war: " << << b << endl; return 0; }
Warum geht das jetzt nicht.
-
Du definierst in einen a in einem Gültigkeitsbereich zwei mal, übersetzt der das?
Wenn ja wundert es mich, aber da funktionieren tut das auf keinen Fall.Wenn dann so:
char * f(){ char * a = new char[9]; cout << "Char eingeben: " << endl; cin >> a; return a; }
Aber da mußt du sicherstellen das du nicht mehr als 8 zeichen einliest
(plus '\0' =9)
-
Und wo wird der Speicher wieder freigegeben ??
-
9 Byte, wen juckt´s?
Ne, mal im ernst. Am besten dann wenn er nicht mehr benötigt wird.
-
Entyl_Sa schrieb:
9 Byte, wen juckt´s?
Ne, mal im ernst. Am besten dann wenn er nicht mehr benötigt wird.Am besten automatisch und nicht auf Verlass darauf, dass der Aufrufer das auch wirklich macht.
-
So, jetzt hab ich zwar die Adresse in der main, aber wie bekomme ich das array in eine Variable??
int main(char *c) { char b[9]; cout << &c; //Gibt die Adresse aus! char b = *c; // Aber das funktioniert so nicht!! return 0; }
-
Habs selber hinbekommen:
char *b = in.funk();
Danke
Frostie
-
Optimizer schrieb:
Entyl_Sa schrieb:
9 Byte, wen juckt´s?
Ne, mal im ernst. Am besten dann wenn er nicht mehr benötigt wird.Am besten automatisch und nicht auf Verlass darauf, dass der Aufrufer das auch wirklich macht.
Und wie würdest du das automatisch machen?
-
Mit einem Destruktor. So wie bei std::string z.B.
-
Wo ist der Unterschied ob ich jetzt delete auf einen string oder delete[] auf einen char * aufrufe?
-
Bei delete[] werden häufig die "[]" vergessen.
-
Naja, das ist aber doch kein Grund.
Das ist weder einfacher noch automatisch.
-
Warum ist das nicht automatisch? Und warum ist das nicht einfacher, wenn man nicht mehr ans delete denken muss?
Wenn du was mit new erstellst und einen Zeiger darauf zurückgibst, dann verlässt du dich darauf, dass irgendjemand außerhalb deiner Funktion das Ding wieder löscht.So schreib ich einfach:
string foo() { [...] return myString; }
Und wenn der Aufrufer meine Variable nicht mehr verwendet, löscht der Destruktor automatisch das char-Array.
Mit deiner Funktion dagegen bist du darauf angewiesen, dass der Aufrufer dran denkt, delete[] zu machen.
-
SirLant schrieb:
char * funktion (void) {
return new char[8];
}aber schöner ist
string & funktion (void) {
return new string;
}und noch schöner:
string & funktion (string * pointer) { // der Benutzer muss eine Variable übergebn die man füllt, statt heimlich new zu benutzen
pointer = new string;
return *string;
}Das ist nicht Dein Ernst, oder?
- ist doof, man muß an das delete denken, auch noch ohne, daß man selbst new aufgerufen hat.
- Ist ein Syntax-Fehler, Du meinstes wahrscheinlich return *(new string);
Das hat genau das gleiche Problem. - Ist der Gipfel der Sache... warum bitte soll der Benutzer einen Parameter hergeben und einen Rückgabewert entgegennehmen, wenn er doch eigentlich nur einen Rückgabewert haben will. Noch dazu wird der Pointer by value übergeben, das heißt von der Veränderung kriegt man außen nichts mit.
Schön ist zum Beispiel
string funktion() { return "blablabla"; }
Das ist nämlich einfach, keine Gefahr vom vergessenen delete und komfortabel ist es auch.
MfG Jester
-
Es sollte beim dritten return *pointer heißen. Das dritte Beispiel ist etwas
schlecht formuliert, da geb ich dir recht, besser ist es wenn das Objekt bereits
fertig ist und dann per Zeiger übergeben wird. War da wohl etwas verwirrt (deswegen auch return *string).Was ich meinte war:
const matrix & fill (matrix & tabelle) { matrix values(99, 99 ,0) // 99 * 99 Matrix mit 0 als default Wert tabelle = values; return tabelle; } int main (void) { matrix tabelle; fill(tabelle); }
So hat man das new Problem nicht, man übergibt dem Programm einfach ein Objekt
das gefüllt wird. So spart man bei großen Objekten auch das zusätzliche kopieren.Hoffe jetzt ist klar was ich eigentlich mit dem dritten Beispiel meinte.
Die Rückgabe ist nur dafür da, falls man damit weiterarbeiten möchte (matrix y = fill(tabelle) + transform;).Was es noch gibt sind die auto_ptr mit welchen man das Problem ja auch beseitigen kann.
-
@Optimizer:
hab jetzt verstanden was du meinst und damit hast du natürlich recht. Du legst den String ja nicht über new an, brauchst also auch kein delete.Das weder einfacher noch automatisch bezog sich allerdings auf den direkt vorangegangenen Post.
Gruß
Entyl Sa