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

SL & STL C++ Discussion :

Problème de copie de string dans string


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut Problème de copie de string dans string
    Bonjour,

    J'ai un petit soucis (enfin plutôt gros .. Bref). Je voudrais copier un string dans un autre string. Mon string a est déclaré en tant qu'attribut privé dans mon .h.Je pensais qu'en faisant simplement ce qui est ci dessous, ça pourrait marcher.
    En fait, on m'a expliqué que je copiais l'adresse de l'objet, ce qui fait que j'ai une erreur de segmentation au passage de cette ligne de code. Ce qui est étonnant, c'est que sous Builder, pas de soucis .. Mais là jsuis sous Linux.

    Avez-vous une solution simple ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 75
    Points
    75
    Par défaut
    strcpy(a, b);

    Ou alors, j'ai pas bien compris ton problème.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu utilises std::string alors y a pas de souci. Si tu utilises des char*, alors ce sera strcpy.

    Montre nous donc un peu plus de code.

    http://c.developpez.com/faq/cpp/?page=strings

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    A priori, rien n'empêche de faire ce que tu veux.
    Donne le code exacte, on y vera plus clair.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Bah le problème est plus compliqué alors qu'il parait ne pas y en avoir .. Il faut que je copie un string dans un autre string .. strcpy n'accepte que des chars ..

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Extrait de mon fichier CPP
    Mon plantage se situe donc au niveau du this->ni_channel = carteNi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Configuration::ecrireConfigCarteNi(int choix, string carteNi)
    {
    	cout << "Valeur de l'INT en paramètre : " << choix << endl;
    	cout << "Valeur du string en paramètre : " << carteNi << endl;
     
    	switch (choix)
    	{
    		// Choix = 0, N° Channel
    		case 0 :
    		{
    			this->ni_channel = carteNi ;
    			break;
    		}
    Extrait du fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private :
    	// ATTRIBUTs ----------------------------------------------------------------
    		// Carte NI
    		string ni_channel;
    J'ai bien évidemment vérifier que les valeurs en paramètre de ma fonction sont bon ..

    Jcompran vraiment pas [/code]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    As tu verifié que l'objet Configuration sur lequel tu appeles la méthode 'ecrireConfigCarteNi' est bien construit?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement, pas de quoi faire bugger un programme.

    Le debugger dit quoi exactement ? Quelle est la pile d'appels au moment où ça plante ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    La compilation ne pose pas de problème mais à l'exécution j'ai une belle erreur de segmentation, voilà tout .. Alors en fait j'ai la solution à mon problème, en multipliant le nombre de méthodes de mon programme (passer de 10 à 50) mais bon .. Ce que je n'arrive pas à comprendre c'est pourquoi un string ne peut pas etre copié dans un autre string .. Sous Builder, pas de soucis .. Si jamais quelqu'un a une idée .. Mais je crois bien que je vais faire mes 50 méthodes

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par kazarn
    La compilation ne pose pas de problème mais à l'exécution j'ai une belle erreur de segmentation, voilà tout
    C'est pour ça que je demandais
    Citation Envoyé par Loulou24
    Le debugger dit quoi exactement ? Quelle est la pile d'appels au moment où ça plante ?
    Apprendre à te servir du debugger (si ce n'est pas le cas) te fera gagner un temps énorme.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    C'est pas un problème de copie de string.
    Tu en as pas conscience, mais ta méthode réalise une autre copie de string qui ne pose pas de poblème:

    Suivant le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void Configuration::ecrireConfigCarteNi(int choix, string carteNi)
    { ...
    Le paramètre carteNi est passé par copie à la fonction.
    Si la variable à l'intérieure de la méthode est bonne c'est que la copie entre string fonctionne.
    Je ne sais pas si tu as compris ce que je raconte, mais ton problème n''est certainement pas où tu le penses.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Je n comprends pas tout !

    En fait, je récupère bien mes valeurs (choix & carteNi). En mode console je fais 2 cout et j'obtiens bien :

    Valeur de l'INT en paramètre : 0
    Valeur du string en paramètre : 2

    Donc je ne vois pas ce qui peut poser problème ensuite

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Loulou24
    Citation Envoyé par kazarn
    La compilation ne pose pas de problème mais à l'exécution j'ai une belle erreur de segmentation, voilà tout
    C'est pour ça que je demandais
    Citation Envoyé par Loulou24
    Le debugger dit quoi exactement ? Quelle est la pile d'appels au moment où ça plante ?
    Apprendre à te servir du debugger (si ce n'est pas le cas) te fera gagner un temps énorme.
    Pour le debugger, j'aimerais apprendre à m'en servir mais DDD n'est franchement pas génial et j'ai que ça .. Sous Builder j'aurais gagné du temps .. Si jamais vous connaissez de bons debugger sous Linux, je suis preneur

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    Dans ce genre de symptôme, c'est la validité de l'objet courant qui peut être mis en cause.

    Donc peux-tu nous montrer le code de l'instanciation de ton objet et l'appel à ta méthode.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Bon, pour faire simple je vous passe le code des 3 fichiers épurés car entre les inlines, les new etc ..

    Configuration.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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #ifndef _CONFIGURATION_H
    #define _CONFIGURATION_H
    #include <string>
    #include <sstream> 
    using namespace std;
    class Configuration
    {
    public :
       // ATTRIBUTs ----------------------------------------------------------------
     
       // METHODEs -----------------------------------------------------------------
       // CONSTRUCTEURs et DESTRUCTEURs
       Configuration() ;
       ~Configuration() ;
     
    	/* Lecture de la configuration de chaque élément */
    	string lireConfigCarteNi(int choix);
    	/* Ecrire la configuration de chaque élément */
    	void ecrireConfigCarteNi(int choix, string carteNi);
     
    protected :
       // ATTRIBUTs ----------------------------------------------------------------
     
       // METHODEs -----------------------------------------------------------------
     
    private :
    	// ATTRIBUTs ----------------------------------------------------------------
    		// Carte NI
    		string g_carteNi;
     
    		// Carte NI
    		string ni_channel;
    		string ni_niveauTensionMin;
     
     
       // METHODEs -----------------------------------------------------------------
     
    } ;
     
    //------------------------------------------------------------------------------
    #endif  //_CONFIGURATION_H
    //------------------------------------------------------------------------------
    Configuration.cpp

    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
     
    #include <iostream>
    #include "Configuration.h"
    #include <string>
    using namespace std;
     
    Configuration::Configuration()
    {
    }
     
    Configuration::~Configuration()
    {
    }
     
    //---------------------------------------------------------------------------
    // METHODEs PUBLIQUEs
    //---------------------------------------------------------------------------
    string Configuration::lireConfigCarteNi(int choix)
    {
    	switch (choix)
    	{
    		// Choix = 0, N° Channel
    		case 0 :
    		{
    			cout << "Valeur Channel : " << ni_channel << endl;
    			return this->ni_channel;
    		}
    		// Choix = 1, Niveau tension minimal
    		case 1 :
    		{
    			cout << "Valeur Niveau Tension Min : " << ni_niveauTensionMin << endl;
    			return this->ni_niveauTensionMin;
    		}
    		// Choix = 2, Niveau tension maximal
    		case 2 :
    		{
    			cout << "Valeur Niveau Tension Max : " << ni_niveauTensionMin << endl;
    			return this->ni_niveauTensionMax;
    		}
    	}
    }
    void Configuration::ecrireConfigCarteNi(int choix, string carteNi)
    {
    	cout << "Valeur de l'INT en paramètre : " << choix << endl;
    	cout << "Valeur du string en paramètre : " << carteNi << endl;
     
    	switch (choix)
    	{
    		// Choix = 0, N° Channel
    		case 0 :
    		{
    			this->ni_channel = carteNi ;
    			break;
    		}
    		// Choix = 1, Niveau tension minimal
    		case 1 :
    		{
    			this->ni_niveauTensionMin = carteNi;
    			cout << "Ecriture du niveau Tension Min !" << endl;
    			break;
    		}
    		// Choix = 2, Niveau tension maximal
    		case 2 :
    		{
    			this->ni_niveauTensionMax = carteNi;
    			cout << "Ecriture du niveau Tension Max !" << endl;
    			break;
    		}
    	}
    }
    FichierConfiguration.cpp

    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
     
    //------------------------------------------------------------------------------
    /** @file         FichierConfiguration.cpp
     *  @brief        Fichier Configuration XML (lecture / ecriture)
     *
     *  @author       adesmars
     *  @author       STS IRIS Lycee Nicolas APPERT, ORVAULT (FRANCE)
     *  @since        11 mar 2005 09:24:29
     *  @version      0.1
     *  @date         11 mar 2005 09:24:29
     *
     *  Description detaillee du fichier FichierConfiguration.cpp
     *
     *  Fabrication   gcc 3.3
     *
     *  @todo         Liste des choses restant a faire.
     *  @todo         Liste des choses restant a faire.
     *
     *  @bug          11 mar 2005 09:24:29 - Aucun pour l'instant
     */
    #include "FichierConfiguration.h"
    using namespace std;
     
    FichierConfiguration::FichierConfiguration()
    {
    }
     
    FichierConfiguration::~FichierConfiguration()
    {
    }
     
    void FichierConfiguration::lire()
    {
    	cout << "> Lecture du fichier XML" << endl;
    	// Création du fichier et lecture
    	QDomDocument fichier ("CONFIG");
    	QFile f("config/configuration.xml");
    	// On vérifie que le fichier n'est pas en lecture seul
        if (!f.open(IO_ReadOnly))
    	{
    		cout << "> Fichier verrouillé ou en lecture seul" << endl;
        	return;
    	}
    	// Vérification du fichier
        if ( !fichier.setContent(&f )) 
        {
    		f.close();
            return;
        }
        f.close();
    	cout << "> Création des éléments" << endl;
    	// création des éléments
      	QDomElement docElem = fichier.documentElement();
    	cout << "> Noeud racine" << endl;
    	// Noeud Racine
    	QDomNode n = docElem.firstChild();
      	if ( !n.isNull())
        {
          	// Premier noeud
    		QDomNode n1 = n.firstChild();
    		// Conversion d'un noeud en élément
          	if (!n1.isNull()) 
    		{
    	  		QDomElement e = n1.toElement(); 
    			if (!e.isNull()) 
    	    	{
    	      		QString tag = e.tagName();
    				// Affichage du nom du noeud
    				cout << "	> 1er noeud : Nom du tag : " << tag << endl; 
    			}
    			/* Ecriture & Affichage du Channel de la carte NI */
    			cout << "Ecriture & Affichage du Channel de la carte NI" << endl;
    			this->configuration->ecrireConfigCarteNi(0, n1.toElement().text());
    			cout  << "Ecrire [OK]" << endl;
    FichierConfigurationTesteur.cpp

    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
     
    #include <iostream>
    #include "FichierConfiguration.h"
    #include "Configuration.h"
     
    using namespace std;
     
    int main (int argc, char *argv[])
    {
        // Construction de la classe a tester
        cout << "Construction de l'instance de classe (objet) FichierConfiguration" << endl;
        FichierConfiguration * fichierconfiguration = new FichierConfiguration();
    	Configuration * configuration = new Configuration();
    	fichierconfiguration->lire();
    	fichierconfiguration->ecrire();
    	fichierconfiguration->lire();
        return 0;
    }

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Désolé, c'est pas très clair

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    Si, c'est parfaitement clair :

    l'objet configuration créé dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main (int argc, char *argv[])
    { 
    ....
    Configuration * configuration = new Configuration();
    n'est pas le même que celui qui est utilisé dans la classe FichierConfiguration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void FichierConfiguration::lire()
    { 
    ...
    this->configuration..
    ..
    }
    Ce dernier n'est pas initialisé, et quand tu appeles une méthode sur un objet qui n'est pas initialisé, ça plante

    Tu peux changer le titre de ton post, ça n'a rine à voir avec les string

    [/code]

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    As tu résolu ton problème ?
    Je ne suis pas sur à 100% de ce que je t'ai dit.

    Si oui, n'oublie de marquer ton post comme résolu !

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/04/2015, 15h56
  2. Problème encodage flux xml (CDATA) dans String
    Par Hurricae dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 01/08/2011, 06h50
  3. problème de copie de userform dans excel
    Par pierrepasquetp dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2008, 17h26
  4. VB ExceptionHelper et Recherche d'un string dans string list
    Par chris81 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/06/2008, 10h01
  5. [Tableaux] Supprimer morceaux de string dans string
    Par zulot dans le forum Langage
    Réponses: 9
    Dernier message: 04/03/2006, 16h35

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