Retourner une structure à partir d'une fonction en C
-
Utilisez la notation standard pour retourner
struct
à partir de la fonction -
Utilisez la notation de pointeur pour renvoyer
struct
à partir de la fonction
Cet article montre plusieurs méthodes sur la façon de renvoyer un struct
à partir d’une fonction en C.
Utilisez la notation standard pour retourner struct
à partir de la fonction
Le mot clé struct
en C est utilisé pour implémenter des structures de données définies par l’utilisateur. Puisque nous définissons le type struct
dans cet exemple, ce sera une notation plus propre pour les déclarations de fonction si nous tapons
la structure MyStruct
. Il associera un nouvel alias de type pour la structure donnée, et nous n’aurions besoin de spécifier que le nouveau nom d’alias dans le prototype de fonction. Désormais, les fonctions en C peuvent renvoyer la struct
similaire aux types de données intégrés.
Dans l’exemple de code suivant, nous avons implémenté une fonction clearMyStruct
qui prend un pointeur vers l’objet MyStruct
et renvoie le même objet par valeur. Notez que nous devons accéder aux membres struct
en utilisant l’opérateur ->
lorsque le handle est le pointeur vers struct
.
#include <stdio.h>
#include <stdlib.h>
enum { DAY = 9, MONTH = 2 };
typedef struct {
int day;
int month;
} MyStruct;
MyStruct clearMyStruct(MyStruct *st) {
st->day = 0;
st->month = 0;
return *st;
}
int setMyStruct(MyStruct *st, int d, int m) {
if (!st) return -1;
st->day = d;
st->month = m;
return 0;
}
int main() {
MyStruct tmp;
if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
clearMyStruct(&tmp);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
exit(EXIT_SUCCESS);
}
Production:
day: 9
month: 2
day: 0
month: 0
Utilisez la notation de pointeur pour renvoyer struct
à partir de la fonction
Généralement, les structures de données définies par struct
ont tendance à contenir plusieurs membres de données résultant en une grande empreinte mémoire. Maintenant, quand il s’agit de passer des structures relativement grandes entre des fonctions, il est préférable d’utiliser des pointeurs. Le pointeur sert de poignée à l’objet et sa taille est fixe quelle que soit la structure qui y est stockée. L’utilisation de pointeurs pour renvoyer struct
réduit potentiellement le trafic mémoire et donne au code plus de performances. Bien que le programme soit compilé avec des indicateurs d’optimisation, il peut implicitement modifier les instructions de transmission de données. Notez que nous avons utilisé le type enum
pour déclarer des valeurs entières constantes nommées.
#include <stdio.h>
#include <stdlib.h>
enum { DAY = 9, MONTH = 2 };
typedef struct {
int day;
int month;
} MyStruct;
MyStruct *clearMyStruct2(MyStruct *st) {
st->day = 0;
st->month = 0;
return st;
}
int setMyStruct(MyStruct *st, int d, int m) {
if (!st) return -1;
st->day = d;
st->month = m;
return 0;
}
int main() {
MyStruct tmp;
if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
clearMyStruct2(&tmp);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
exit(EXIT_SUCCESS);
}
Production:
day: 9
month: 2
day: 0
month: 0
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook