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

Langage Delphi Discussion :

D7 : comment convertir un tableau statique en tableau dynamique


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut D7 : comment convertir un tableau statique en tableau dynamique
    Bonjour,

    Voici mon problème.

    J'ai une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       function MyClass.EncodeStr( const Trame: string; const TabChar: TCharDynArray;
          const TabStr: TStringDynArray ): string;
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       TStringDynArray = array of string;
       TCharDynArray = array of char;

    Le problème est que l'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       MyAdditionalInfos:= EncodeStr( AdditionalInfos, ['^', '|', '='], ['^^', '^+', '^-'] );
    ne compile pas avec l'erreur "[Erreur] XXX.pas(YYY): Types incompatibles : 'Set' et 'TCharDynArray'".


    Cette erreur peut-être résolue en modifiant le prototype de la fonction en spécifiant des tableaux ouverts plutôt que des tableaux dynamiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       function MyClass.EncodeStr( const Trame: string; 
          const TabChar: array of char; const TabStr: array of string): string;

    Seulement cette solution ne me satisfait pas puisque cela m'interdit de passer alors des tableaux dynamiques (la compilation échoue avec l'erreur "[Erreur] U_DrvMere2.pas(415): Types incompatibles : 'Array' et 'dynamic array'").

    N'y a-t-il pas une solution (fonction ?) permettant de convertir des tableaux "statiques" en dynamiques : le but est que le delphi m'accepte un constructeur de tableau ("['A', 'B']" par exemple, qui est donc à priori un tableau statique) comme argument d'une méthode dont le prototype accepte un tableau dynamique ? Cela m'éviterai d'avoir à déclarer une tableau dynamique, de l'affecter à la main indice par indice...

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Pourquoi ne pas utiliser le TSysCharSet ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function MyClass.EncodeStr(const Trame: string; const TabChar: TSysCharSet; const TabStr: TStringDynArray ): string;
    dans ton code, cela ne changera pas grand chose, tu devais avoir un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for K := Low(TabChar) to High(TabChar) do
      begin
        If Trame[I] = TabChar[K] then 
          Result := Result + TabStr[I]
    tu remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        If Trame[I] in TabChar then 
          Result := Result + TabStr[I]
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pourquoi ne pas utiliser le TSysCharSet ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function MyClass.EncodeStr(const Trame: string; const TabChar: TSysCharSet; const TabStr: TStringDynArray ): string;
    dans ton code, cela ne changera pas grand chose, tu devais avoir un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for K := Low(TabChar) to High(TabChar) do
      begin
        If Trame[I] = TabChar[K] then 
          Result := Result + TabStr[I]
    tu remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        If Trame[I] in TabChar then 
          Result := Result + TabStr[I]

    Non je ne peux pas car la méthode ne fonctionne pas comme tu le décrit. En réalité vis à vis de ton code voici mon implémentation actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for K := Low(TabChar) to High(TabChar) do
      begin
        If Trame[I] = TabChar[K] then 
          Result := Result + TabStr[K]
    avec l'opérateur 'in' et avec un 'Set Of' d'une manière plus générale je n'ai pas la notion de l'indice de chaque élément (ou alors il existe une méthode comme pour les énumération mais je l'ignore). Là j'ai besoin de cet indice pour faire le remplacement avec la bonne chaîne de cars.

    Sinon pour répondre moi-même à ma question je crois que je vais me faire ma propre fonction de conversi de tableau statique en dynamique. Dommage que la VCL n'en dispose pas de base, ou alors je ne l'ai pas trouvée. Si vous en connaissez une n'hésitez pas !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    TStringDynArray et TCharDynArray ce sont bien ceux de l'unité Types ?

    sinon tu peux le faire plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      CHAR_A_REMPLACER : array[0..2] of Char = ('^', '|', '=');
    begin
       MyAdditionalInfos:= EncodeStr( AdditionalInfos, CHAR_A_REMPLACER, ['^^', '^+', '^-'] );
    ou remplacer TCharDynArray par une string, tu auras l'index ainsi ... en D7 ça ne pose pas encore de problème ANSI \ UniCode

    MyAdditionalInfos:= EncodeStr( AdditionalInfos, '^|=', ['^^', '^+', '^-'] );[/code]
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    TStringDynArray et TCharDynArray ce sont bien ceux de l'unité Types ?

    sinon tu peux le faire plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      CHAR_A_REMPLACER : array[0..2] of Char = ('^', '|', '=');
    begin
       MyAdditionalInfos:= EncodeStr( AdditionalInfos, CHAR_A_REMPLACER, ['^^', '^+', '^-'] );
    ou remplacer TCharDynArray par une string, tu auras l'index ainsi ... en D7 ça ne pose pas encore de problème ANSI \ UniCode

    MyAdditionalInfos:= EncodeStr( AdditionalInfos, '^|=', ['^^', '^+', '^-'] );[/code]
    Merci, je n'ai pas la possibilité de tester directement aujourd'hui mais je pensais que passer un tableau statique à un prototype "dynamique" (TCharDynArray) ne compilerait pas ? Si ?

    Je ne préfère pas passer par un 'string', je trouve ça "moins logique"... mais c'est sûr ça marcherait aussi bien.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par ZZZzzz2 Voir le message
    Cette erreur peut-être résolue en modifiant le prototype de la fonction en spécifiant des tableaux ouverts plutôt que des tableaux dynamiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       function MyClass.EncodeStr( const Trame: string; 
          const TabChar: array of char; const TabStr: array of string): string;
    Seulement cette solution ne me satisfait pas puisque cela m'interdit de passer alors des tableaux dynamiques (la compilation échoue avec l'erreur "[Erreur] U_DrvMere2.pas(415): Types incompatibles : 'Array' et 'dynamic array'").
    Peux-tu donner le code de l'appel de ta fonction ? Parce qu'en fait, on peut appeler une routine avec un tableau ouvert en lui passant un tableau dynamique.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Peux-tu donner le code de l'appel de ta fonction ? Parce qu'en fait, on peut appeler une routine avec un tableau ouvert en lui passant un tableau dynamique.
    Ben malheureusement je n'ai plus le code, j'ai tout modifié.... et du coup je n'arrive pas à reproduire le cas qui me posait problème.Cela m'ennuie car j'ai fait des modifications à mon avis inutiles du coup, quoique ne serait-ce que pour une question d'optimisation (pas de copie sur la pile à chaque fois) ce n'est pas tout à fait le cas.

    Logiquement le "tableau ouvert" doit avoir des limites pour les appels (avec un tableau dynamique), et je suis tombé dessus j'en suis sûr mais je ne sais plus comment... :-(

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

Discussions similaires

  1. Comment convertir un tableau de données en fichier texte?
    Par pimprenelle57 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/11/2006, 16h12
  2. Réponses: 4
    Dernier message: 13/07/2006, 11h23
  3. comment convertir un fichier xml en tableau de string (java)
    Par l'indien dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/02/2006, 21h00

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