Langage C, MACRO pour tableau

Résolu/Fermé
maymay - 21 sept. 2007 à 04:14
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 26 sept. 2007 à 20:28
bonjour

pourriez vous m'expliquer l'interet des macros , et la signification de cette ligne

#define NB_ELEMS(array) ( (int) (sizeof (array) / sizeof *(array)) ;

merci d'avance
A voir également:

5 réponses

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
21 sept. 2007 à 10:11
c'est une macro qui calcule la taille mémoire occupée par un tableau (sizeof(array)) et la divise par la taille d'une case de tableau (sizeof(*array) = sizeof(array[0])). Le résultat est casté en int (mais ça ne sert en fait à rien car c'est déjà un entier, quitte à caster ça aurait été plus logique de le faire vers un unsigned). Pour t'en convaincre écris ce petit programme :
#include <stdio.h>

int main(){
    long double tab[69];
    printf(
        "sizeof(tab) = %i sizeof(*tab) = %i sizeof(tab)/sizeof(*tab)=%i\n",
        sizeof(tab),sizeof(*tab),sizeof(tab)/sizeof(*tab)
    );
    return 0;
}

Compile le et exécute le :
(mando@aldur) (~) $ gcc -W -Wall main.c
(mando@aldur) (~) $ ./a.out
sizeof(tab) = 828 sizeof(*tab) = 12 sizeof(tab)/sizeof(*tab)=69

828 = la taille occupée par le tableau de 69 long double
12 = la taille d'un long double
69 = le nombre de case
Tu peux essayer de changer "long double" par un autre type, tu verras que ça continue à marcher. Par contre ça ne marchera pas avec un tableau alloué dynamiquement (avec un malloc).

Bonne chance
0
mamiendo, merci d'avoir repondu , j'ai executé le code mais , j'obtiens des resultats differents
690=taille occupé par le tableau de 69 long double
10= taille d'un long double
69=nombre de case

deux autre petites question
quel est l'interet de definir cette macro dans un code , on pouvait tout simplement definir une cst = NBR_ELMT ;

what's that ???

(mando@aldur) (~) $ gcc -W -Wall main.c
(mando@aldur) (~) $ ./a.out
sizeof(tab) = 828 sizeof(*tab) = 12 sizeof(tab)/sizeof(*tab)=69
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
23 sept. 2007 à 23:59
Pour la différence de résultat c'est peut être que les long double ne sont pas encodés sur autatnt de bits sous windows et sous linux.
L'intérêt de la macro c'est qu'elle marche pour tout tableau alloué de manière statique. Ca veut en particulier dire que tu peux l'utiliser pour tableau de différentes tailles et de différents types. Par exemple :
int tab[58];
char tab2[7];
long double tab3[567];

Mais bon de manière général c'est mieux d'allouer tes tableaux dynamiquement avec un malloc et de les desallouer avec un free, car on connaît rarement la taille requise pour un tableau pour toute exécution d'un programme. Souvent cela sous entend que le tableau est suralloué et que de la mémoire est "gaspillée".

Pour le what's that c'est simplement les deux commandes à taper sous linux pour compiler le programme, et te montrer ce que ca donne à l'exécution.

D'autres questions ? ;-)

Bonne chance
0
pour le moment , pas de question, merci pour ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
26 sept. 2007 à 20:28
Parfait alors je clos le sujet ;)
0