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

 Delphi Discussion :

des lettres en index dans les tableaux


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut des lettres en index dans les tableaux
    Bonjour

    Je souhaiterais creer des tableaux que je pourrais utiliser de la sorte
    valeur[chat]:=33; par exemple.

    ne sachant pas si cela etait possible j ai cherché et ai trouvé sur
    http://fr.wikiversity.org/wiki/Delphi/Tableau que les tableaux Multidimensionnels pouvaient etre declarés comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableau: array[0..2,a..Z] of integer;
    Ok j ai decidé que j utiliserais mon mon tableau ainsi valeur[0,chat]:=33;

    La declaration du tableau entraine une erreur !

    donc ma question :

    est il possible de se servir de 'mots' en tant qu index dans un tableau et si oui comment le declarer et l utiliser puisque le tuto ci dessus me produit une erreur...

    Merci pour votre aide

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    passe le mot chat en constante


    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
      TTableau = array[0..2,0..2] of integer;
     
    var
      MonTableau : TTableau;
     
    const
      chat = 1;
     
    alors
      valeur[0,chat] correspondra à valeur[0,1]
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Tu peux indéxer un tableau avec des caractères, mais pas des mots.

    L'exemple que tu nous donnes a cependant plusieurs erreurs:
    1. Les caractères doivent être entre guillements.
    2. Les limites de la dimension sont fonction de l'ordre des caractères dans la table ansi; toujours du plus petit indice au plus grand.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonPlateau: array[1..8,'A'..'z'] of integer;

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    tttsss, on peut indicer avec des mots

    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
     
    type
      TDefinition  = (chat,chien,loup);
    var
      MonTableau : array[TDefinition] of string;
     
    procedure parcours;
    var
      I: TDefinition;
    begin
       MonTableau[chat] := 'miaule';
       Montableau[chien] := 'aboye';
       Montableau[loup] := 'hurle';
       for I := low(TDefinition) to high(TDefinition) do
         showMessage(MonTableau[I]);
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    Il me semble qu'il n'y a que dans des langages de script que les tableaux peuvent être utilisés comme cela (en php, en perl,...)
    En delphi regarde du côté de TStrings et TstringList avec la propriété values ou la méthode indexof.
    En java on appellait ça des tables de hachage : http://fr.wikipedia.org/wiki/Table_de_hachage

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Pascal Jankowski Voir le message
    tttsss, on peut indicer avec des mots
    D'accord, mais ça reste des expressions constantes .
    Dans l'esprit de SP2308, je pense que "mot" signifiait "string".

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    merci pour vos reponses.

    Je vais donc utiliser la solution de Pascal .

    Je n ai pas delphi sur ce poste donc je me hasarde à une question

    Dans le cas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TDefinition  = (chat,chien,loup);
    si d aventure dans mon script je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom_animal : string;
     
    nom_animal := 'chat';
     
    MonTableau[nom_animal] := 'miaule tres fort'
    n aurais je pas une erreur de type Tdefinition/String ?

    merci

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Bien sûr. nom_animal doit être du type TDefinition.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    bon alors là on va dire que j abuse mais y a t il un moyen de convertir le type string dans un type definit par nous (ici le Tdefinition ) ?

    mais je crois que je vais passer par une fonction qui me retournera un integer en fonction du string (ici chat) et j utiliserais cet int comme index dans mon tableau...

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour info pour passer de TDefinition à un integer il suffit de caster de la façon suivante :

    var
    I : integer;
    D: TDefinition;
    ...
    I := integer(D);



    Un petit procédé pour te permettre de passer d'un string à l'indice

    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
    36
    37
    38
    39
    40
    41
    42
    43
     
    type
      TDefinition  = (chat,chien,loup);
     
    var
      Animaux : array[0..2] of string = ('chat', 'chien', 'loup');
     
    function AnsiIndexStr(AText : string; const AValues : array of string) : integer;
    begin
      Result := 0;
      while Result <= High(AValues) do
        if AValues[Result] = AText then exit
        else inc(Result);
      Result := -1;
    end;
     
    function getAnimal(AsT: string):integer;
    var
      I: integer;
    begin
      case AnsiIndexStr(Ast, Animaux) of
        0  : Result := integer(chat);
        1  : Result := integer(chien);
        2  : Result := integer(loup);
        else Result := -1
      end;
    end;
     
    //**********************************************
     
    procedure process;
    var
      AsT: string;
      Value: integer;
    begin
      AsT := 'chien';
      Value := getAnimal(AsT);
     
      //il faut tester si notre animal est dans la liste
      if  Value <> -1
        then showMessage(Animaux[Value])
        else showMessage('n''est pas dans la liste');
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Une variante sans case:

    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
    function GetAnimal(const Animal :string) :TDefinition;
    var
      i :integer;
    begin
      i := AnsiIndexStr(Animal, Animaux);
     
      if i <> -1
      then Result := TDefinition(i)
      else RaiseLastOSError;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      try
        MonTableau[GetAnimal('chien')] := .... ;
      except
        MessageDlg('Animal inconnu !', mtError, [mbOk], 0);
      end;
    end;
    A noter qu'AnsiIndexStr est déjà défini dans StrUtils .

  12. #12
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Effectivement c'est beaucoup plus simple comme cela
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  13. #13
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    Il me semble qu'il n'y a que dans des langages de script que les tableaux peuvent être utilisés comme cela (en php, en perl,...)
    En delphi regarde du côté de TStrings et TstringList avec la propriété values ou la méthode indexof.
    En java on appellait ça des tables de hachage : http://fr.wikipedia.org/wiki/Table_de_hachage
    En fait la structure de données qui permet d'associer une valeur à une clé et ensuite de retrouver la valeur à partir de la clé s'appelle un Dictionnaire.
    Un tableau est une structure séquentielle qui stocke des éléments de même type et accessibles à partir de leur indice, c'est à dire, de la position de l'élément dans la séquence.

    Chaque langage implémente ces structures de données à sa sauce. En PHP les tableaux n'existent pas. La structure qui est présentée comme un tableau est en réalité un dictionnaire qui simule le fonctionnement d'un tableau en définissant un indice comme clé.

    En Delphi, le tableau est un vrai tableau. Il doit être indexé par un indice de type ordinal, c'est à dire un type fini et énumérable.
    Dans la pratique, ça veut dire un entier ou un type énuméré (qui est en réalité une définition implicite de constantes de type entier).

    Pour faire un dictionnaire en Delphi il y a plusieurs possibilités :
    - Utiliser la classe TStrings en définissant les lignes sous la forme "Cle=Valeur", puis en utilisant la propriété Values :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      Dico : TStrings;
    begin
      Dico := TStringList.Create;
      Dico.Add('Cle1=Valeur1');
      Dico.Add('Cle2=Valeur2');
      ...
      ShowMessage(Dico.Values['Cle1']);
    - Utiliser la classe TStrings en se servant de AddObject pour associer une chaîne à un TObject.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      Dico : TStrings;
    begin
      Dico := TStringList.Create;
      Dico.Sorted := true; // On trie la liste pour de meilleures performances.
      Dico.AddObject('Cle1', Object1);
      Dico.AddObject('Cle2', Object2);
      ...
      idx := Dico.IndexOf('Cle1'); // On recherche 'Cle1'
      if idx<>-1
      then Obj := Dico.Objects[idx]; // Si la clé a été trouvée, on récupère l'objet associé dans Objects au même indice que la clé.
    - Ou encore mieux, à partir de D2009, on utilise la classe generic TDictionary.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      Dico : TDictionary<string, string>;
    begin
      Dico := TDictionary<string, string>.Create;
      Dico.Add('Cle1', 'Valeur1');
      Dico.Add('Cle2', 'Valeur2');
      ...
     
      ShowMessage(Dico['Cle1']);
    La première méthode permet uniquement de gérer des clés de type Chaîne et d'y associer une valeur de type chaîne. De plus la recherche de la valeur associée à la clé est une recherche séquentielle, les temps de recherche sont en O(n).

    La deuxième méthode permet uniquement de gérer des clés de type Chaîne et d'y associer une valeur de type TObject (ou quelque chose qui puisse être transtypé en TObject). Si la liste n'est pas triée, la recherche est une recherche séquentielle en O(n). Si la liste est triée, la recherche est une recherche dichotomique beaucoup plus rapide en O(ln(n)).

    Enfin la troisième méthode permet d'utiliser n'importe quel type de clé et d'y associer n'importe quel type de valeur. La recherche d'un élément à partir de sa clé passe par un tableau hash-codé. Les temps de recherche sont quasi constants et indépendants du nombre d'éléments dans la liste. La recherche est en O(1).

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hia,
    Citation Envoyé par Pascal Jankowski Voir le message
    tttsss, on peut indicer avec des mots
    Non, ce que tu utilises est un type énuméré, et ça n'a rien à voir avec un mot.
    Si les cons volaient, il ferait nuit à midi.

  15. #15
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hia,

    Non, ce que tu utilises est un type énuméré, et ça n'a rien à voir avec un mot.
    Effectivement, c'est un type énuméré. J'ai employé grossièrement le terme "Mot" et je vous prie de m'excuser de ce raccourci pouvant semer la confusion.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    merci pour vos réponses.
    Je vais me pencher activement sur le type Tdictionary je crois

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/10/2009, 11h40
  2. REBUILD des indexs dans les bases systèmes ?
    Par Oxiane dans le forum Administration
    Réponses: 2
    Dernier message: 20/08/2009, 12h06
  3. Est-il possible de travailler avec des index dans les checkboxes ?
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/12/2008, 12h31
  4. Utilisation des index dans les requêtes
    Par john_wili dans le forum SQL
    Réponses: 2
    Dernier message: 02/12/2008, 15h26
  5. Repérage des index dans les datatables
    Par GuyCo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 05/10/2006, 23h12

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