IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Malloc & Macro


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut Malloc & Macro
    Bonjour,

    je viens de voir que les macros permettent de "factoriser" du code un peu comme les fonctions.

    Aussi j'ai un programme ou j'ai énormément d'appels à malloc avec test de réussite et je souhaiterai savoir si je peux en faire une macro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if( ( var = calloc(taille_variable, sizeof(type_variable) ) == NULL )
                    return -1;
    Enfaite je souhaite lorsque je déroule mon programme, qu'il alloue de la mémoire et retourne -1 en cas d'erreur. Si tout se passe bien, "il ne se passe rien" et le programme continue. La taille et le type de var changent (char, unsigned long int, etc).

    Mon idée serait donc qqc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define allocation(a, b)
               if( ( var = calloc(a, sizeof(b) ) == NULL )
                         return -1;
    J'y connais rien en macro donc deja : est-ce que c'est possible ? Si oui comment ? Sinon pensez vous que ce soit plus pertinent qu'une fonction ?


    Est-ce la libération de cet espace mémoire sera identique : free(var) ? (dans la mesure ou c'est possible).

    Merci de vos lumières =)

    n0mad

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Je pense que ce que tu cherches à faire en l'occurence est un fonction inline.

    Méfiance toutefois : tel que tu as écrit ta macro, le « return -1 » provoquera la sortie de la fonction dans laquelle tu l'as invoquée, pas la sortie de la macro elle-même.

    Cependant, si ton code est déjà écrit comme cela, tu peux effectivement mettre ça en macro pour raisons de lisibilité : sache juste que le précompilateur va remplacer toutes les macros qu'il rencontre par le code qui leur est associé, et ce n'est qu'après cette étape que le compilateur va commencer son travail. Ainsi, celui-ci ne saura pas si le code qu'il compile a été écrit en toutes lettres au sein de la fonction ou s'il s'agissait d'une macro qui a été développée.

  3. #3
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    voila c'est pas tres sain comme code mais juste pour te depanner :
    sa met
    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
    #include<stdio.h>/** puts **/
    #include<stdlib.h>/**exit **/
     
     
    #define alloue(a,b)  malloc(a*sizeof(b))
     
    #define allocation(a,b,var)   if( (var = alloue(a,b)) == NULL  ) { \
                                        puts("allocation a echoue");\
                                        exit(-1);\
                                        }
     
     
    int main(){
        int* p ;
        allocation(10000000000000000000000000000,double,p) /**pour etre sur qu'elle echoue**/
     
        return 0 ;
    }
    l'adresse allouee dans p

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par elmcherqui Voir le message
    voila c'est pas tres sain comme code mais juste pour te depanner :
    Comportement indéfini. Il ne faut pas faire n'importe quoi...
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c:13: warning: function declaration isn't a prototype
    C:\dev\hello\main.c:15:54: warning: integer constant is too large for its type
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:15: warning: integer constant is too large for "long" type
    C:\dev\hello\main.c:15: warning: integer overflow in expression
    C:\dev\hello\main.c:15: warning: large integer implicitly truncated to unsigned type
    Output size is 19.21 KB
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 5 warnings
    ceci fonctionne correctement :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define alloue(a, b) malloc (a * sizeof (b))
     
    #define allocation(a, b, ptr)\
    do\
    {\
       if ((ptr = alloue ((a), b)) == NULL)\
       {\
          printf ("l'allocation a echoue en %s:%d\n", __FILE__, __LINE__);\
          exit (EXIT_FAILURE);\
       }\
    }\
    while (0)
     
    int main (void)
    {
       double *p;
       /**pour etre sur qu'elle echoue**/
       allocation (-1, double, p);
     
       return 0;
    }

  5. #5
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    merci -ed- pour la correction .
    Cependant meme en activant tous les warning sur code::blocks je n'ai pas eu autant que les tiens comment sa se fait ? quelqu'un pourrais m'indiquer comment rendre mon compilateur plus attentif ?
    (j'ai windows Xp )

    non c'est bon c'est moi qui ne suis pas attentif en fin de compte . par contre si quelqu'un qui s'y connait en macro pourrais expliquer l'utilité du
    do { }while(0) dans la macro je lui en serait reconnaissant . Merci.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par elmcherqui Voir le message
    non c'est bon c'est moi qui ne suis pas attentif en fin de compte . par contre si quelqu'un qui s'y connait en macro pourrais expliquer l'utilité du
    do { }while(0) dans la macro je lui en serait reconnaissant . Merci.
    Forcer l'usage de la ';' (que tu avais oubliée)

    Pour les warnings :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Évidemment, pour les voir, ne pas se précipiter sur F9 (build and run), mais faire build ...

  7. #7
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define alloue(a, b) malloc (a * sizeof (b))
     
    #define allocation(a, b, ptr)\
    do\
    {\
       if ((ptr = alloue ((a), b)) == NULL)\
       {\
          printf ("l'allocation a echoue en %s:%d\n", __FILE__, __LINE__);\
          exit (EXIT_FAILURE);\
       }\
    }\
    while (0)
    Au sujet de la factorisation, qui semble être la demande du PO, ne serait-il pas plus intéressant de transformer ta macro en véritable fonction?

    Ok, je viens de voir l'intérêt de la macro. Je me suis encore cru en python, ou le type d'une variable passée à une fonction n'est pas figé. Ce qui ne fonctionne pas en C.


    A+

    Pfeuh

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Au sujet de la factorisation, qui semble être la demande du PO, ne serait-il pas plus intéressant de transformer ta macro en véritable fonction?
    Il faut au moins une macro pour que __FILE__ et __LINE__ aient un sens.
    Ok, je viens de voir l'intérêt de la macro. Je me suis encore cru en python, ou le type d'une variable passée à une fonction n'est pas figé. Ce qui ne fonctionne pas en C.
    Oui, autre problème.

  9. #9
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Il faut au moins une macro pour que __FILE__ et __LINE__ aient un sens.
    C'est ça qui est bien avec tes exemples, il y a toujours quelque chose à prendre. __FILE__ et __LINE__, je ne connaissais pas.

Discussions similaires

  1. MACRO pour malloc et effets de bord
    Par ncheboi dans le forum Débuter
    Réponses: 6
    Dernier message: 02/09/2010, 12h42
  2. Malloc et Macro ne font pas bon menage ?
    Par Fooshi dans le forum C
    Réponses: 6
    Dernier message: 02/07/2010, 09h59
  3. macro pour un malloc
    Par salseropom dans le forum C
    Réponses: 4
    Dernier message: 15/02/2006, 10h53
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo