Rechercher : dans
Par :

Langage C, MACRO pour tableau

Dernière réponse le 26 sep 2007 à 20:28:39 maymay, le 21 sep 2007 à 04:14:25 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « langage C, MACRO pour tableau » dans :
Langage C - Les types de données Voir Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C++ - Les pointeurs Voir Comme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Introduction au langage C VoirPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie...

1

mamiemando, le 21 sep 2007 à 10:11:16

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

Répondre à mamiemando

2

maymay, le 23 sep 2007 à 09:53:17

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

Répondre à maymay

3

mamiemando, le 23 sep 2007 à 23:59:27

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

Répondre à mamiemando

4

maymay, le 26 sep 2007 à 19:37:06

Pour le moment , pas de question, merci pour ton aide

Répondre à maymay

5

 mamiemando, le 26 sep 2007 à 20:28:39

Parfait alors je clos le sujet ;)

Répondre à mamiemando
Collection CommentÇaMarche.net