101 votes

Comment puis-je renvoyer plusieurs valeurs à partir d'une fonction en C ?

Si j'ai une fonction qui produit un résultat int et un résultat string, comment puis-je les renvoyer toutes les deux à partir d'une fonction ?

Pour autant que je sache, je ne peux renvoyer qu'une seule chose, telle que déterminée par le type précédant le nom de la fonction.

132voto

Travis Gockel Points 11043

Je ne sais pas ce qu'est votre string, mais je vais supposer qu'il gère sa propre mémoire.

Vous avez deux solutions :

1 : Renvoie un struct qui contient tous les types dont vous avez besoin.

struct Tuple {
    int a;
    string b;
};

struct Tuple getPair() {
    Tuple r = { 1, getString() };
    return r;
}

void foo() {
    struct Tuple t = getPair();
}

2 : Utiliser des pointeurs pour transmettre les valeurs.

void getPair(int* a, string* b) {
    // Check that these are not pointing to NULL
    assert(a);
    assert(b);
    *a = 1;
    *b = getString();
}

void foo() {
    int a, b;
    getPair(&a, &b);
}

Celui que vous choisissez d'utiliser dépend en grande partie de vos préférences personnelles quant à la sémantique que vous aimez le plus.

7voto

zsong Points 20492

Créez une structure et définissez deux valeurs à l'intérieur et retournez la variable struct.

struct result {
    int a;
    char *string;
}

Vous devez allouer de l'espace pour le char * dans votre programme.

7voto

Jesse Beder Points 14026

Étant donné que l'un de vos types de résultats est une chaîne (et que vous utilisez C, pas C++), je recommande de passer des pointeurs comme paramètres de sortie. Utilisation :

void foo(int *a, char *s, int size);

et appelle ça comme ça :

int a;
char *s = (char *)malloc(100); /* I never know how much to allocate :) */
foo(&a, s, 100);

En général, préférez faire l'allocation dans la fonction appelante, pas à l'intérieur de la fonction elle-même, afin que vous puissiez être aussi ouvert que possible pour différentes stratégies d'allocation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X