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

Réseau C Discussion :

pb avec le préprocesseur


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut pb avec le préprocesseur
    Bonjour, ce message fait un peu suite au message suivant :
    http://www.developpez.net/forums/sho...d.php?t=246902

    Donc voici mon problème : j'ai truffé mon code de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if defined(THREAD)
    faire ceci
    #elif defined(SEQUENTIAL)  (j'ai mis #elif defined(SEQUENTIAL) et non #else car après j'intègrerais un                         #defined MPI)
    faire cela
    #endif
    lors de la compilation, dans mon Makefile, j'ai bien mis l'option -D. Tout compile, c'est super. Sauf que j'ai maintenant des erreurs comme

    ../Sources/SourcesCVode_2_4_0/sundials_math.o(.text+0x88): In function `RSqrt':
    sundials_math.c: undefined reference to `sqrt'
    ../Sources/SourcesCVode_2_4_0/sundials_math.o(.text+0x51): In function `RExp':
    sundials_math.c: undefined reference to `exp'
    ../Sources/SourcesCVode_2_4_0/sundials_math.o(.text+0xb7): In function `RPowerR':
    sundials_math.c: undefined reference to `pow'
    ../Sources/Mysources/functions.o(.text+0x4ea): In function `ComputeSigma2LogNormal':
    functions.c: undefined reference to `log'
    ../Sources/Mysources/functions.o(.text+0x505):functions.c: undefined reference to `log'
    ../Sources/Mysources/functions.o(.text+0x538):functions.c: undefined reference to `erf'
    ../Sources/Mysources/functions.o(.text+0x5aa):functions.c: undefined reference to `log'
    ../Sources/Mysources/functions.o(.text+0x5cf):functions.c: undefined reference to `erf'
    et ainsi de suite. Je remarque que ce ne sont que des fonctions mathématiques qui ne sont pas définies. Y aurait-il un pb dans mon Makefile ? Le voici

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    # SEQUENTIAL : sequential program
    # THREAD     : multi-threaded program
    # MPI        : parallel program with MPI
    VERSION=SEQUENTIAL
     
    # je n'ai pas encore traite le cas VERSION=MPI
     
    CC=gcc
     
    CFLAGS=-Wall -W -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long -Wunreachable-code
     
    ifeq ($(VERSION),SEQUENTIAL)
      LDFLAGS=-Wall -O3 -lm -static
    endif
     
    ifeq ($(VERSION),THREAD)
      LDFLAGS=-Wall -O3 -lm -static -pthread
    endif
     
    # on inclut tous les headers
    INCLUDE_DIR=-I../Headers/HeadersCVode_2_4_0 -I../Headers/Myheaders
     
    # EXE contient le nom des executables a generer.
    EXE=out
     
    # Fichiers sources
    SRC= $(wildcard ../Sources/SourcesCVode_2_4_0/*.c) $(wildcard ../Sources/Mysources/*.c)
     
    # Fichiers objets le .c est remplace par un .o
    OBJ=$(SRC:.c=.o)
     
    %.o: %.c
    	@$(CC) -o $@ -c $< -D$(VERSION) $(INCLUDE_DIR) $(CFLAGS)
     
    # Regles de compilation:	
    all: $(EXE)
     
    $(EXE): $(OBJ)
    	@$(CC) -o $@ $^ -D$(VERSION) $(LDFLAGS)
     
    clean:
    	@rm -rfv $(EXE) $(OBJ) *~
    Si je dois poster une partie de mon code, dite le moi.

    merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Re,
    la compilation avec VERSION=THREAD se passe très bien et le code s'exécute très bien. En revanche, il n'y a un pb que lorsque VERSION==SEQUENTIAL.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Bonjour, j'ai trouvé l'erreur : j'ai remplacé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ifeq ($(VERSION),SEQUENTIAL)
      LDFLAGS=-Wall -O3 -lm -static -pthread
    endif
     
    ifeq ($(VERSION),THREAD)
      LDFLAGS=-Wall -O3 -lm -static -pthread
    endif
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LDFLAGS=-Wall -O3 -lm -static -pthread
    pourquoi est-ce que cela marche ? je ne sais pas. Savez-vous pourquoi ?

  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 salseropom
    j'ai truffé mon code de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if defined(THREAD)
    faire ceci
    #elif defined(SEQUENTIAL)  (j'ai mis #elif defined(SEQUENTIAL) et non #else car après j'intègrerais un                         #defined MPI)
    faire cela
    #endif
    C'est exactement ce qu'il ne faut pas faire. Ca rend le code totalement illisible.

    Un exemple de ce qu'il vaut mieux faire : sockets sous Windows et Linux :

    http://emmanuel-delahaye.developpez....ck/inc/psock.h
    http://emmanuel-delahaye.developpez....ock/inc/inet.h
    http://emmanuel-delahaye.developpez....ock/src/inet.c

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est exactement ce qu'il ne faut pas faire. Ca rend le code totalement illisible.

    Un exemple de ce qu'il vaut mieux faire : sockets sous Windows et Linux :

    http://emmanuel-delahaye.developpez....ck/inc/psock.h
    http://emmanuel-delahaye.developpez....ock/inc/inet.h
    http://emmanuel-delahaye.developpez....ock/src/inet.c
    C'est vrai que c'est illisible et je me suis franchement demandé si ça valait la peine de continuer. J'ai continué de mettre ces #if defined (blabla) histoire d'apprendre. J'avais posé la question dans le précédent post http://www.developpez.net/forums/sho...d.php?t=246902 si cela ne risquait pas de rendre le code illisible mais comme personne ne m'avait répondu, je l'ai quand même fait (même si la raison principale était d'apprendre).

    Ceci dit, juste par curiosité, j'aimerais connaitre la cause de mon erreur... (même si j'abandonne ce projet de mettre 3 codes en 1)

    Je n'ai pas bien compris tes liens. Peux-tu me donner d'autres détails s'il te plait ?

  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 salseropom
    Je n'ai pas bien compris tes liens. Peux-tu me donner d'autres détails s'il te plait ?
    C'est un 'wrapper' autour des fonctions sockets qui est compatible Linux et Windows. Les quelques différences sont traitées par 2 compilations conditionnelles dans le code (inet.c) et une dans un header (inet.h).

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par salseropom
    J'ai continué de mettre ces #if defined (blabla) histoire d'apprendre. J'avais posé la question dans le précédent post si cela ne risquait pas de rendre le code illisible mais comme personne ne m'avait répondu, je l'ai quand même fait (même si la raison principale était d'apprendre).
    Ce n'est pas l'utilisation de #if en elle meme qui rends le code illisible. C'est de les disperse un peu partout dans le code.
    Afin de conserver une bonne lisibilite, il faut encapsuler ces differences dans des fonctions generique et regrouper ces fonctions dans quelques fichiers.
    Ainsi la partie "fonctionnelle" du code est commune a tout les cas et seul une petite partie du code, regroupe a un unique endroit, est sous option de compilation.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/12/2010, 16h27
  2. Réponses: 16
    Dernier message: 08/10/2010, 17h53
  3. [préprocesseur g++]probléme avec les headers
    Par Gotmere dans le forum Autres éditeurs
    Réponses: 14
    Dernier message: 22/03/2007, 17h32
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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