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++Builder Discussion :

Une question basic sur le type String in C++Builder après 2010 [Langage/Algorithme]


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut Une question basic sur le type String in C++Builder après 2010
    Bonjour,
    j'ai utilisé le type String pour mémoriser les chaines de caractère UniCode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String MyChain[128];
    MyChain[0] = "Test1";
    MyChain[1] = "Les résultat sont : 1, 2, 3, 5, .. etc.";
    MyChain[2] = "Conditiopn 1: 230, 50, 100"; 
    ...
    Tout marche comme ce qu'il faut! Beaucoup mieux que char[].
    Mais j'ai une question pour ma compréhension du type String, quelle la longueur de chaque MyChain[].
    J'ai l'impression que chaque MyChain[] a une longueur automatique. Même après la compilation, on peut utiliser chaque MyChain[] sans trop s'occuper de la limite de longueur.
    J'ai même stocké 4000 caractères dans chaque chaine, pas de débordement!
    Qui gère cela?

    Merci de votre aide
    Xavier

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il faut faire des recherches Internet , mais en gros cela dépend de l'encodage pour la taille d'1 seul caractère :
    • ASCII, c'est 127 caractères, soit 1 octet - tu n'as pas de caractères accentués ni spéciaux entre autres.
    • MBCS (les fameux "code page" de Windows). C'est soit 1 octet soit 2 octets (Shift JIS par exemple)
    • UTF-8, étant compatible ASCII c'est entre 1 octet et 4 octets
    • UTF-16 (le fameux type wchar_t), c'est soit 2 octets (Windows) soit 4 octets (Linux)
    • UTF-32 n'est jamais utilisé pour ces cas là.


    Et ensuite cela va dépendre de ce que contient ta classe. Elle peut contenir plusieurs encodages pour des raisons de compatibilité ou de conversions.

  3. #3
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut
    Merci,
    ma question n'est pas sur un caractère, plutôt sur la chaine, c'est à dire le nombre max des caractères

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Comme String est 1 classe (du moins 1 alias d'1 classe), c'est lors de l'affectation que tout es fait pour supprimer la chaîne courante et la remplacer.
    Donc la longueur maximale, c'est la limite de ton programme/ mémoire/ autre

    Dans la documentation officielle ce n'est pas très clair, mais c'est la fonction System.Length qui semble retourner le nombre de caractères. (<- 2 liens officiels embarcadero.com)

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    hello,
    la documentation française nous dit ceci http://docwiki.embarcadero.com/Libra....UnicodeString


    le type String est défini de la manière suivante :typedef UnicodeString String;

    UnicodeString est l'analogue C++ du type UnicodeString Delphi.

    Delphi utilise plusieurs types de chaîne. UnicodeString peut contenir des chaînes Unicode et ANSI, les chaînes ANSI étant converties d'abord. Le support de ce type inclut les fonctionnalités suivantes :

    Chaînes aussi grandes que la mémoire disponible le permet.
    Utilisation efficace de la mémoire au travers de références partagées.
    Routines et opérateurs qui évaluent les chaînes en fonction des paramètres régionaux en cours.

    Les variables UnicodeString auxquelles il n'a pas été assigné de valeur initiale contiennent une chaîne de longueur nulle.

    Remarque : Delphi supporte aussi UnicodeString, mais l'implémente comme un type primitif au lieu d'une classe. Par défaut, les variables déclarées en tant que chaînes sont de type UnicodeString.

    Les index de chaînes sont de base 1 sur les plates-formes de bureau et de base 0 sur les plates-formes mobiles. Pour de plus amples informations, voir Migration de code Delphi en mobile depuis le bureau.

    Astuce : Vous pouvez parcourir les valeurs d'une chaîne sans spécifier un index. Dans Delphi, utilisez for … in. Dans C++, vous pouvez utiliser les boucles for basées sur l'étendue (uniquement avec les compilateurs C++ améliorés par Clang) et les itérateurs STL afin de parcourir les valeurs d'une chaîne sans spécifier d'index.

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut
    Merci à vous,
    j'avance un petit pas pour ma compréhension.
    Encore un truc: j'ai affecté par défaut 2 caractères dans un String (je n'ai pas défini la longueur max), durant d'exécution de l'exécutable, un utilisateur du programme peut réaffecter une chaine de 500 caractères par exemple.
    Curieusement, tous marche, pas de débordement de pointeur. C'est là que je n'arrive pas à comprendre comment que la longueur de String peut s'adapte même après l'exécution.
    Merci d'avance
    Xavier

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    salut
    c’est lors de l’affectation = que la chaine est initialisée

    juste encore un petit point il faut placer un L avant le debut de la chaine si tu veut que ta chaine soiz en unicode
    [
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String Message=L"ceci est un message de test"
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il faut faire des recherches Internet

    C'est la notion de pile vs tas ("heap").
    En gros, on va détruire/ relâcher la zone mémoire contenant la chaîne de caractères courante et créer 1 nouvelle zone mémoire de la taille de la nouvelle chaîne de caractères et y copier la nouvelle chaîne.
    Ensuite, il peut y avoir d'autres approches.

    Pour faire cela, ce sont les couples
    • en C, malloc/ free - avec les petits frères realloc/ calloc/ ...
    • en C++, new/ delete avec l'appel de constructeurs et destructeurs
    • en C++ et C++ moderne (> 2011, C++11, C++14, C++17, C++20, ...), les pointeurs intelligents ("smart pointer" en anglais)

  9. #9
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut
    Merci foetus,
    Cette fois j'ai compris (désolé, je ne suis pas informaticien), il s'agit d'une gestion dynamique avec String!
    Pour cette raison, l'usage de String (longueur variable) est plus pratique qu'avec char*.
    Cordialement
    Xavier

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    ]Salut,
    je pense qu'il y a peut être un malentendu
    Le Type UnicodeString est un portage du type delphi du même nom et il ne se comporte pas de manière identique à du pur c++ . le fichier include est ustring.h
    il ne faut pas confondre un tableau de caractères de type char avec un tableau d'objets qui n'a aucun sens aujourd'hui (pourquoi faire du statique alors que tant de librairies offre de la gestion dynamique)
    Si veux stoker plusieurs chaines de caractères de longueur différentes ou identiques il est préférables d'utiliser une classe qui a été spécialement conçue pour ceci en C++Builder/Delphi TStringList;

    la petite doc qui va bien http://docwiki.embarcadero.com/Libra...es.TStringList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TStringList *mon TableaudeString = new TStringList(); // 
    TableaudeString->Add(L"Test1");
    TableaudeString->Add(L"Les résultat sont : 1, 2, 3, 5, .. etc.");
    TableaudeString->Add(L"Conditiopn 1: 230, 50, 100"; ");

    tu peux naturellement utilise la bibliothèque de la Stl
    string est plus ou moins identique à String
    pour le tableau de String tu peux utiliser par exemple Vector


    un exemple d'utilisation ici en anglais:https://www.geeksforgeeks.org/array-...t-ways-create/
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut
    Merci DjmSoftware pour cet éclaircissement.
    TStringList est une bonne solution pour mon appli.
    En effet, mon objectif de remplacer les anciens char* par String est pour donner aux utilisateurs la possibilité de librement modifier le contenu de chaque chaine sans contrainte sur la longueur.
    Cordialement
    Xavier

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2009, 12h47
  2. Une question bête sur la mise en forme
    Par couistelle dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 15h08
  3. Question sur le type String
    Par bugland dans le forum Langage
    Réponses: 9
    Dernier message: 12/02/2007, 13h47
  4. Controle d'une Date declaré par le type String.
    Par Mobistar dans le forum Langage
    Réponses: 4
    Dernier message: 21/01/2007, 15h46
  5. Question facile sur la classe string
    Par MarOne dans le forum Langage
    Réponses: 9
    Dernier message: 20/04/2006, 14h28

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