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 :

Instanciation statique de classe


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut Instanciation statique de classe
    Bonjour,

    Dans le main de mon programme j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pedal My_Pedal;
    If (My_Pedal.search_pedal_port())
       My_Pedal.setup();
    La classe possède un attribut privé portname de type char* qui est calculé dans search_pedal_port. Lorsque je rentre dans la méthode setup, je perds l'initialisation de portname.
    Pourquoi ?
    Même résultat si l'attribut est publique.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Salut

    Pas de raison a priori. Vaut voir en détail le code de ta classe.
    L'utilisation de char* peut laisser penser à un problème de gestion de pointeur (mais vraiment au hasard). C'est volontaire d'utiliser char* au lieu de std::string ?

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Voici le cpp de la classe pedal :

    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
    74
    75
    76
    77
    78
    // **********************************************************
    // * search_pedal_port 										*
    // *														*
    // * enumerate the serial ports	on the tablet				*
    // * search for the one connected to the pedal				*
    // **********************************************************
    bool pedal::search_pedal_port(void)
    {
     
    std::string				sport_number;
    std::string				sport_name;
    int						port_number_max;
    char*					cport_name;
     
    	if (enumerate_serial_ports())
    	{
    		#ifdef CENUMERATESERIAL_USE_STL
    			port_number_max = ports.size();
    		#else
    			port_number_max = ports.GetSize();
    		#endif
    		port_number = 0;
    		while ((pedalport == PEDALPORT_UNKNOWN)&&(port_number != port_number_max))
    		{
    			sport_number = to_string(ports[port_number]);
    			sport_name = "COM" + sport_number;
    			cport_name = const_cast<char*>(sport_name.c_str());
     
    			com = new tserial_event();
    			if (com!=0)
    			{
    				com->setManager(this->SerialEventManager);
    				error = com->connect(cport_name, PEDAL_PORT_SPEED, SERIAL_PARITY_NONE, PEDAL_PORT_BITS, PEDAL_PORT_MODEM_EVENT);
    				if (!error)
    				{
    					this->request_iss_version();
    					this->wait_for_reply();
    					while ((!iss_version_received)&&(!this->pedalreply_timeelapsed));
    					com->disconnect();
    					if (iss_version_received)
    					{
    						portname = cport_name;
    						com->~tserial_event();
    						return PEDAL_DETECTED;
    					}
    					else
    						port_number++;
    				}
    				else
    					return PEDAL_UNDETECTED;
    			}
    		}
    		com->~tserial_event();
    		return PEDAL_UNDETECTED;
    	}
    }
     
    // **********************************************************
    // * setup           										*
    // **********************************************************
    bool pedal::setup(void)
    {
    	com = new tserial_event();
    	if (com!=0)
    	{
    		com->setManager(this->SerialEventManager);
    		error = com->connect(this->portname, PEDAL_PORT_SPEED, SERIAL_PARITY_NONE, PEDAL_PORT_BITS, PEDAL_PORT_MODEM_EVENT);
    		if (!error)
    		{
    			configure_io_mode();
    			wait_for_reply();
    			while ((!io_mode_received)&&(!this->pedalreply_timeelapsed));
    			com->disconnect();
    			com->~tserial_event();
    			return (io_mode_received);
    		}
    	}
    }
    Le pointeur vers portname est bien le même dans les deux méthodes

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    J'avais bien raison de m'inquiéter pour le char*. Je le dis et répète :

    l'utilisation de char* n'est pas sûre, il faut privilégier std::string (et plus généralement, l'utilisation de la STL au lieu du code "old school" comme les pointeurs nus)

    En l’occurrence ici, plusieurs problème :
    * ton char* provient d'un string.c_str(), laquelle string est une variable locale de ta fonction : la chaîne est détruite en sortant de la fonction et ton pointeur n'est plus valide.
    * tu fais un cast d'un const char* en char*, ce qui est une violation du const (et peut poser problème, comme tu le vois...) Pour faire les choses proprement, il faut allouer une nouvelle chaîne char* et copier le const char* dans le char*.
    * com->~tserial_event(); tu appelles le destructeur d'une classe directement ? Tu sais ce que tu fais ? Parce que cela est également une mauvaise pratique (si pas justifié)

    Bref, un code assez moche en peu de ligne..

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    merci et tu as raison

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    * com->~tserial_event(); tu appelles le destructeur d'une classe directement ? Tu sais ce que tu fais ? Parce que cela est également une mauvaise pratique (si pas justifié)
    Il y a des cas justifiés ? t'a un exemple sous la main ?

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617

Discussions similaires

  1. Instanciation d'une classe dans un CustomTag
    Par santana2006 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 30/09/2006, 12h08
  2. Réponses: 2
    Dernier message: 21/04/2006, 20h18
  3. instanciation d'une classe
    Par firejocker dans le forum C++
    Réponses: 6
    Dernier message: 15/11/2005, 11h54
  4. Réponses: 7
    Dernier message: 10/11/2005, 10h09
  5. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

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