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 :

Ecrire dans une variable globale depuis une procédure ?!?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut Ecrire dans une variable globale depuis une procédure ?!?
    Salut,

    J'ai créer une structure (voir ci-dessous) mais quant j'essaye de modifier la variable "statut" depuis une procédure la variable ne change pas de valeur. Par contre quant j'attribut une valeur a cette variable depuis le corps du programme pas de problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
       int num;
       SOCKET socket;
       int statut;
       char pseudo[13];
       SOCKADDR_IN csin;
    }CLIENT;
     
    CLIENT client1, client2, client3, client4;  //déclaration (variables globales)
    Merci de m'aider

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Bon, déjà la notion de procédure n'existe pas en C++ ni en C. Ptet que tu te crois en Pascal...

    Ensuite, ben il n'y a aucun problème. Tu peux modifier "client1.statut" comme tu veux d'où tu veux. De même pour "client2.statut" et les autres...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r
    Bon, déjà la notion de procédure n'existe pas en C++ ni en C. Ptet que tu te crois en Pascal...
    De quoi tu jase?

    Heh, bien sur que ca existe des procedures en c/c++. Tu aurais pas besoin d'un petit cours avant de repondre aux gens?

    Par convention, on dit habituellement qu'une procedure retourne rien (void), alors qu'une fonction retourne une valeur.

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut Re: Ecrire dans une variable globale depuis une procédure ?!
    Citation Envoyé par damien99
    Salut,

    J'ai créer une structure (voir ci-dessous) mais quant j'essaye de modifier la variable "statut" depuis une procédure la variable ne change pas de valeur. Par contre quant j'attribut une valeur a cette variable depuis le corps du programme pas de problème.
    salut

    si tu nous montrais comment tu fais qu'on puisse voir ce qui cloche ?


  5. #5
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par voider
    Heh, bien sur que ca existe des procedures en c/c++. Tu aurais pas besoin d'un petit cours avant de repondre aux gens?
    pour moi il a raison, la notion de procédure n'existe pas en C/C++, même jamais utilisé, même si une fonction ne retournant rien peut être interpreté en tant que procédure,
    aurai-tu besoins d'une bonne introduction avant de casser les gens?


    Pour le monsieur, montre comment tu assigne une valeur à status, sinon pourquoi ne pas passer aux variables locales?
    Compil your life guy!
    The Aures Project

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 011
    Points
    11 011
    Par défaut
    Hyppothèses:
    - variables locales qui masquent les variables globales
    - paramètres passés par valeur

    Et effectivement, on ne parle ni de "procédure" ni de "méthode" en C++. Des équivalents peuvent être réalisés à l'aide de fonctions toutes fois.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Goundy
    aurai-tu besoins d'une bonne introduction avant de casser les gens?
    Hehe, au moins m'a tu fait sourire

    Je maintient tout de meme mon point, peu importe comment on peut l'appeler, le concept de "procedure" existe en c++. Dans le sens ou (on me l'a toujours apprit/dit ainsi) une procedure est une fonction qui ne retourne pas de valeur (void).

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Je pense que le problème vient, comme l'a déjà dit Luc Hermitte
    , c'est un passage de la structure, à la fonction qui est sensée la modifier, par valeur. Ainsi le compilateur va copier la structure dans la liste d'argument, et en fait la fonction va modifier la copie mais pas l'objet copié...
    Il faut voir un passage par pointeur ou référence de la structure à modifier.
    Il faudrai que tu nous donne le code de ta fonction.
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Voila la procédure :
    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
    /**********La prcédure**********/
    void acceptation(HWND dlg, CLIENT cl)
    {
       if(cl.statut==0)     {
          sinsize = sizeof(cl.csin);
          if((cl.socket = accept(sock, (SOCKADDR *)&cl.csin, &sinsize)) != INVALID_SOCKET)     {
             sprintf(buffer,"%cC%c",255,1);
             send(cl.socket,buffer,530,0);
             SetDlgItemText(dlg,120+cl.num,"Occupé");
             cl.statut=1;  /***quant je teste "cl.statut" est à 1***/
          }
       }
    }
    /**********Appel de la prcédure (dans le programme)**********/
    acceptation(hDlg,client1); /*** client1.statut ne veut pas passer à 1 losrque qu'un client se connecte (quant il se connecte client1 biensur)***/
    acceptation(hDlg,client2);/***idem***/
    acceptation(hDlg,client3);/***idem***/
    acceptation(hDlg,client4);/***idem***/
    Pourquoi "cl.statut" dans la structure est = a 1et dans le prgramme les client1/2/3/4 ne sont pas a 1 :

    Il y a aussi un autre problème, la ligne "SetDlgItemText(dlg,120+cl.num,"Occupé");" n'a aucun effet sur le programme. (ça c'est plutot du Visual mais si quelqu'un a une idée...)

    Merci de m'aider

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Ta fonction acceptation telle que définie accepte ses paramètres par copie.
    Lorsque tu l'appelles à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    acceptation(hDlg,client1);
    Le compilateur génère une copie de hDlg et de client1. C'est donc sur une copie de client1 et non pas sur la véritable variable client1 que acceptation() travaille.
    Au retour de cette fonction, seul la copie à été modifiée et non l'original. Ce qui explique que client1.status ne soit pas modifié.

    EDIT1: +1 à LH, puisque sont hypothèse 2 est la bonne (d'ailleurs je suppose que comme d'autres ici, il doit donner quelques cours de C++ débutant )

    EDIT2: Pour ce qui est de l'ergotage procedure/fonction je trouve que pourrir un thread quand on à rien à apporter plus que moyen. On peut avec une bonne intention répondre à coté (je plaide coupable), mais je pense qu'un forum n'est pas une ressource WRITE ONLY

  11. #11
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    salut,
    essaye ce proto pour ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void acceptation(HWND dlg, CLIENT& cl)
    le param cl est passé par référence grace au &, comme ça il n'y a pas de recopie de ton objet, il est directement accesible dans ta fonction et tu peux le modifier

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    En effet le problème était ici, merci

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

Discussions similaires

  1. Borland C++ 6 ecrire dans un objet richedit depuis une DLL
    Par sergeprd dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 18/04/2011, 18h13
  2. Réponses: 4
    Dernier message: 14/10/2009, 10h52
  3. Astuce pour accès aux variables globales depuis une fonction
    Par manur0 dans le forum Général Python
    Réponses: 0
    Dernier message: 03/09/2009, 14h30
  4. Réponses: 9
    Dernier message: 16/03/2006, 20h34
  5. Ecrire dans un tableau html depuis une fonction js ?
    Par botanica dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/10/2005, 12h48

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