Mehrere Datenelemente aus einer Funktion in C oder C ++ zurückgeben

8

Ich bin verwirrt bei ein paar Hausaufgaben Fragen, die ich habe ... Können Sie mehrere Datenelemente aus einer Funktion mithilfe von return () zurückgeben? Kann eine Funktion nur einen Wert zurückgeben, außer es ist ein Zeiger auf ein Array?

Ich glaube, dass die Antwort darin besteht, dass eine Funktion mehrere Datenelemente zurückgeben kann, indem sie eine Struktur zurückgibt. Dann ist das Zurückgeben eines Zeigers zu einem Array nicht der einzige Weg - wenn das ein Weg ist?

Aber es scheint eine Menge Diskussion über dieses Thema zu geben und deshalb möchte ich sicherstellen, dass ich zumindest die Grundidee richtig habe: Sie können mehrere Datenelemente mit einer Struktur zurückgeben, aber mit Zeiger (ich verstehe das nicht ) wird das Gedächtnis effizienter nutzen. Ist das korrekt?

    
BrainPermafrost 02.10.2011, 05:28
quelle

5 Antworten

7

Mit C ++ 0x / C ++ 11 können Sie dies verwenden:

%Vor%

Kompilieren Sie es mit

%Vor%

Und wenn Sie das Programm ausführen, wird es folgendes ausgeben:

%Vor%

Aber es ist besser, Referenzen wie diese zu verwenden (würde ich sagen):

%Vor%

Das bekomme ich, wenn ich die Frage nicht sorgfältig lese ...

  
    

Kann eine Funktion nur einen Wert zurückgeben, außer es ist ein Zeiger auf ein Array?

  

Ja, Sie können nur einen einzelnen Wert zurückgeben, aber dieser einzelne Wert kann mehrere Werte enthalten (struct, class, array).

  
    

Sie können mehrere Datenelemente mit einer Struktur zurückgeben, aber mit dem Zeiger (ich verstehe das nicht) wird der Speicher effizienter genutzt. Ist das korrekt?

  

Wahr. Aber wenn Sie Zeiger verwenden, hängt es davon ab, wie Sie es verwenden. Wenn Sie jeden Funktionsaufruf dynamisch zuordnen, ist es nicht sehr effizient und Sie müssten den Speicher manuell nach der Verwendung freigeben. Wenn Sie ein global-array / struct verwenden, ist es effizient. Aber kann Probleme geben, wenn Sie die Funktion mehrmals aufrufen.

    
KoKuToru 02.10.2011 09:50
quelle
3

Zusätzlich zu dem, was bereits in diesem Thread gesagt wurde, können Sie in C ++ 11 Strukturen zurückgeben, die mit einheitliche Initialisierung :

%Vor%

Persönlich bevorzuge ich die Rückgabe von Strukturen mit Namensteilen anstelle von Tupeln, weil letztere keine Namen für ihre Mitglieder bereitstellen.

    
Maxim Egorushkin 19.09.2012 12:43
quelle
1

Das ist richtig.

Sie können jedoch mehrere Elemente "zurückgeben", indem Sie Parameter hinzufügen, die als Referenz übergeben werden, und dann die multiplen Ergebnisse an sie schreiben.

    
Mahmoud Al-Qudsi 02.10.2011 05:29
quelle
1

Eine Funktion kann tatsächlich nur eine "Sache" mit ihrer Rückgabeanweisung zurückgeben. Dieses Ding kann jedoch ein Zeiger sein (C & amp; C ++ - Arrays sind einfach verkappte Zeiger), eine Referenz (ein Zeiger, der nicht neu angeordnet oder array-indexiert werden kann) oder ein Objekt, das mehrere Dinge einkapseln kann. p>

Wenn Sie eine Struktur zurückgeben, geben Sie die gesamte Struktur zurück. Wenn Sie einen Zeiger oder eine Referenz zurückgeben, geben Sie nur die Adresse der Struktur zurück - Sie sollten also besser keinen Verweis oder Zeiger auf eine Struktur zurückgeben, die den Gültigkeitsbereich der Funktion verlässt! Dies führt zu einem undefinierten Verhalten, was höchstwahrscheinlich (aber nicht immer) ein Segmentierungsfehler ist.

    
01d55 02.10.2011 05:46
quelle
0

Wenn Sie sich ein größeres Bild über das Lesen von Parametern nach Wert und Referenz übergeben wollen, gilt dies auch für die Rückgabe von Parametern.

Wie Sie erwähnt haben:

  

Sie können mehrere Datenelemente mit einer Struktur zurückgeben, aber mit Zeiger (ich verstehe das nicht) wird der Speicher effizienter genutzt. Ist das korrekt?

Sagen wir, Sie haben eine Struktur:

%Vor%

und eine Methode:

%Vor%

Diese Methode veranschaulicht den Fall, wenn Sie Parameter an die Methode übergeben und sie als Wert zurückgeben. Dies bedeutet, dass Sie jedes Mal, wenn Sie diese Methode aufrufen, das Argument der Methode an eine andere Stelle im Speicher kopieren. Dieses Kopieren benötigt Zeit und wenn Sie größere Strukturen haben, verlangsamt es Ihre Programmlaufzeit, daher ist es effizienter, große Strukturen als Referenz zu übergeben.

%Vor%

In diesem Fall kopieren Sie nicht die gesamte Datenstruktur, sondern übergeben nur die Adresse des Speichers, in dem sich diese Struktur befindet. Sie benötigen auch keine return-Anweisung, da Änderungen an diesem Strukturobjekt außerhalb dieser Methode sichtbar sind. Wenn Sie BigStruct jedoch einem neuen Speicherort zuweisen, wird es nur in der lokalen Methode angezeigt: workWithReference

Ich hoffe, es ist jetzt klarer;)

    
Robertas 02.10.2011 05:48
quelle

Tags und Links