Wie gebe ich ein Array von einer Funktion zurück?
Wie kann ich ein array aus einer Methode, und wie muss ich es erklären?
int[] test(void); //??
InformationsquelleAutor der Frage ewggwegw | 2010-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
int* test();
aber es wäre "mehr C++" zu verwenden Vektoren:
std::vector< int > test();
BEARBEITEN
Ich werde klären, irgendwann. Da Sie erwähnten C++, ich gehe mit
new[]
unddelete[]
Betreiber, aber es ist das gleiche mit malloc/free.Im ersten Fall, wirst du etwas schreiben wie:
aber es ist nicht eine gute Idee, denn Ihre Funktion ist client nicht wirklich wissen, die Größe des Arrays zurückgegeben werden, obwohl der client kann sicher freigeben es mit einem Aufruf
delete[]
.Einer besseren Signatur wäre diese:
Client-code wäre jetzt:
Da dies in C++, `std::vector< T > ist eine weit verbreitete Lösung:
Jetzt müssen Sie nicht haben, um Anruf
delete[]
da es behandelt werden, indem Sie das Objekt, und Sie können sicher Durchlaufen Sie mit:was ist einfacher und sicherer.
InformationsquelleAutor der Antwort Simone
Das klingt wie eine einfache Frage, aber in C++ haben Sie ganz ein paar Optionen. Erstens, sollten Sie lieber...
std::vector<>
die wächst dynamisch, jedoch viele Elemente, die Sie stoßen bei der Laufzeit, oderstd::array<>
(eingeführt mit C++11), die speichert immer eine Anzahl von Elementen, die zur Kompilierzeit angegeben,...wie Sie verwalten den Speicher für Sie, die richtige Verhalten, und die Vereinfachung der Dinge wesentlich:
Die Praxis der Erstellung eines
const
Verweis auf die zurückgegebenen Daten können manchmal vermeiden eine Kopie, aber normalerweise können Sie nur verlassen sich auf den Return-Wert-Optimierung, oder - fürvector
aber nichtarray
- move-Semantik (eingeführt mit C++11).Wenn Sie wirklich wollen, verwenden Sie ein eingebaute array (anders als der Standard-Bibliothek-Klasse genannt
array
oben erwähnt) ist eine Möglichkeit für den Anrufer, um Plätze zu reservieren und weisen Sie die Funktion zu verwenden:Andere Möglichkeit ist, wickeln Sie das array in eine Struktur, die - im Gegensatz zu roh-arrays - legal zu zurück durch einen Wert aus einer Funktion:
Beginnend mit den oben genannten, wenn Sie stecken mit C++03 möchten Sie vielleicht zu verallgemeinern, Sie in etwas näher an die C++11
std::array
:Weitere option ist, um die genannte Funktion reserviert Speicher auf dem heap:
Helfen, vereinfachen Sie die Verwaltung von heap-Objekten, viele C++ - Programmierer verwenden Sie "smart pointers", die dafür sorgen, Löschung, wenn Sie den Zeiger(N) auf das Objekt verlassen Ihre Bereiche. Mit C++11:
Wenn Sie stecken auf C++03 ist die beste option, um zu sehen, ob die boost-library ist auf Ihrem Rechner verfügbar ist: es bietet
boost::shared_array
.Doch eine andere option ist es, einige statische Speicher reserviert
fn()
aber dies ist NICHT THREAD-SICHER, und bedeutet, dass jeder Aufruffn()
überschreibt die Daten für jedermann sichtbar halten, Zeiger aus früheren Anrufe. Das heißt, es kann bequem (und schnell) für einfache single-threaded-code.InformationsquelleAutor der Antwort Tony Delroy
Ist es nicht möglich, ein array zurückgeben, von einer C++ - Funktion. 8.3.5[dcl.fct]/6:
Meistgewählten alternativen sind, um eine Wert-Klasse geben, wo diese Klasse enthält ein array, z.B.
Oder zurück einen Zeiger auf das erste element eines statisch oder dynamisch reservierten Arrays, die Dokumentation muss dem Benutzer anzeigen, ob er muss (und wenn ja, wie er sollte) deallocate-array, dass der zurückgegebene Zeiger zeigt.
E. g.
Während es möglich ist die Rückgabe einer Referenz oder einem Zeiger auf ein array sind, ist es äußerst selten, wie es ist, eine komplexe syntax mit keinen praktischen Vorteil gegenüber einem der oben genannten Methoden.
InformationsquelleAutor der Antwort CB Bailey
Gut, wenn Sie wollen, um Ihr array von einer Funktion müssen Sie sicherstellen, dass die Werte werden nicht auf dem stack gespeichert werden, da Sie verschwunden sein wird, wenn Sie die Funktion verlassen.
Also entweder dein array statisch oder den Speicher (oder pass es doch Ihr Erster Versuch wird mit einer void-parameter). Für deine Methode würde ich definieren es wie folgt:
InformationsquelleAutor der Antwort Mark
nur für int
Beispiel
Beispiel für int
InformationsquelleAutor der Antwort ksdarkonix