Wenn ich eine Funktion habe, die ein Ergebnis int
und ein Ergebnis erzeugt string
, wie kann ich beide von einer Funktion zurückgeben?
Soweit ich das beurteilen kann, kann ich nur eines zurückgeben, wie durch den Typ vor dem Funktionsnamen bestimmt.
c
return-value
Tony Stark
quelle
quelle
string
meinen Sie "Ich verwende C ++ und dies ist diestd::string
Klasse" oder "Ich verwende C und dies ist einchar *
Zeiger oderchar[]
Array".Antworten:
Ich weiß nicht, was du
string
bist, aber ich gehe davon aus, dass es sein eigenes Gedächtnis verwaltet.Sie haben zwei Lösungen:
1: Geben Sie a zurück,
struct
das alle benötigten Typen enthält.2: Verwenden Sie Zeiger, um Werte auszugeben.
Welche Sie wählen, hängt weitgehend von Ihren persönlichen Vorlieben ab, welche Semantik Ihnen besser gefällt.
quelle
char *
und asize_t
für die Länge übergeben, es sei denn, es ist absolut wichtig, dass die Funktion ihre eigene Zeichenfolge zuweist und / oder zurückgibtNULL
.getPair
dann dereferenziert . Abhängig davon, was Sie tun (OP hat nie geklärt, ob dies tatsächlich eine C-Frage ist), kann die Zuordnung ein Problem sein, ist jedoch normalerweise nicht in C ++ - Land (Rückgabewertoptimierung speichert all dies) und in C-Land Daten Kopien erfolgen normalerweise explizit (überstrncpy
oder was auch immer).Option 1
: Deklarieren Sie eine Struktur mit einem int und einem String und geben Sie eine Strukturvariable zurück.Option 2
: Sie können einen der beiden per Zeiger übergeben und über den Zeiger Änderungen am Aktualparameter vornehmen und den anderen wie gewohnt zurückgeben:oder
Option 3
: Ähnlich wie bei Option 2. Sie können beide per Zeiger übergeben und nichts von der Funktion zurückgeben:quelle
int fun(char *param, size_t len)
strcpy
zum Beispiel.Da einer Ihrer Ergebnistypen eine Zeichenfolge ist (und Sie C und nicht C ++ verwenden), empfehle ich, Zeiger als Ausgabeparameter zu übergeben. Verwenden:
und nenne es so:
Ziehen Sie die Zuweisung im Allgemeinen lieber in der aufrufenden Funktion vor, nicht innerhalb der Funktion selbst, damit Sie für verschiedene Zuordnungsstrategien so offen wie möglich sind.
quelle
Zwei verschiedene Ansätze:
Ich denke, dass # 1 etwas offensichtlicher ist, was los ist, obwohl es langweilig werden kann, wenn Sie zu viele Rückgabewerte haben. In diesem Fall funktioniert Option 2 ziemlich gut, obwohl die Erstellung spezieller Strukturen für diesen Zweck einen gewissen mentalen Aufwand mit sich bringt.
quelle
string
sicher ist, C ++ anzunehmen ...Erstellen Sie eine Struktur, legen Sie zwei Werte fest und geben Sie die Strukturvariable zurück.
Sie müssen Platz für die
char *
in Ihrem Programm zuweisen .quelle
Verwenden Sie Zeiger als Funktionsparameter. Verwenden Sie sie dann, um mehrere Werte zurückzugeben.
quelle
Durch Übergabe von Parametern unter Bezugnahme auf die Funktion.
Beispiele:
Auch durch die Verwendung globaler Variablen wird dies jedoch nicht empfohlen.
Beispiel:
quelle
void main(void)
OH WIE ES BRENNT!main
soll einen Statuscode zurückgeben. Unter * nix ist es üblicher, dies als zu deklarierenint main(int argc, char *argv[])
. Ich glaube, Windows hat ähnliche Konventionen.Ein Ansatz ist die Verwendung von Makros. Platzieren Sie dies in einer Header-Datei
multitype.h
Auf diese Weise können bis zu vier Variablen von einer Funktion zurückgegeben und bis zu vier Variablen zugewiesen werden. Als Beispiel können Sie sie folgendermaßen verwenden:
Folgendes wird gedruckt:
Die Lösung ist möglicherweise nicht so portabel, da für variadische Makros und for-Anweisungsvariablendeklarationen C99 oder höher erforderlich ist. Aber ich denke, es war interessant genug, hier zu posten. Ein weiteres Problem ist, dass der Compiler Sie nicht warnt, wenn Sie ihnen die falschen Werte zuweisen. Sie müssen also vorsichtig sein.
Weitere Beispiele und eine stapelbasierte Version des Codes mit Gewerkschaften finden Sie in meinem Github-Repository .
quelle
__typeof__