Problem mit mehreren Rückgabewerten einer Funktion
-
Matches schrieb:
Hallo,
also, ich möchte mehrere Rückgebewerte aus einer Funktion zurückgeben. Ich hab mal irgendwo gelesen, das man ein Struct macht, in dem die ganzen Daten abgespeichert werden und dann als Rückgabewert einen Pointer auf dieses Struct zurück gibt. Die frage ist nur wie die Syntax dazu lautet. Ich weiß leider auch nicht mehr wo ich das mal gelesen hab.
Schonmal danke.
Matches
Du kannst einerseits einen Strukt zurückgeben:
struct retval { int a; int b; retval(int a, int b) : a(a), b(b) {} }; retval func() { return retval(a, b); }
Andererseits kannst du per Referenz übergeben, so dass mehrere Rückgabewerte möglich sind:
void func(int & a, int & b) { a = 3; b = 4; } void user() { int a, b; func(a,b) }
ich mache eher Letzteres.
-
Hi,
leider sind die Daten nicht alles vom gleichen Typ. Kannst du mir vieleicht ein konkretes Beispiel geben. Also mein Struct Sieht so aus.
struct xy { char nick[20]; char mes[100]; int irgendwas; }
Jetzt brauch ich eine Funktion die mir einen Pointer auch diese Struct zurückgibt, so das ich in main() damit arbeiten kann. Später soll dann nicht mehr in main() damit gearbeitet werden, sondern das ganze teil soll dann in ne dll. Mir ist das mit dem Rückgabedatentyp der Funktion unter anderem auch noch nicht so ganz klar.
Ich würde mich über ein konkretes Beispiel sehr freuen.
Matches
-
schau mal unter boost nach, da gibts ne klasse die tuple heisst, die ist genau für solche fälle geschaffen
-
Ich glaub das das mir der Tuple Klasse eher nicht geht, weil:
Wie schon gesagt, soll der ganze Rotz nacher in eine DLL und diese soll dann von Delphi verwendet werden.
Also das ganze soll ein chat werden. Ich hab einen Server, eine Client DLL und einen Grafischen Client(in Delphi). Jetzt soll praktisch die DLL dem grafischen Programm den Nick und die Nachricht in einem Strukt übergeben, welche sie vom Server geschickt bekommen hat, sodas das grafische programm die 2 Daten getrennt weiter verarbeiten kann.Matches
-
ok, dann gehts nicht
-
Tjo leider....
Aber könnte mir noch einer vieleicht ein Beispiel von der Syntax her geben (Mit nem pointer auf ein Struct als Rückgabewert).
Was mir noch nicht ganz klar ist: Was für einen Datentyp hat dann der Pointer im "Hauptprogramm".Matches
-
Der Pointer hat den Typ deiner struct.
Beispiel.:
#include<iostream> using std::cout; using std::endl; //hier kannst du beliebige typen reinpacken //zugriff bekommst du über den .-operator bzw. über ->operator struct retval{ int intval_; float floatval_; std::string stringval_; }; //nich so schön const retval *foo(){ static retval ret; ret.intval_=3; ret.floatval_=3.3; ret.stringval_="3 und 3.3"; return &ret; } //oder als kopie const retval bar(){ retval ret; ret.intval_=3; ret.floatval_=3.3; ret.stringval_="3 und 3.3"; return ret; } //oder referenz void baz(retval &ret){ ret.intval_=3; ret.floatval_=3.3; ret.stringval_="3 und 3.3"; return; } int main(){ const retval *ptrretval=foo(); retval ret1,ret2; ret1=bar(); baz(ret2); cout<<ptrretval->intval_<<" : "<<ptrretval->floatval_<<" : "<<ptrretval->stringval_<<endl; cout<<ret1.intval_<<" : "<<ret1.floatval_<<" : "<<ret1.stringval_<<endl; cout<<ret2.intval_<<" : "<<ret2.floatval_<<" : "<<ret2.stringval_<<endl; }
Ausgabe:
3 : 3.3 : 3 und 3.3 3 : 3.3 : 3 und 3.3 3 : 3.3 : 3 und 3.3
-
Vielen dank, genau das hab ich gesucht.
Jetzt hab ich noch ein Problem. In deinem Beispiel sind das Strukt und die Fuktion global. Wenn ich das ganze dann in eine Klasse verpacke, kann ich ja nicht mehr so wie in main() darauf zugreifen. Wie mach ich das dann?Matches
-
In was für ne Klasse willst du die denn "verpacken"? Normalerweise ist eine Klasse ja dazu da, instanziert zu werden und wenn du das machst, gibt's doch kein Problem mehr, oder?
Einfach die Klassenmethode aufrufen!
-
Also, hier mal grob die Problematik.
Ich mach mit einem Kumpel einen Chat als Projekt für die Schule. Ich hab den Server und eine Client.dll in C++ geschrieben und der Kumpel macht die Graphische Oberfläche für den Client in Delphi(das kann er halt sehr gut). So, wenn jetzt ein Client eine Nachricht an den Server sendet, werden an diese Nachricht der Nickname, die eigentliche Nachricht und noch verschiedene Steuerzeichen angehängt. Diese Nachricht wird dann vom Server verarbeitet und an die Clients, die diese erhalten sollen, weitergeschickt. Die Client.dll spaltet diese Nachricht vom Server wieder in Ursprüngliche Message und Nick auf. Jetzt muss ich ja irgendwie beide Strings an den Graphischen Client übergeben und ich hab mit gedacht, mach ich das mit einem Struct, in dem ich diese speicher.
In der Client.dll befindet sich eine Klasse mit den ganzen Funktionen für connecten, senden und empfangen. Ich habs die dann so hingewurschtelt, das der Kumpel diese in Delphi verwenden kann. Jetzt hab ich nur noch das Problem mit dem Struct. Es feht also nicht mehr viel.Ich hoffe, ihr könnt mir noch helfen.
Matches