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 :

Question sur un code


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Question sur un code
    Bonjour

    J'ai deux questions sur le code suivant, issu d'un programme que j'étudie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef  __WXMSW__
    #define isnan(x) (_isnan(x))
    #endif
    A quoi correspond WXMSW? Je suppose que c'est un compilateur, comme Visual C++?

    Je ne comprends pas non plus la structure du code:
    #define isnan(x) (_isnan(x))

    Pour moi, la fonction isnan existe dejà, et on la redéfinit. Mais quel est l'intérêt? Pourquoi le mettre en paranthèse?
    Merci

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef  __WXMSW__
    code1
    #else
    code2
    #endif
    Cela se passe lors de la compilation, #ifdef Vérifie si le symbole est définit.

    Si dans le code précédent cette ligne ou dans un include placé aussi avant ce symbole est défini alors alors code1 est compilé sinon cela compile code2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define isnan(x) (_isnan(x))
    Défini une macro isnan paramétré dont le parametre est x

    lors de la compilation si dans ton code tu utilise cette macro elle sera remplacé par le contenu de la macro.

    quelques infos ici
    http://www.cplusplus.com/doc/tutorial/preprocessor/
    [ame]http://en.wikipedia.org/wiki/C_preprocessor[/ame]


    Cordialement

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    J'ai encore une question mais sur la structure suivante, dont j'ai besoin de comprendre le code et le fonctionnement de celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct buffer_ {
       long *buffer;
       long *start,*end;
       long size;
       char flagEof;    /* Set if an end of file character has been pulled (then the buffer will freeze) */
    } Buffer, *BUFFER;
    On définit ici un nouvel objet, "buffer", qui est en réalité une sorte de "tableau" contenant des "long", puisqu'on a : long *buffer.
    Ma question est: a quoi sert le mot: buffer_? Pourquoi ne pas faire simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Buffer {
    .....
    } Buffer, *BUFFER;
    A la fin, on a Buffer et *BUFFER.
    Cela nous permet plus tard de définir un objet de type Buffer, et un autre objet, qui est cette fois un pointeur sur Buffer.

    On a ensuite la fonction d'allocation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     BUFFER NewBuffer(int size)
    {
      BUFFER buf;
      buf = (BUFFER) Malloc(sizeof(struct buffer_));
      buf->buffer = Malloc(sizeof(long)*(size+1));
      buf->size = size+1;
      buf->start = buf->end = buf->buffer;
      buf->flagEof = '\n';
     
      return(buf);
    }
    Cette fonction renvoie un objet de type BUFFER, qui est un pointeur sur Buffer
    la première allocation est fictive, elle permet de créer l'objet buf,
    et la deuxième est réelle, car elle permet de définir la taille de l'objet buf?
    (j'ai l'impression qu'on fait deux fois la même chose). C'est du C, qu'est ce que cela donnerait en C++?
    Merci

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    tu aura des explications ici sur typedef et les structures
    http://fr.wikibooks.org/wiki/Program...s_avanc%C3%A9s

    il y'a aussi une section tutoriel sur le site
    http://melem.developpez.com/tutoriel...page=struct#LV

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Citation Envoyé par deubelte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef  __WXMSW__
    #define isnan(x) (_isnan(x))
    #endif
    A quoi correspond WXMSW? Je suppose que c'est un compilateur, comme Visual C++?
    __WXMSW__ est une directive de compilation utilisée par wxWidgets pour distinguer le code généré pour la plateforme Windows du code généré pour d'autres plateforme. Cette directive n'est définie que lorsque le code est compilée pour produire un logiciel exécutable avec Windows. Par conséquent, tout ce qui se trouve entre ifdef __WXMSW__ et endif ne sera défini que dans ce cas.

    Citation Envoyé par deubelte Voir le message
    Je ne comprends pas non plus la structure du code:
    #define isnan(x) (_isnan(x))

    Pour moi, la fonction isnan existe dejà, et on la redéfinit. Mais quel est l'intérêt? Pourquoi le mettre en paranthèse?
    Merci
    isnan est une fonction C du standard de 99. Cette fonction ne s'appelle pas comme ça sur le compilateur Visual, mais _isnan - avec un caractère souligné en début. isnan et _isnan sont par défaut considérés comme 2 symboles différents par le compilateur. Afin d'utiliser toujours dans son code la même écriture (isnan sans souligné) l'auteur du code utilise la directive de compilation pour faire correspondre la macro isnan vers la fonction _isnan pour les compilations avec windows.

    Citation Envoyé par deubelte Voir le message
    J'ai encore une question mais sur la structure suivante, dont j'ai besoin de comprendre le code et le fonctionnement de celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct buffer_ {
       long *buffer;
       long *start,*end;
       long size;
       char flagEof;    /* Set if an end of file character has been pulled (then the buffer will freeze) */
    } Buffer, *BUFFER;
    On définit ici un nouvel objet, "buffer", qui est en réalité une sorte de "tableau" contenant des "long", puisqu'on a : long *buffer.
    Ma question est: a quoi sert le mot: buffer_? Pourquoi ne pas faire simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Buffer {
    .....
    } Buffer, *BUFFER;
    En C, lorsque tu déclares une structure struct toto, pour l'utiliser tu dois toujours faire précéder le nom toto par le mot clé struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct toto{
    /* définition de la structure */
    };
    struct toto ma_variable; /* OK */
    toto ma_variable; /* Erreur */
    D'où le typedef qui permet de définir un symbole équivalent. On peut alors utiliser Buffer sans le faire précéder de struct.

    Citation Envoyé par deubelte Voir le message
    A la fin, on a Buffer et *BUFFER.
    Cela nous permet plus tard de définir un objet de type Buffer, et un autre objet, qui est cette fois un pointeur sur Buffer.

    On a ensuite la fonction d'allocation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     BUFFER NewBuffer(int size)
    {
      BUFFER buf;
      buf = (BUFFER) Malloc(sizeof(struct buffer_));
      buf->buffer = Malloc(sizeof(long)*(size+1));
      buf->size = size+1;
      buf->start = buf->end = buf->buffer;
      buf->flagEof = '\n';
     
      return(buf);
    }
    Cette fonction renvoie un objet de type BUFFER, qui est un pointeur sur Buffer
    la première allocation est fictive, elle permet de créer l'objet buf,
    et la deuxième est réelle, car elle permet de définir la taille de l'objet buf?
    (j'ai l'impression qu'on fait deux fois la même chose).
    La première allocation n'est pas fictive. Il y a deux choses : la première allocation permet d'obtenir une zone mémoire qui pourra contenir les membres de la structure :
    -> long *buffer : un pointeur sur un long ;
    -> long *start : un pointeur sur un long ;
    -> long *end : un pointeur sur un long ;
    -> long size : un long ;
    -> char flagEof : un char.
    buf contient alors l'adresse de cette zone mémoire.
    La seconde allocation réserve une zone mémoire pouvant contenir size éléments de type long. L'adresse de cette nouvelle zone est mise dans le premier pointeur de buf, buf->buffer et la taille dans buf->size;
    On a donc bien deux allocations différentes, deux zones mémoires différentes et deux rôles différents.
    Je pense que le fait que la structure et qu'un de ses membres possèdent le même nom créé la confusion dans la compréhension de ce code. Il vaudrait mieux changer le nom de l'un des deux pour plus de clarté.

    Citation Envoyé par deubelte Voir le message
    C'est du C, qu'est ce que cela donnerait en C++?
    Il est toujours difficile de traduire du C en C++ car la conception serait probablement différente. Mais, disons, que les différences notables seraient :
    -> L'utilisation d'un std::vector pour le tableau ;
    -> new/delete pour les allocations et les libérations ;
    -> l'utilisation d'un pointeur intelligent pour retourner le nouvel objet.
    -> détail syntaxique : en C++, le typedef n'est pas utile (sauf pour le pointeur, bien sûr).
    Cela ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct s_buffer {
       std::vector<long> buffer;
       //long *start,*end; -> dépend de ce que c'est effectivement représenté. Peut être que ce serait une fonction de la structure buffer.
       //long size; -> pas besoind existe déjà dans std::vector
       char flagEof;
    };
    typedef boost::shared_ptr<s_buffer> sp_buffer;
    sp_buffer NewBuffer(int size)
    {
        sp_buffer new_buf(new s_buffer);
        new_buf->buffer.resize(size+1);
        new_buf->flagEof = '\n';
        return(new_buf);
    }
    Mais comme je te l'ai dit, le code ne serait probablement pas transposé tel quel. Ce serait probablement une erreur. Le passage par l'objet bénéficierait d'une nouvelle conception avec les notions de l'objet.

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Merci pour la réponse
    (Un pti messge de remerciement s'imposait, vue la réponse donnée par Archi3d)

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    En C++, ça donnerait pas plutôt ça?

    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
     
    class Buffer
    {
    public:
     
        // Constructeur
        Buffer( int size )
        : m_flagEof( "\n" )
        {
            this->m_buffer.resize(size+1); 
        }
     
    private:
     
        std::vector<long> m_buffer;
        char m_flagEof;
    };
     
    int main()
    {
        Buffer buffer( 5 );
     
        return 0;
    }
    Enfin dans le cas où on utilise effectivement un std::vector< long > pour un "buffer"

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    En C++, ça donnerait pas plutôt ça?
    Ca pourrait. L'encapsulation pourrait avoir un sens ou pas. C'est pour ça que j'ai voulu insister sur le fait qu'on ne transcrit que rarement des structures C vers des classes si on souhaite porter un projet de C vers C++. Le portage vers C++ nécessite de re-concevoir l'application pour tirer bénéfice de façon optimale de ce que peut apporter l'objet (encapsulation, abstraction, généricité, etc.).
    De façon plus anecdotique, en voyant ses pointeurs begin/end, je me demande si en C++, ça ne se traduirait pas tout simplement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef boost::circular_buffer<long> Buffer;

Discussions similaires

  1. Questions sur le code
    Par Pedro dans le forum Sepi
    Réponses: 5
    Dernier message: 23/12/2006, 13h10
  2. une question sur le code ASP-Nuke
    Par ghita269 dans le forum ASP
    Réponses: 1
    Dernier message: 14/01/2006, 09h41
  3. [Conception] Question sur un code permettant de connaître le nombre de connectés
    Par inferno66667 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 19/12/2005, 19h49
  4. Question sur le code compactage de la FAQ
    Par Nicko29 dans le forum Access
    Réponses: 7
    Dernier message: 14/11/2005, 20h19

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