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 :

Variables globales utilisées par plusieurs fichiers


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Variables globales utilisées par plusieurs fichiers
    Bonjour,

    J'ai besoin de créer un programme contenant :
    _ un fichier datas.c qui récupère une donnée régulierement et l' affecte à une variable
    _ un fichier read.c qui doit lire cette variable régulièrement et executer des actions en fonction de sa valeur

    Les 2 fichiers ne s'appelant pas, j''ai donc penser utiliser une variable globale afin de stocker cette valeur. data.c pourrait alors la modifier et read.c la consulter.

    Me basant sur ce que j'ai pu lire dans le FAQ, j'ai donc un fichier datas.h qui comprends la déclaration "extern int val" alors que mon fichier datas.c comprends la déclaration "int val =4" et mon fichier read.c un "include datas.h".

    Cependant, lorsque j'essaie après d'afficher la valeur de "val" par l'intermédiaire d'un printf dans read.c, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read.c : undefined reference to 'val'
    Je dois donc faire quelque chose de mal mais quoi ?

    Merci beaucoup pour votre aide

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Une solution plus éléguante serais de mettre ta variable en static (privée au module datas.c) pius en publique créer deux fonctions ce qu'on appel communement en Orienté Objet: accesseur/modificateur ... donc une fonction qui permet de lire le contenu de la variable et une qui permet l'écriture de la variable.

    Cette méthode permet aussi d'éviter une modification accidentelle de la variable étant donné qu'il faut dans ce cas utiliser les fonctions pour y acceder !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Je pense qu'il va falloir que tu montres un peu de code.

    Sinon, je preconiserais d'utiliser des accesseurs du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int getval();
    void setval(int newval);
    la vraie valeur serait en globale mais globale seulement au module (utiliser static) qui contient les accesseurs.

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    copiteur !!

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Gruik
    copiteur !!
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Merci pour votre aide.

    J'ai donc essayer de mettre en place votre solution.

    J'ai mis des fonctions "void setVal(newval)" et "int getval()" dans datas.c et déclarer une "static int val"

    Mais quand je fais appel à getval() depuis read.c , j'ai l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    undefined reference to 'getval'
    Pourtant je fais bien un "include "datas.h"" et dans le datas.h j'ai bien déclaré "int getval()".

    D'ou vient mon erreur ? (et oui désolé je n'y connais vraiment pas grand chose)

    Merci encore.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    On peut voir les contenu des tes fichiers ?

    En générale quand il t'affiches ce message d'erreur c'est qu'il ne trouve pas de definition de fonction correspondant à la déclaration du prototype et dans 90% des cas c'est un oublie d'ajout de fichier dans la ligne de compilation !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    En fait le problème c'est que je fais de toutes petites modifs dans un énorme programme (VLC)... Si ca vient de la compliation je vais laisser tomber car le makefile est énorme et je ne tiens pas du tout à devoir le modifier

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par djoule6
    En fait le problème c'est que je fais de toutes petites modifs dans un énorme programme (VLC)... Si ca vient de la compliation je vais laisser tomber car le makefile est énorme et je ne tiens pas du tout à devoir le modifier
    Vérifie bien le nom de tes fonctions, leur casses des lettres, que cela correspond bien entre déclaration et definition, vérifie bien que tu inclus le header dans les modules où tu veux utiliser les fonctions etc...

    Sinon montres nous les fonctions telles que tu les as écrites dans le code pour voir, suffit d'une majuscule là où il n'y en as pas bin c'est rappé !

    Tu sais, si comme tu dis si bien "je n'y connais presque rien", on ne s'attaque pas à la modif d'un programme de cette ampleur, mieux vaut commencer par apprendre le C puis s'entraîner correctement et une fois que tu sent que tu maîtrise assez bien là tu peux !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    non mais j'ai peut-etre exagéré en disant que j'y connaissais presque rien car c'est quand meme mon projet de fin d'étude de mon école d'ingé et y'a deja pleins de choses modifiés dans le code qui marchent mais j'avoue que je ne suis pas capable de mettre le nez dans le makefile... Merci pour votre aide en tout cas !

  11. #11
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par djoule6
    non mais j'ai peut-etre exagéré en disant que j'y connaissais presque rien car c'est quand meme mon projet de fin d'étude de mon école d'ingé et y'a deja pleins de choses modifiés dans le code qui marchent mais j'avoue que je ne suis pas capable de mettre le nez dans le makefile... Merci pour votre aide en tout cas !
    QQN peu mexpliquer a qquoi sert le makefile?
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par miron
    QQN peu mexpliquer a qquoi sert le makefile?
    Les Makefile sont des fichiers qui servent à établir des règles de compilations, d'éditions de liens et autres tests post-compilation etc..., cela évite de devoir entrer des lignes de commandes trops volumineuses pour la compilation en ligne de commandes par exemple !

    En générales elles sont plus ou moins importantes au niveau de la taille, surtout quand c'est généré par des EDI, là c'est même énorme !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Franck.H
    Les Makefile sont des fichiers qui servent à établir des règles de compilations, d'éditions de liens et autres tests post-compilation etc..., cela évite de devoir entrer des lignes de commandes trops volumineuses pour la compilation en ligne de commandes par exemple !

    En générales elles sont plus ou moins importantes au niveau de la taille, surtout quand c'est généré par des EDI, là c'est même énorme !
    Oui mais est il necessaire d'en avoir un par programme?
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par djoule6
    non mais j'ai peut-etre exagéré en disant que j'y connaissais presque rien car c'est quand meme mon projet de fin d'étude de mon école d'ingé et y'a deja pleins de choses modifiés dans le code qui marchent mais j'avoue que je ne suis pas capable de mettre le nez dans le makefile... Merci pour votre aide en tout cas !
    Ok Oui surtout que ce genre de makefile est plutot énorme !

    Moi quand je disais que c'etait possible que ce soit un problème par exemple d'oublie de fichier etc... ce n'était que des supposition, il m'est impossible de le deviner, j'ai oublié mal boule magique

    En tous cas, comme ca sans voir les implementations, prototype et appels de tes fonctions je ne peut t'en dire d'avantage, désolé, je ne suis pas devin, apparement tu as bien fait les choses d'après ce que tu as expliqué mais là encore pour moi ce ne sont que des suppositions
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par miron
    Oui mais est il necessaire d'en avoir un par programme?
    Non, sauf pour de gros projets (ou si tu utilise pleins de libs additionnelles, cela évite d'entrer de trop grande lignes de compilation) et de toutes manieres les EDI s'en chargent à ta place !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  16. #16
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Franck.H
    En tous cas, comme ca sans voir les implementations, prototype et appels de tes fonctions je ne peut t'en dire d'avantage, désolé, je ne suis pas devin, apparement tu as bien fait les choses d'après ce que tu as expliqué mais là encore pour moi ce ne sont que des suppositions
    Oui je sais bien mais pourtant ce que je fais m'a l'air plutot simple, je veux juste me servir de fonctions que j'ai defini dans un autre fichier ... Y'a-t-il un moyen de voir si mon fichier.h est bien associé à mon fichier.c ?

  17. #17
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par djoule6
    Oui je sais bien mais pourtant ce que je fais m'a l'air plutot simple, je veux juste me servir de fonctions que j'ai defini dans un autre fichier ... Y'a-t-il un moyen de voir si mon fichier.h est bien associé à mon fichier.c ?
    Non je ne pense pas, sauf de voir dans le fichier source que le header soit bien inclus c'est tout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  18. #18
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Etant donné que je pense que le problème vient de la compilation de mon .h et donc que les liens entre mes signatures de fonctions dans le .h et mes implémentations de le .c ne sont pas bien fait, est-il possible d'inclure directement le .c ou d'implémenter la fonction directement dans le .h ?

  19. #19
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Mettre l'implémentation de la fonction dans un header est exclu, cela va à l'encontre du bon codage en C et d'ailleurs c'est très peu recommandé !

    Pour le fichier source, le seul moyen est de faire en sorte que le makefile lance la compilation de ce module tout comme il le fait avec les autres modules du programme ... !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/05/2009, 20h55
  2. Variable global utilisable dans plusieurs Forms
    Par nams2590 dans le forum Visual C++
    Réponses: 13
    Dernier message: 11/12/2007, 11h34
  3. variable utilisée par plusieurs classes
    Par yasmine* dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2007, 15h44
  4. Réponses: 22
    Dernier message: 23/11/2006, 23h42
  5. [struts] utilisation de plusieurs fichiers de config
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 25/03/2004, 10h04

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