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 :

Déclaration char *


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut Déclaration char *
    Vu tous les problèmes que je rencontre avec les AnsiString dans ma dll... je me penche sur les char *... mais là aussi j'ai peur de la gestion de l'allocation mémoire...
    Donc, la question est :
    La différence pour l'utilisation, l'allocation mémoire et surtout le risque d'écraser ma donnée en mémoire selon les 2 déclarations suivantes???



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            char * varchar;
            varchar ="init";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            char * varchar2;
            varchar2 =  new char[5];
            strcpy(varchar2,"init");
    Sachant que je vais ensuite passer des char * en valeur de retour de mes fonctions de ma dll ????


    Comment également concaténer 2 variables de type char * pour copier dans une troisième?

    Merci

  2. #2
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Si je me rapelle mes cours de C, ta première méthode ne fonctionnera pas vue que tu déclares un pointeur et pas une chaine.
    La deuxième devrait fonctionner.

    Pour concaténer 2 chaines dans une troisième, tu as strcat.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    En C, je suis d'accord,cela ne marche pas ... mais en C++???
    Et en C++ Builder, dans la déclaration du
    ne fait il pas implicitement un new char[5] ????

  4. #4
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Citation Envoyé par charliejo
    En C, je suis d'accord,cela ne marche pas ... mais en C++???
    Et en C++ Builder, dans la déclaration du
    ne fait il pas implicitement un new char[5] ????
    je ne crois pas...

  5. #5
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * varchar;
            varchar ="init";
    Ici, "init" est un tableau de caractère placé dans une zone mémoire en lecture seule. Son type correct est donc const char * ; utiliser un char * et le modifier ensuite mènerait à un comportement indéterminé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * varchar2;
            varchar2 =  new char[5];
            strcpy(varchar2,"init");
    Ici tu alloues bien une chaîne de 4 caractères (+ 0 terminal) sur le free store, et tu y copies "init". C'est la manière correcte de procéder si tu veux que ta chaîne soit modifiable et persistante en mémoire. Par contre il ne faudra pas oublier de la désallouer le moment venu.

    Et en C++ Builder, dans la déclaration du
    ne fait il pas implicitement un new char[5] ????
    Non. Peut-être confonds-tu avec ceci :

    Qui alloue une chaîne de taille correcte (mais pas sur le free store) et y places "init".

    Par contre le mieux serait encore de régler ces problèmes d'Ansistring et de continuer à utiliser cette classe, les manipulation de char* sont rarement conseillées en C++.

    Ou alors si tu ne fais que renvoyer des const char * (ie. pas de chaîne modifiable), ça peut être reglé très rapidement.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    Merci pour l'explication.
    Pour les ansistring, à priori ce sont des problèmes d'emplacement mémoire (mémoire interne à la dll)
    Autre solution : les string ...

    J'ai donc dans ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class testdll{
     testdll(){};
     int TestStr(string & refstr){
         string tmp = "test valeur";
         refstr = tmp;
         return 1;
     }
    }
    Et dans mon application appelant ma dll :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            testdll  * ptestdll;
            ptestdll = new  testdll();
            string strtmp = "init";
            int i = ptestdll->TestStr(strtmp);
            delete ptestdll;
    A priori ça marche, mais je voudrais être sûr que ce code est bon et qu'il n'y a problème avec la mémoire ....
    Quand je fais dans ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         string tmp = "test valeur";
    Dans quelle mémoire la valeur tmp est stocké?
    Et ensuite
    Est ce que cet emplacement sera toujours accesible dans mon application appelante???

    merci

  7. #7
    Membre confirmé Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Par défaut
    Salut !!!

    Citation Envoyé par charliejo
    Autre solution : les string ...
    Il ne s'agit pas d'une "autre solution", il s'agit de LA solution C++ que tu DOIS utiliser ...

    Marco85

  8. #8
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Vu tous les problèmes que je rencontre avec les AnsiString dans ma dll...
    Je ne suis pas un pro des DLL, mais j'ai cru comprendre que l'utilisation de classe de string posait des problèmes avec les DLL non ? Ou alors j'ai mal compris.

    Par exemple dans ces fils :
    http://www.developpez.net/forums/viewtopic.php?t=422407
    http://www.developpez.net/forums/viewtopic.php?t=431709

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    Ok, mais du coup ma fonction et mes appels sont corrects ???
    Quand je fais :
    Il recopie la valeur de tmp dans refstr ???
    Merci

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    Petite précision j'utilise En début de code j'ai

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Utilise std::string.

Discussions similaires

  1. Déclaration de tableau de char
    Par lassault1 dans le forum Débuter
    Réponses: 10
    Dernier message: 01/04/2010, 23h30
  2. Réponses: 3
    Dernier message: 02/07/2003, 16h24
  3. Une déclaration pour la survie du jeu vidéo en France
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 30/10/2002, 14h31
  4. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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