je veux créer une fonction qui prend deux tableaux puis, après les avoir modifiés , les renvoie.
Nuance importante : en C, quand tu passes un tableau à une fonction, tu passes seulement l'adresse du premier élément de ce tableau.
Si tu déclares dans ton code :
tab est un tableau de type int[30].
Si ce tableau est envoyé à une fonction ayant pour prototype :
void fonction(int[] t, size_t nb_items);
t sera seulement un pointeur sur un int (soit int*). Dans les paramètres d'une fonction, écrire « type[] nom_variable » revient exactement à écrire « type* nom_variable ». La syntaxe est différente mais la signification est la même : c'est juste un pointeur.
Ta fonction a donc la possibilité de modifier ton tableau sur place, tu n'as pas besoin de retourner une valeur.
Mais si au contraire tu cherches à interdire à ta fonction de modifier ton tableau (par exemple, une fonction d'affichage ou de recherche d'un élément), utilise le mot clef const :
void fonction(const int t[], size_t nb_items);
J'ai l'impression qu'en C une fonction ne renvoie qu'un seul argument.
Exact. Il me semble que le terme « argument » est réservé aux paramètres des fonctions, pour la valeur retour tu peux parler simplement de... valeur.
Faut il créer une structure de deux tableaux et une fonction qui renvoie cette structure?
Comme en C le transfert de paramètres se fait par valeur, si une fonction reçoit ou retourne une structure, toute la structure sera dupliquée en mémoire. C'est pourquoi cette technique est généralement proscrite car ce n'est pas optimisé.
Si tu veux envoyer une structure à une fonction, utilise un pointeur sur cette structure.
Peut on écrire struct devant une fonction?
Oui, mais je te renvoie à ma précédente remarque.
Tu peux aussi utiliser un typedef pour alléger l'écriture et ainsi éviter d'écrire le mot clef struct à chaque fois.
Si tu veux absolument retourner une structure, utilise l'allocation dynamique :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| typedef struct
{
/* éléments */
} Foobar;
Foobar* foobar_init(void)
{
Foobar* f = malloc(*f);
if (f == NULL)
{
/* gestion de l'erreur */
}
/* initialisation des éléments */
return f;
} |
Exemple typique d'un constructeur.
Je n'ai pas de cours de C
N'essaie pas d'apprendre le C à l'aveuglette. 
Achète toi un livre, il y a également de très bon cours disponibles gratuitement sur ce site.
Partager