Error get array size
Bonjour,
Je cherche des réponses sur l'obtention de la taille d'un tableau de caractères. Voici mon code:
À la compilation :
Cette erreur vient lorsque j'essaye de récupérer la taille de mon tableau et je n'arrive pas a corriger ce problème.
Merci pour le personnes qui prendront le temps de m'aider :-).
Je cherche des réponses sur l'obtention de la taille d'un tableau de caractères. Voici mon code:
#define MAX_NAME_CHAR 25
#define MAX_TEL_CHAR 10
typedef struct profile
{
signed char name[MAX_NAME_CHAR];
signed char tel[MAX_TEL_CHAR];
} profil;
void print_rep(profil myRep[]);
int main(int argc, char *argv[])
{
profil myRep[1];
return 1;
}
void print_rep(profil myRep[])
{
int s1, s2, size;
s1 = sizeof(myRep);
s2 = sizeof(myRep[0]);
size = s1 / s2;
return;
}
À la compilation :
exercice.c:31:20: warning: 'sizeof' on array function parameter 'myRep' will return size of 'profil *' {aka 'struct profile *'} [-Wsizeof-array-argument]
31 | s1 = sizeof(myRep);
| ^
exercice.c:27:23: note: declared here
27 | void print_rep(profil myRep[])
Cette erreur vient lorsque j'essaye de récupérer la taille de mon tableau et je n'arrive pas a corriger ce problème.
Merci pour le personnes qui prendront le temps de m'aider :-).
3 réponses
-
Bonjour,
En fait, une fonction ne peut pas recevoir en paramètre un tableau.
Quand tu écrisprint_rep(profil myRep[])
, en fait la fonction ne reçoit par un tableau mais un pointeur sur son premier élément, c'est équivalent àprint_rep(profil *myRep)
. Un pointeur s'utilise comme un tableau, et on ne s'en rend pas compte.
Si tu fais tessizeof
dansmain()
, ils auront les bonnes valeurs car dansmain()
, c'est bien un tableau.
Le seul moyen de transmettre la taille, c'est d'utiliser un paramètre supplémentaire pour la transmettre à la fonction. -
Merci beaucoup pour votre aide. J'ai passé le contenu de la fonction dans le
main
et cela marche parfaitement.
Bonne journée -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
il me semble que le message n'est qu'un avertissement.
quelle valeur obtiens-tu pour la variablesize
?
tu écris vouloir obtenir la taille d'un tableau de caractères. en quelle unité veux-tu l'obtenir? que vas-tu faire avec cette taille?-
Bonjour,
Les messages sont effectivement sont effectivement juste des avertissements, qui indique la taille récupérée n'est pas la place (en octet) occupée par le tableau mais la taille du pointeur et donc probablement une erreur de programmation. En effet, comme la taille du pointeur ne dépend pas de la taille du tableau (il fait toujours la taille d'une adresse de mémoire, e.g. 64 bits sur une architecture 64 bits), cet avertissement signifie que lesizeof
incriminé a un intérêt limité...
C'est pourquoi comme le dit Dalfab, il faut souvent passer à une fonction qui manipule un tableau le nombre d'éléments stockés dans le tableau et ainsi lui signifie jusqu'où elle peut le lire, car le pointeur seul ne véhicule pas la taille du bloc mémoire pointé. Personnellement je recommande de n'utiliser dans des fonctions que l'utilisation de pointeurs (sans oublier de préciserconst
si c'est accès en lecture seule).
#include <stdio.h> void print_tab(const int * tab, size_t num_elements) { for (size_t i = 0; i < num_elements; i++) { printf("%d\n", tab[i]); } } int main(){ int tab[10]; for (size_t i = 0; i < 10; i++) { tab[i] = i; } print_tab(tab, sizeof(tab) / sizeof(tab[0])); // ou sizeof(tab) / sizeof(int) return 0; }
Tu écris vouloir obtenir la taille d'un tableau de caractères. en quelle unité veux-tu l'obtenir ? Que vas-tu faire avec cette taille ?
Je pense qu'hadrien c'est un peu mélangé les pinceaux au moment d'écrire son message. Dans le code qu'il partage l23 dans le message #1, on voit que l'objectif semblait être de calculer le nombre destruct profile
stockés dansmyRep
, sans doute en vue d'itérer sur chacun d'entre eux.
-