Error get array size

Fermé
hadrienlearn - Modifié le 4 févr. 2022 à 15:36
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 4 févr. 2022 à 15:59
Bonjour,

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 :-).
A voir également:

3 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié le 4 févr. 2022 à 15:35
Bonjour,

En fait, une fonction ne peut pas recevoir en paramètre un tableau.

Quand tu écris
print_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 tes
sizeof
dans
main()
, ils auront les bonnes valeurs car dans
main()
, 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.
2
Merci beaucoup pour votre aide. J'ai passé le contenu de la fonction dans le
main
et cela marche parfaitement.

Bonne journée
1
yg_be Messages postés 22754 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 mai 2024 1 479
3 févr. 2022 à 20:43
bonjour,
il me semble que le message n'est qu'un avertissement.
quelle valeur obtiens-tu pour la variable
size
?
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?
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
4 févr. 2022 à 15:59
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 le
sizeof
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éciser
const
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 de
struct profile
stockés dans
myRep
, sans doute en vue d'itérer sur chacun d'entre eux.
0