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 :

Problème d'accés à une donnée d'une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut Problème d'accés à une donnée d'une classe
    Bonsoir,

    Suite la l'incorporation d'une fonction dans une classe pour la gestion d'une thread (j'avais trouvé cela

    http://c.developpez.com/faq/cpp/?pag...onction_membre

    en fouillant dans le forum), j'ai écrit le code suivant (c'est une version "allégée" pour comprendre):

    Le .h

    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
    #define NB_ACCESS   50
    // status
    #define S_INIT		"Init"
    #define S_WORKING	"Working"
    #define S_OPENED	"Opened"
    #define S_CLOSED	"Closed"
    #define S_BLOCKED	"Blocked"
     
    class access
    {
    	public:
    		access(void);
    		~access(void);
     
            // open and close for access management (not for doing an action on one access)
    		void openAll(void);
    		void closeAll(void);
     
    		void setStatus(const unsigned int access, string Status);
            string AccessAray[NB_ACCESS];
     
            void open(const unsigned int access);
            // thread of opening
            void *OpenCall(void *pvParameter); // this can not be in the class because it's a C function
            // http://c.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre
            // reinterpret_cast is used for incorporate in the function
            static void *staticOpenCall(void *Param) 
            { 
                access* Obj = reinterpret_cast<access*>( Param ); 
                return Obj->OpenCall(Param); 
            } 
    };
    Puis le .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
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    // UTAccess.cpp : définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include <pthread.h>
     
    #include <string>
    using namespace std;
     
    #include "Test.h"
     
    access::access(void)
    {
    }
     
    access::~access(void)
    {
    }
     
    void access::openAll(void)
    {
    	unsigned int Cpt;
    	for ( Cpt = 0 ; Cpt < NB_ACCESS ; Cpt++ )
    	{
    		AccessAray[Cpt] = "Hello";//S_INIT;
    	}
    }
     
    void access::closeAll(void)
    {
    }
     
    // Indicate the status of one access number "access"
    void access::setStatus(const unsigned int access, string Status)
    {
    	if (access < NB_ACCESS)
    	{
            AccessAray[0] = "Working";  // Pour debug
    		AccessAray[access] = Status;
    	}
    }
     
    // Code du thread
    void *access::OpenCall(void *pvParameter)
    {
        AccessAray[0] = "Gros souci"; // C'est là, entre les dents et la gencives que les bactéries attaquent
        setStatus(0,S_OPENED);
        return NULL;
    }
     
    // Open access number "access"
    void access::open(const unsigned int access)
    {
        setStatus(access, S_WORKING);
    	// Lance le Thread
        pthread_t ta;
        pthread_create (&ta, NULL, access::staticOpenCall, NULL);
    	return;
    }
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        access a;
     
        a.openAll();
        a.open(0);
     
        while(1);// Juste pour éviter de sortir et faire ire travailler le thread
     
        return 0;
    }
    Ceci compile (avec la gestion des threads), je suis avec VC 2005 Express.
    Bon, le souci est dans le code du thread
    // Code du thread
    void *access::OpenCall(void *pvParameter)
    -> AccessAray[0] = "Gros souci";
    Là VC++ m'indique une violation d'accès que je ne comprends pas.
    Pour voir, j'ai trout mis en public dans ma classe, rien n'y fait.
    Je pense avoir le droit de remplacer le code d'une string par une autre.
    C'est sans doute le code qui incorpore la gestion d'une fonction dans une classe.

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    La réponse est simple, le paramètre que tu passes est NULL (4e paramètre de pthread_create()).

    Mais tu devrais commencer par virer le paramètre et la valeur de retour désormais inutiles de openCall().
    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.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Mais tu devrais commencer par virer le paramètre et la valeur de retour désormais inutiles de openCall().
    OK, je vire la valeur de retour. Je garde la paramètre de retour pour un usage futur.

    La réponse est simple, le paramètre que tu passes est NULL (4e paramètre de pthread_create()).
    Quel rapport y-a-t-il entre la donnée de ma classe AccessAray (accessible puisque je suis dans la même classe) et le 4ième paramètre de pthread_create() ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par Bayard
    Quel rapport y-a-t-il entre la donnée de ma classe AccessAray (accessible puisque je suis dans la même classe) et le 4ième paramètre de pthread_create() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void *staticOpenCall(void *Param) 
    { 
    	access* Obj = reinterpret_cast<access*>( Param ); 
    	return Obj->OpenCall(Param); 
    }
    Que vaut Obj ?
    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.

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    A vrai dire je n'en ai aucune idée.

    J'ai fait un copier coller pour avoir incorporer la fonction de gestion des threads dans ma classe, mais je ne maîtrise pas ce code. D'ailleurs si vous le comprenez je suis preneur d'une explication de texte .

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    C'est simple, Param vaut le 4e paramètre de pthread_create().
    Donc, ici, Param est NULL.
    Donc, Obj est NULL.
    Donc, tu appelles une fonction membre de classe sur un pointeur nul.
    Donc, ça plante.
    CQFD.
    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.

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

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. Réponses: 7
    Dernier message: 11/06/2008, 12h36
  3. Problème d'acces aux données d'une liste Chainée
    Par Le Payton dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2007, 11h00
  4. Réponses: 2
    Dernier message: 18/12/2006, 19h04

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