Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Call by reference, schön und gut, aber...

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 < [ 2 ] [ 3 ]
000
15.08.2006, 13:38 Uhr
Yadgar



High!

...die Rückgabe kann ein Problem sein! Wenn ich zum Bleistift eine Operatorfunktion zum einfachen Addieren (also nicht + programmiere, will ich natürlich das Ergebnis zuweisen können, andererseits sollen aber weder das aufrufende Objekt (*this) noch das per Referenz übergebene Objekt verändert werden. Da bleibt doch eigentlich nur die Rückgabe per echtem Wert, oder irre ich mich? Ich kann ja schließlich keinen Zeiger oder Referenz auf ein Objekt zurückgeben, das überhaupt erst in der Funktion deklariert wird... aber wenn ich per Wert zurückgebe, geht natürlich bei großen Objekten (z. B. Feldern mit zigtausenden Elementen) die Performanz in die Knie. Gibt es einen Ausweg aus diesem Dilemma?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.08.2006, 13:40 Uhr
~Blubber2063
Gast


Ja natürlich, du kannst ja mit new ein dynamisches Objekt erzeugen, auf dieses kannst du eine Referenz zurückgeben, damit hast du nicht diese gewaltigen Kopieraktionen bei grossen Datenmengen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.08.2006, 13:43 Uhr
~Blubber2063
Gast


Zur erklärung dazu, der Speicher der Methode, Funktion, Operator liegt immer auf dem Stack, allerdings ist dynamisch reservierter Speicher bis zur Freigabe verfügbar, der Subroutinenspeicher ist nach dem verlassen nicht mehr Gültig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.08.2006, 13:54 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Ja natürlich, du kannst ja mit new ein dynamisches Objekt erzeugen, auf dieses kannst du eine Referenz zurückgeben, damit hast du nicht diese gewaltigen Kopieraktionen bei grossen Datenmengen.


Das Dumme dabei ist in meinem Fall, dass es sich bei dem benötigten Objekt um ein Feldobjekt ("FixedArray") handelt, das normalerweise gleich mit einer Dimensionsangabe initialisiert wird:

FixedArray f(10); // Feld mit 10 Elementen

Wenn ich hingegen erst einmal mit

FixedArray* f = new FixedArray;

Speicherplatz anfordere, wird für f der Standardkonstruktor verwendet, und der weist dem Objekt den Dimensionswert 0 zu.

Da ich ja kein Feld von FixedArray-Elementen erstellen will, sondern FixedArray selbst schon Feldcharakter hat, fällt der Feldoperator new[] leider aus... und FixedArray im Nachhinein einen neuen Dimensionswert zuzuweisen würde auf eine unzulässige Bereichsüberschreitung hinauslaufen!

Was tun? Bleibt da nicht doch nur die Rückgabe per Wert übrig?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.08.2006, 13:58 Uhr
~Blubber2063
Gast


Nein du hast anscheinend den new Operator noch nicht ganz verstanden, du kannst auch einfach jeden anderen Konstruktor benutzen in dem du seine Parameter angibts also:
FixedArray* f = new FixedArray(10);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.08.2006, 14:06 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Nein du hast anscheinend den new Operator noch nicht ganz verstanden, du kannst auch einfach jeden anderen Konstruktor benutzen in dem du seine Parameter angibts also:
FixedArray* f = new FixedArray(10);


Ja, wenn das <i>so</i> ist... danke, Blubber!

(eine Minute später...)

Leider zu früh gefreut... das mit Referenz auf mit new in der Funktion erzeugtes Objekt zurückgeben klappt auch nicht, ich habe am Ende nur undefinierte Werte in f3 stehen. Hier der Code:


C++:
FixedArray& FixedArray::operator + (const FixedArray& f2)
{
   FixedArray* f3 = new FixedArray(dim);
  
   if (!diffLengths(f2))
   {
      cout << "FixedArray-Objekte unterschiedlicher Gr" << (char)148 << char(225)
           << "e k" << (char)148 << "nnen nicht addiert werden!";
      exit (1);
   }
   int i=0;
   do
   {
      f3->wert[i]+=f2.wert[i];
      i++;
   }
   while (i<dim);

   return *f3;
}



Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.08.2006, 14:14 Uhr
~Blubber2063
Gast


Das ist kein Wunder, da erstens der Speicher von deinem f3 Objekt wahrscheinlich im Konstruktor nur reserviert ist, aber nicht initialisiert, davon abgesehen wolltest du doch die beiden addieren oder ? Also musst du auch die Werte von f1 drauf addieren, sonst bringt der Operator doch nur die Zuweisung von f2 auf f1 by copy.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.08.2006, 14:31 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Das ist kein Wunder, da erstens der Speicher von deinem f3 Objekt wahrscheinlich im Konstruktor nur reserviert ist, aber nicht initialisiert, davon abgesehen wolltest du doch die beiden addieren oder ? Also musst du auch die Werte von f1 drauf addieren, sonst bringt der Operator doch nur die Zuweisung von f2 auf f1 by copy.


Yep, jetzt sehe ich es auch, also:



C++:
f3->wert[i] = wert[i] + f2.wert[i];



und es läuft einwandfrei!

Danke, Blubber!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.08.2006, 20:57 Uhr
Spacelord
Hoffnungsloser Fall


Für mich hört sich nen operator+ der mit new Speicher reserviert nach ziemlicher Kacke an.
Was passiert denn mit dem von dir reservierten Speicher wenn sowas kommt? :

C++:
FixedArray f1(10);
FixedArray f2(10);
FixedArray f3(10);
FixedArray f4(10);
....
f4 = f1+f2+f3;



oder

C++:
FixedArray f1(10);
FixedArray f2(5);
....
f3 = f1+f2;



Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.08.2006, 10:03 Uhr
Yadgar



High!


Zitat von Spacelord:
Für mich hört sich nen operator+ der mit new Speicher reserviert nach ziemlicher Kacke an.
Was passiert denn mit dem von dir reservierten Speicher wenn sowas kommt? :

C++:
FixedArray f1(10);
FixedArray f2(10);
FixedArray f3(10);
FixedArray f4(10);
....
f4 = f1+f2+f3;



oder

C++:
FixedArray f1(10);
FixedArray f2(5);
....
f3 = f1+f2;





Ersteres habe ich noch nicht probiert (danke für den Tip!), letzteres kommt von vornherein nicht vor, da alle meine Operatorfunktionen erst einmal prüfen, ob beide Felder gleich groß sind. Ist das nicht der Fall, wird eine Fehlermeldung ausgegeben und das Programm beendet - wahrscheinlich werde ich letzteres in Zukunft durch das Werfen einer Ausnahme ersetzen!

Im Moment bin ich aber erstmal damit beschäftigt, die ganze Klasse FixedArray zu rekonstruieren - mir ist gestern kurz vor Schluss ausgerechnet beim Kompilieren Windows Server 2003 abgeschmiert! Ihr könnt euch denken, dass die Motivation danach erstmal ziemlich am Boden war... muss mal die Hilfstexte für Dev-C++ studieren, wie das mit den automatischen Sicherungskopien funktioniert!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: