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 :

copie d'un tableau de char*


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut copie d'un tableau de char*
    Bonjour,
    je sais que ce n'est pas terrible d'utiliser les char*, qu'il vaudrait mieux utiliser les string, mais j'utilise une librairie de fonctions qui utilise les char*.
    J'essaie donc de copier un const char** dans un tableau de char**. Mon code est le suivant, il fonctionne. Je pensais être obligé de rajouter le code en commentaires pour préciser la taille de chaque char* de mon tableau de char*. Or, non seulement ça n'est pas nécessaire, mais ça ne marche pas quand je décommente ces lignes.
    Quelqu'un peut il m'expliquer pourquoi ? Mon code est il correct ?

    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
     
    #include <iostream>
     
    using namespace std;
     
     
    main()
    {
     
    const char* tab[]={ "baba", "bibi", "bobo" };
     
    char ** copie_tab;
     
    int size_tab;
     
    size_tab=sizeof(tab)/sizeof(char*);
    cout << "taille de tab : " << size_tab << endl;
     
    copie_tab=new char*[size_tab];
     
    for (int i=0;i<size_tab;i++)
    {
    //  copie_tab[i]=new char[sizeof(tab[i])/sizeof(char)];
      copie_tab[i]=const_cast<char *> (tab[i]);
    }
     
    for (int i=0;i<size_tab;i++)
      cout << tab[i] << "  et " << copie_tab[i]  << endl;
     
    //for (int i=0;i<size_tab;i++)
    //  delete [] copie_tab[i];
     
    delete [] copie_tab;
     
    }
    Question subsidiaire : que se passe-t-il en mémoire ? Les chaînes de caractères sont elles recopiées, ou mon tab_copie ne fait il que pointer sur les éléments de mon tableau initial (si c'est le cas, est ce problématique, puisque mon tableau d'origine est constant?) ?

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 160
    Points
    160
    Par défaut
    Tu pourrais utiliser un strcpy pour dupliquer les tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i=0;i<size_tab;i++)
    {
      strcpy(copie_tab[i],tab[i]);
    }

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Question subsidiaire : que se passe-t-il en mémoire ? Les chaînes de caractères sont elles recopiées, ou mon tab_copie ne fait il que pointer sur les éléments de mon tableau initial
    Reponse : tab_copie ne fait il que pointer sur les éléments de mon tableau initial

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Merci, j'ai essayé avec strcpy, j'ai une erreur de segmentation. Je vais chercher, mais j'ai un autre problème, c'est que quand je met un char** dans le constructeur d'une classe, seul le premier élément est vu ; par exemple, dans la continuité de l'exemple précédent :

    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
     
     
     #include <iostream>
     
    using namespace std;
     
    class bidon {
    public :
      char ** tableau;
     
      bidon(const char **tab){
        int taille=sizeof(tab)/sizeof(char*);
        cout << "constructeur : " << taille << endl;
        tableau=new char*[taille];
        for (int i=0;i<taille;i++)
        {
        tableau[i]=const_cast<char*>(tab[i]);
        cout << "constructeur : " << i << " " << tableau[i] << endl;
    //      strcpy(tableau[i],tab[i]); // erreur de segmentation     
        }
      }
      ~bidon(){delete [] tableau;}
    };
     
    main()
    {
     
    const char* tableau_bidon[]={ "baba", "bibi", "bobo" };
     
    bidon essai(tableau_bidon);
     
    }
    Seul s'affiche "baba".
    Que paso ?

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    mais j'utilise une librairie de fonctions qui utilise les char*.
    En quoi cela pose t'il un problème pour utiliser les std::string ?
    Quand il faut passer des const char*, il suffit d'appeler c_str() et rulz.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Il faut allouer de la mémoire pour chaque chaine avant de faire un strcpy.

    Exemple : (Sur la base de ton 1er exemple )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0;i<size_tab;i++)
         {
            copie_tab[i]=new char[strlen(tab[i])+1];
            strcpy(copie_tab[i],tab[i]);
         }
    (Ne pas oublier les delete[] quand tu n'en a plus besion.)

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Et pourquoi copier ? Ton API C va modifier les chaines que tu lui passes ?
    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...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Non, la librairie ne modifie pas ma chaîne, c'est vrai, je peux me passer de la copie, mais ce tableau est un attribut d'une classe que j'ai créée (ce sont des paramètres de projection ), d'où la "nécessité" de copier (pour afficher les paramètres de projection d'un objet de cette classe par exemple).

    Sinon, ok pour le strcpy, merci.

    Encore sinon, c'est vrai aussi que je peux utiliser les string, ce que j'ai fait ci dessous.

    Sinon, pour le tableau en argument du constructeur, Je n'ai trouvé qu'une parade, qui consiste à rajouter dans le prototype de mon constructeur, la taille du tableau fourni en premier argument. Est ce propre ?

    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
     
     
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class bidon {
    public :
      char ** tableau;
     
      bidon(string tabs[], int taille)
      {
     
        tableau=new char*[taille];
        for (int i=0;i<taille;i++)
        {
          tableau[i]=const_cast<char*>(tabs[i].c_str());
        cout << "constructeur : " << i << " " << tableau[i] << endl;
     
        }
      }
      ~bidon(){delete [] tableau;}
    };
     
    main()
    {
     
    string tableau_bidon[]={ "baba", "bibi", "bobo" };
     
    int taille_bidon=sizeof(tableau_bidon)/sizeof(string);
     
    bidon essai(tableau_bidon,taille_bidon);
     
    }
    Est ce correct ? Est il donc impossible d'accéder directement à la taille du tableau à l'intérieur du constructeur ?

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Je ne vois pas non plus ce qui t'empêche de travailler de ton côté avec des std::string et quand tu as besoin de char* tu appels c_str()...
    Solidaire avec Davidbrcz.
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

Discussions similaires

  1. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  2. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  3. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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