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

  1. #1
    Membre régulier
    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
    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 régulier
    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
    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é
    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 régulier
    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é
    Ce message n'a pas pu être affiché car il comporte des erreurs.
    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
    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 régulier
    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é
    ]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/Libraries/Sydney/fr/System.Classes.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-strings-c-3-different-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 régulier
    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

###raw>template_hook.ano_emploi###