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 :

STATIC Utilisation atypique


Sujet :

C++

  1. #1
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut STATIC Utilisation atypique
    Bonjour a tous,

    Je developpe en ce moment une interface codé en C++, mais je galère a l'utilisation de certaine variable.

    Avant mon programme tournait en C et j'utilisais des variables globales pour certain paramètres que j'utilise dans tous mon programme
    Mais en passant avec le c++, les classes et l'interface en wxWidgets, je me retrouve sans endroit ou je puisse placer mes variables globales

    En faisant des recherches, j'ai fini par utiliser des variables static qui puissent être modifier par toute mes classes ainsi que mes fonctions (qui n'ont pas toutes de classe)

    global.h -> contient les variables static
    Frame.cpp -> donne des valeurs au variable static (frame est une classe)
    A.cpp -> utilise les variables
    B.cpp -> utilise aussi les mêmes variables

    Avec cette architecture, j'ai des soucis.
    Au départ, la fonction appelé par Frame etait placé dans A.cpp
    et dans A je pouvais accéder a ces valeurs tandis que B lui n'avais pas les bonne valeurs
    Si je met la fonction dans B cette fois c'est A qui n'a plus les bonnes valeurs
    Enfin, en placant la fonction dans un autre fichier, cette fois ni A ni B ne voit les valeurs

    J'en arrive a conclure que seul le fichier qui donne des valeurs a mes STATIC est celui qui peut acceder a ces meme valeurs.
    Est ce normal ? Comment puis je contourner mon probleme ?


    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Est-tu certain de ne pas confondre static et extern ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Je crois qu'il parle de variables statiques de classe.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    boli_971
    Invité(e)
    Par défaut
    Tu peux declarer toutes tes variables normalement dans globales.h et a chaque fichier ou tu va utiliser une variable X tu met au debut du fichier: dans le header de ta classe (et tu inclues le fichier globales.h dans ton implementation si tu ne code pas la classe inline).

  5. #5
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut Exemple
    Bonjour et merci pour votre aide
    je vais tester ce que le dernier post me conseille mais avant je vais vous poster ce que j'ai codé en gros, pour que vous voyiez un peu mieux ce que je cherche a faire


    Avant en C j'avais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    global.h
     
    int number;
     
    //####
    main.c
     
    init(&number);
    printf(number); //Jusque la tout va bien pour le langage C
    Maintenant, voici en C++ ce que j'ai

    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
     
    global.h
     
    static int number //Obligé de mettre static sinon tous les fichiers qui inclus global se plaignent que number est deja déclaré dans les autres objets (malgré les #ifdef)
     
    //####
    Frame.h et cpp //C'est une classe qui construit ma frame et qui apelle des fonctions de A.cpp et aussi B.cpp (Mais les fonctions de A et de B ne sont pas membre de ma classe
     
    //-----
    A.cpp
    #include "global.h"
     
    InitVar(); //Init les var globale dont number
    AffNumber_A();
     
    //-----
    B.cpp
    #include "global.h"
     
    AffNumber_B();
    Dans ce cas de figure, frame va appeler InitVar pour mettre number a une certaine valeur (disons 10).
    Si maintenant je fais AffNumber_A();, je retrouve bien ma valeur 10
    Si par contre je fais AffNumber_B();, alors ma valeur ne semble même pas crée, c'est comme si c'était une autre variable que j'appelais

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Autant que je le sache (ce qui n'est pas grand'chose en C), ce n'est pas ici une histoire C/C++, le problème existerait aussi en C, pour peu que deux fichiers incluent le .h.

    Mettre "static int number" signifie : Chaque unité de compilation (= grosso modo chaque cpp) incluant ce .h aura sa propre version de cette variable, séparée de celle des autres. Une autre façon d'exprimer ça en C++ serait avec les namespaces anonymes.

    La solution passe par l'utilisation de "extern int number;" dans le .h, et de "int number;" ou "int number = 42;" dans un .cpp.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Autant que je le sache (ce qui n'est pas grand'chose en C), ce n'est pas ici une histoire C/C++, le problème existerait aussi en C, pour peu que deux fichiers incluent le .h.
    Je confirme. Il y a une certaine tradition -- pas universellement suivie -- sous Unix de ne pas empecher de definir plusieurs fois la meme variable, pour autant qu'elle ne soit pas initialisee (-fno-common chez gcc desactive ce comportement).

  8. #8
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Mettre "static int number" signifie : Chaque unité de compilation (= grosso modo chaque cpp) incluant ce .h aura sa propre version de cette variable, séparée de celle des autres. Une autre façon d'exprimer ça en C++ serait avec les namespaces anonymes.

    La solution passe par l'utilisation de "extern int number;" dans le .h, et de "int number;" ou "int number = 42;" dans un .cpp.


    Je comprends un peu mieux cette histoire de STATIC avec ce que tu me dis dans le paragraphe, pour le C, le comportement m'avait toujours paru étrange.

    Pour reprendre sinon ta solution,
    Le EXTERN permet de declarer qu'une seule valeur unique dans tout le programme. Ensuite, dans mes .cpp, chaque variable que je déclare appelé number fera référence à celle qui est extern (ou l'inverse lol). Mais l'essentiel est que si une fois j'ecris dedans ma valeur 42, alors tous les number de tout mes fichiers auront la valeur 42.
    Si c'est effectivement, c'est tip top :p

  9. #9
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut Tip top
    Et bien pour continuer
    Tip top, cette solution marche parfaitement bien
    Mon bonheur que de voir mes variables initialisés d'un coté de de retrouver les valeurs dans l'autre fichier

    Merci a tous et bonne journée

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

Discussions similaires

  1. [WD-2013] Utilisation atypique de Word 2013
    Par Askalian dans le forum Word
    Réponses: 5
    Dernier message: 12/11/2014, 23h05
  2. Static / non static Utilisation Java
    Par Bobble dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 04/11/2009, 16h59
  3. [JSTL] <c:if> Utilisation de constantes static
    Par ncachet dans le forum Taglibs
    Réponses: 3
    Dernier message: 30/01/2007, 14h32
  4. [JSTL] Utilisation d'un membre static ?
    Par santana2006 dans le forum Taglibs
    Réponses: 4
    Dernier message: 04/04/2006, 11h19
  5. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27

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