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 :

extern


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut extern
    Je manipule plusieurs fichiers et je suis oblige de travailler avec des variables globales.
    Mais ça ne marche pas comme voulue:
    defmaille.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int choice =0;
     
    void savedonnee()
    {
            if(c==1)  /* traitement */
    }
    Oceano.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "defmaille.c"
     
    extern choice;
     
    void changevalue()
    {
            c=1;
    }
    le traitement se fais ainsi :
    • appel de changevalue();
    • appel de savedonnee();
    Alors je me demande sur la portée des variables declarées extern et comment les bien manipuler.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par ccensam
    Je manipule plusieurs fichiers et je suis oblige de travailler avec des variables globales.
    Mais ça ne marche pas comme voulue:
    defmaille.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int choice =0;
     
    void savedonnee()
    {
            if(c==1)  /* traitement */
    }
    Oceano.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "defmaille.c"
     
    extern choice;
     
    void changevalue()
    {
            c=1;
    }
    le traitement se fais ainsi :
    • appel de changevalue();
    • appel de savedonnee();
    Alors je me demande sur la portée des variables declarées extern et comment les bien manipuler.
    Je n'ai pas tres bien compris ton exemple.

    Mais en voici un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int var_glob;
     
    void changeValue(void);
     
    int main(void) {
        var_glob = 666;
        printf("%d\n", var_glob); /* ici ca affiche 666 */
        changeValue();
        printf("%d\n", var_glob); /* ici ca affiche 42 */
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extern int var_glob;
     
    void changeValue(void) {
        var_glob = 42;
    }

  3. #3
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* celui la est le fichier maille.c */
     
    int varglob=0;
    void manup(),
     
    void manup()
    {
          /* manipulation de varglob */
    }
    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
    /* celui la est un autre fichier oceano.c */
     
    #include <stdio.h>
    #include "maille.c"
     
    void changeValue();
     
    extern int varglob;
     
    int main(int argc , char *argv[]) 
    {
        changeValue();
        manup();
        return 0;
    }
     
    void changevalue()
    {
            varglob = 1;
    }

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Tu voulais peut etre faire un truc du genre :

    defmaille.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int choice =0;
     
    void savedonnee()
    {
            if(choice ==1)  /* traitement */
    }
    defmaille.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef __DEFMAILLE_H__
    #define __DEFMAILLE_H__
    extern int choice;
    #endif
    oceano.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "defmaille.h"
     
    void changevalue()
    {
            choice=1;
    }

  5. #5
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut
    Tu vois bien ce que je veux faire alors ne penser pas trop.
    On sais tous faire ce que vous avez donné, je veux pas entrer dans les detailes..... C'est totalement ce que je veux faire mais pourquoi ça marche pas.

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Qu'est-ce qui ne marche pas ?
    Pourtant mon code est clair...

    Déjà évites de faire des "includes" de fichiers contenant du code. Cela pourrait te jouer des mauvais tours.

    Bon je le refais avec ton dernier exemple :

    Fichier maille.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef __MAILLE_H__
    #define __MAILLE_H__
     
    extern int varglob;
    extern void manup(void);
     
    #endif
    Fichier maille.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int varglob=0;
     
    void manup(void)
    {
          /* manipulation de varglob */
    }
    Fichier oceano.c
    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
    #include <stdio.h>
    #include "maille.h"
     
    void changeValue(void);
     
    int main(int argc , char *argv[]) 
    {
        changeValue();
        manup();
        return 0;
    }
     
    void changevalue(void)
    {
            varglob = 1;
    }

  7. #7
    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 crocodilex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #ifndef __DEFMAILLE_H__
    Attention, identificateurs réservés à l'implémentation.

    http://emmanuel-delahaye.developpez....htm#id_reserve

    préférer H_DEFMAILLE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int choice =0;
     
    void savedonnee()
    {
            if(choice ==1)  /* traitement */
    }
    Pour garantir la cohérence entre déclaration et définition, il faut inclure le .h dans le .c qui définit la variable.

  8. #8
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Attention, identificateurs réservés à l'implémentation.
    "C" bon a savoir....
    Merci du conseil.

    Pour garantir la cohérence entre déclaration et définition, il faut inclure le .h dans le .c qui définit la variable.
    Ah oui, c'est un oubli, désolé, il était très tard....

  9. #9
    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 Skyrunner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdio.h>
     
    int var_glob;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extern int var_glob;
     
    void changeValue(void) {
        var_glob = 42;
    }
    Tu ne ferais pas ça avec des fonctions... Il faut un fichier inclus qui contient la déclaration et soit inclus dans le fichier qui définit la globale et tous ceux qui l'utilisent. C'est la seule façon de garntir une cohérence entre définition et déclaration. En plus, ça permet des trucs sympa genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* data.h */
    #ifndef H_DATA
    #define H_DATA
     
    extern int a[123];
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* data.c */
    #include data.h
    int a[];
    ce qui simplifie la maintenance.

  10. #10
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu ne ferais pas ça avec des fonctions....
    Oui, je sais, c'etait juste pour lui montrer comment fonctionnait le extern, et ne pas faire apparaitre trop de fichier dans mon post.

  11. #11
    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 ccensam
    Je manipule plusieurs fichiers et je suis oblige de travailler avec des variables globales.
    On t'a torturé ?
    Mais ça ne marche pas comme voulue:
    defmaille.c :
    Oceano.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "defmaille.c"
     
    extern choice;
    • On inclue pas de .c dans un .c
    • La déclaration (extern) doit préciser le type.
    Si tu es vraiment obligé d'utiliser les globales, il faut le faire bien :

    http://emmanuel-delahaye.developpez....s.htm#globales

    pose des questions si tu ne comprends pas.

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

Discussions similaires

  1. Position d'une balise dans un document externe
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 02h56
  2. Dialogue DLL externe
    Par rgarnier dans le forum XMLRAD
    Réponses: 8
    Dernier message: 07/05/2003, 14h28
  3. Base de données externe
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 14h09
  4. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

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