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

MATLAB Discussion :

Fichier de constantes, multiple définition [MEX]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut Fichier de constantes, multiple définition
    constantes.h[/COLOR
    Code constantes.h[/COLOR : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ]
    #ifndef _CONSTANTES_H
    #define _CONSTANTES_H
    
    const char *str_constant[] = {
        "nom1",
        "nom2"};
    #endif

    Code A.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef _A_H
    #define _A_H
    
    #include "constantes.h"
    
    void fonctionA();
    
    #endif

    Code A.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include "A.h"
     
    void fonctionA()
    {
        ...
        Définition de ma fonction
        printf("%s",str_constant[0]);
        ...
    }

    Code B.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef _B_H
    #define _B_H
    
    #include "constantes.h"
    
    void fonctionB();
    
    #endif

    Code B.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include "B.h"
     
    void fonctionB()
    {
        ...
        Définition de ma fonction
        printf("%s",str_constant[0]);
        ...
    }

    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include "A.h"
    #include "B.h"
     
    void mexFunction(
    int       nlhs,            /* nrhs : nombre de parametres en entree */
    mxArray  *plhs[],          /* prhs : tableau sur les elements en entree */
    int       nrhs,            /* nlhs : nombre de parametres en sortie */
    const     mxArray *prhs[]) /* plhs : tableau sur les elements en sortie */
    {
    fonctionA();
    fonctionB();
    }

    Je comprends à peu prêt d'ou vient l'erreur, il doit surement charger deux fois le fichier constantes.h à la compilation et généré une erreur. Mais les #ifndef / #define ne sont pas censés protéger ces erreurs? Comment remédier à ce problème?

    Merci pour votre aide!

    Edit : je sais pas trop si je devais poser ma question ici, ou dans la partie C... J'espère avoir bien fait!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    En effet, ce que tu cherches à faire cache une certaine complexité : Multiple definition error (link)

    Une solution consiste à utiliser un fichier .c pour initialiser ta variable globale et mettre le mot clé extern dans le header :

    Fichier constantes.h :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _CONSTANTES_H
    #define _CONSTANTES_H
     
    extern const int X[2];
     
    #endif

    Fichier constantes.c :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "constantes.h"
     
    const int X[2] = {1,3};

    Fichier main.c :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "A.h"
    #include "B.h"
    #include "constantes.h"
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
        fonctionA();
        fonctionB();
     
    }

    Fichier A.h :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _A_H
    #define _A_H
     
    void fonctionA();
     
    #endif

    Fichier A.c :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "A.h"
    #include "constantes.h"
     
    void fonctionA()
    {
        mexPrintf("%d\n",X[0]);
    }

    Fichier B.h :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _B_H
    #define _B_H
     
    void fonctionB();
     
    #endif

    Fichier B.c :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "B.h"
    #include "constantes.h"
     
    void fonctionB()
    {
        mexPrintf("%d\n",X[1]);
    }

    Et la ligne de commande MEX pour compiler tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mex main.c A.c B.c constantes.c
    Ce qui donne à l'exécution :
    Même si cet exemple fonctionne, bien lire les liens donnés dans la discussion que j'ai citée au début de ce message

    Les variables globales... c'est mal

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut
    AHhhh merci pour tes explications très claires!

    Pour les variables globales, je sais que c'est 'le mal', mais des fois c'est très dur de s'en passer!

  4. #4
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    tu peux aussi regarder du cote du mot clef 'static'

    Salutations,

    Greg

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès aux fichiers lors de multiples projections
    Par zz6zz6 dans le forum Intégration
    Réponses: 0
    Dernier message: 06/11/2008, 16h04
  2. Réponses: 19
    Dernier message: 05/01/2008, 16h06
  3. Inclure un fichier de constantes
    Par aymron dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2007, 08h04
  4. Réponses: 6
    Dernier message: 22/08/2006, 15h37
  5. [C#] Comment utiliser multiples définitions ?
    Par nesquik dans le forum C#
    Réponses: 4
    Dernier message: 19/06/2006, 17h36

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