Peut on retourner un tableau d'entier ?! Je me pose la question !!
Retourner un entier ou mais un tableau ?!!
Faut il retourner un pointeur vers le 1er element du tableau ?!
Peut on retourner un tableau d'entier ?! Je me pose la question !!
Retourner un entier ou mais un tableau ?!!
Faut il retourner un pointeur vers le 1er element du tableau ?!
On ne peut pas renvoyer directement de tableau, seulement un pointeur. Gare à ce qu'il ne soit pas local à la fonction !
Mais on peut retourner une structure contenant un tableau.
Ah mais tu demandes pour un talbeau, ça je connais pas.
Salut,
Comme cela a été dit, tu ne peut pas renvoyer un tableau mais un pointeur vers le premier éléments.
Attention tout de même car cela pose des problèmes.
Il faut que tu l'alloue dynamiquement sinon ton tableau est perdu à la fin de la fonction:
exemple:Ce code NE MARCHE PAS !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 char *fonction() { char buffer[15]; /* ... traitement ... */ return buffer; }
En effet, la fonction te renverra bien l'adresse du tableau buffer mais comme buffer est une variable locale à la fonction, elle est libéré à la fin de la fonction...
Pour faire plus propre, il faut soit que tu alloue dynamiquement le tableau dans la fonction,
Toutefois cela pose des problèmes car en général il est préférable que les allocation / désallocation soit faite dans la même fonction.
De plus si tu utilises ta fonction plus tard dans un autre programme tu peux oublier qu'elle alloue la mémoire donc tu peux oublier de faire le free() --> fuite de mémoire...
exemple:Dans ce cas pas de probleme mais il faut bien penser à liberer la memoire avec un free():
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 char *fonction2() { char *buffer; buffer = (char*) malloc ( sizeof(char) * 15 ); /* ... traitement ... */ return buffer; }
soit que tu passes le tableau alloué en paramètres,:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char *tableau; tableau = fonction2(); printf ("%s\n", tableau); free (tableau);
exemple:utilisation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 fonction3(char *buffer, int sizemax) { /* ... traitement ... */ }Dans ce cas pas de problème d'allocation/libération de la memoire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char tableau[15]; fonction3 (tableau, 15); printf ("%s\n", tableau);
Je te conseille aussi de donner des noms explicite tels que malloc_tableau() si tu alloue dans la fonction...
Il y avait un vieux post ou il y avait eu un mini debat la dessus mais je ne l'ai pas retrouvé...
a++
Pour les chaines de caracteres je sais faire mais pour les entiers, ca me parait bizarre ?!!
Dans ma fonction je devrais donc faire :
Comme ca ou non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int *Tableau; Tableau = malloc (TailleTableau); /*Mon traitement*/ return Tableau;
Pour un tableau d'entiers ça marche pareil que pour un tablea de caractères :
(int *) pour caster en pointeur sur le type entier (int), car malloc renvoit un pointeur sur void
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int *Tableau; Tableau = (int *) malloc (sizeof(int) * TailleTableau); /*Mon traitement*/ return Tableau;
sizeof(int) car à priori tu ne sais pas combien d'octets utilise le type int
Le forcage de la caste n'est pas obligatoire je crois, non ?
Il le fait automatiquement je crois, non ?
Vi mais ça coûte rien de le faire explicitement, comme ça tu es sûr de ce que tu as.Envoyé par taupin
pour réussir à coup sûr, sans faire d'allocation dynamique car pour débute c'est pas ce qu'il y a de plus facile.
prend cette base!!!
la variable tableau est un pointeur sur un tableau donc quand tu le passe en paramètre tu peux en servir comme un tableau et non comme un pointeur de pointeur de tableau (je répete pointeur de deux fois et c'est bien ce que j'ai voulu dire!!!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 // definition la taile de ton tableau cela permet de ne pas avoir à cherché // plein de modification à faire dans tous ton code losrque // tu change la taille de ton tableau #define TAILLE_TABLEAU 6 void main (void) { int tableau [TAILLE_TABLEAU]; //instructions rempir_tableau(tableau); //instructions } void rempir_tableau(&tab) { int i; //exemple d'instruction for(i=0;i<TAILLE_TABLEAU;i++) { tab=getch(); } }
Partager