Zurückgeben mehrerer Datenelemente aus einer Funktion in C oder C++
Ich bin verwirrt über ein paar Hausaufgaben Fragen, die ich habe...
Können Sie wieder mehrere Datenelemente aus einer Funktion mit return()? Kann eine Funktion nur einen Wert, es sei denn, es ist ein Zeiger auf ein array?
Ich glaube, dass die Antwort ist, dass eine Funktion zurückgeben kann mehrere Daten-Elemente, die durch Rücksendung einer Struktur. Dann, wieder ein Zeiger auf ein array ist nicht der einzige Weg - wenn das ein Weg?
Aber es scheint eine Menge Diskussion zu diesem Thema und so möchte ich sicherstellen, dass ich zumindest die Grundidee richtig: können Sie die Rückgabe auch mehrere Daten-Elemente, die Verwendung einer Struktur, sondern mit Zeiger (ich verstehe das nicht) wird der Speicher effizienter nutzen. Ist das richtig?
- Ein interessanter Hinweis ist, dass, während eine Funktion kann nur ordnungsgemäß zurück eine Sache, es kann a) ändern sich viele Dinge und b), dass eine Sache enthalten kann viele Dinge (struct-Tupel). Also die technische Antwort ist ja, aber für die meisten Absichten, Nein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit C++0x/C++11, können Sie dieses verwenden:
Kompilieren Sie es mit
Und und wenn Sie die Ausführung des Programmes wird es ausgegeben wird dies:
Aber es ist besser, verwenden Sie Hinweise, wie diese (ich würde sagen):
Uch das ist es, was ich für nicht Lesen Sie die Frage sorgfältig...
Yeah Sie nur zurückgeben kann 1 einzigen Wert, aber dieser einzelne Wert kann umfassen multiplizieren Sie die Werte (struct, class, array).
Wahr. Aber wenn du Zeiger verwenden, es hängt davon ab, wie Sie es verwenden.
Wenn Sie die dynamische Zuweisung, die es jedem Funktionsaufruf wird es nicht sehr effizient, und Sie müssen freigeben der Speicher manuell nach Gebrauch. Wenn Sie ein global-array/struct wird es effizient sein. Kann aber geben Ihnen Probleme, wenn Sie rufen Sie die Funktion multiplizieren mal.
Zusätzlich zu dem, was schon gesagt in diesem thread, in C++11 können Sie die Rückgabe Strukturen initialisiert einheitliche Initialisierung:
Bevorzuge ich persönlich die Rückkehr Strukturen mit benannten Mitglieder und nicht als Tupel, da letztere nicht die Namen für seine Mitglieder.
Das ist richtig.
Können Sie jedoch die "zurück" - mehrere Elemente, durch hinzufügen von Parametern, die per Referenz übergeben, dann schreiben die mehrere Ergebnisse zu Ihnen.
Einer Funktion können in der Tat nur eine 'Sache' mit Ihrer return-Anweisung. Das Ding kann jedoch ein Zeiger (C & C++ - arrays sind Zeiger einfach in der Verkleidung), einer Referenz (ein Zeiger kann nicht umgesetzt oder array-index) oder ein Objekt, die Kapseln kann an mehreren Dingen.
Wenn Sie eine Struktur, die Sie vorbei sind wieder die gesamte Struktur. Wenn Sie zurückkehren, einen Zeiger oder Referenz, sind Sie wieder nur die Adresse der Struktur - Sie hatten also besser nicht zurück, eine Referenz oder ein Zeiger auf eine Struktur, die außerhalb des Gültigkeitsbereichs, wenn die Funktion zurückgibt! Dabei beruft sich undefiniert Verhalten, die höchstwahrscheinlich (aber nicht immer) ist ein "segmentation fault".
Wenn Sie wollen ein größeres Bild über das Lesen, über übergabe von Parametern als Wert und der übergabe by reference gilt auch für returning-Parameter.
Wie Sie bereits erwähnt:
Können sagen, Sie haben einige Struktur:
und Methode:
Diese Methode veranschaulicht den Fall, wenn Sie übergeben von Parametern an die Methode und wieder zurück von Wert, was bedeutet, dass jedes mal, wenn Sie diese Methode aufrufen, die Sie kopieren die Methode das argument in einem anderen Ort im Speicher. Das kopieren kostet Zeit und wenn Sie haben größere Strukturen verlangsamt Ihr Programm Laufzeit so ist es effizenter, große Strukturen durch Referenz.
In diesem Fall werden Sie nicht kopieren, ganze Daten-Struktur, einfach nur die die Adresse des Speichers, wo sich diese Struktur befindet. Sie brauchen auch nicht unbedingt eine return-Anweisung, da änderungen an der Struktur Objekt wird sichtbar, außerhalb dieser Methode. Aber wenn Sie neu zuweisen bigStruct an einen neuen Speicherort wird es sichtbar nur innerhalb der lokalen Methode:
workWithReference
Ich hoffe, es ist mehr die Sache jetzt klarer;)