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 :

Pourquoi SetLength ? (tableau dynamique)


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut Pourquoi SetLength ? (tableau dynamique)
    bonjour

    pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?

    Merci

  2. #2
    Membre chevronné
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Billets dans le blog
    16
    Par défaut
    Bonjour,

    Tu ne peux utiliser un tableau dynamique sans avoir définie sa taille. Pour cela tu dois passer par un setlength. Cela permets au compilateur de réserver la mémoire dont tu vas avoir besoin pour ton tableau.

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    bonjour

    pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?

    Merci
    et comment fais-tu cela ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Salut;

    et pourtant l'aide de Delphi est assez explicite :

    Pour les tableaux dynamiques,SetLength peut prendre plusieurs paramètres de longueur (autant que le nombre de dimensions du tableau).Chaque paramètre spécifie le nombre d'éléments avec une dimension particulière.
    sauf si tu veux dire autre chose

  5. #5
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    bonjour

    pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?

    Merci
    N'aurais tu pas posé le problème à l'envers ?

    Pourquoi peut-on utiliser le tableau dynamique sans l'initialiser par un SETLENGTH ?

    Voilà une bonne question !
    La réponse réside dans la chance du débutant

  6. #6
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    Voila un bout de code

    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
     
    Procedure TForm1.Tab(tab_champs_condi : array of string) ;
    var
      i,max_tab: integer;
    begin
     
      max_tab              := High(tab_champs_condi);
       for i := 0 to max_tab do
       showmessage(tab_champs_condi[i]); //
     
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     
    Tab(['alpha','zoulou','toutou','7','3','81','7']);  // et l'infini
     
    end;

  7. #7
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Ok, mais il ne s'agit pas d'un tableau dynamique, mais d'un tableau ouvert.

    Extrait de l'aide :

    Citation Envoyé par Extrait de l'aide
    Les constructeurs de tableaux ouverts permettent de construire directement des tableaux dans l'appel de la procédure ou de la fonction. Ils ne peuvent être transmis que comme paramètres tableau ouvert ou comme paramètres tableau ouvert variant.

    Cordialement

  8. #8
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    Quels différences entre le tableau Dynamique et le tableau Ouvert ???

  9. #9
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Le SetLength

  10. #10
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    Quels différences entre le tableau Dynamique et le tableau Ouvert ???
    ce que tu utilises est une constate, pas un tableau dynamique...d'ailleurs tu ne peux pas en modifier la taille par un SetLength
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Par défaut
    Salut

    Citation Envoyé par Jcpan Voir le message
    bonjour

    pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?

    Merci
    Dans la phrase que tu as écrite, puis dans le bout de code que tu as montré, tu fais un amalgame entre 2 choses :
    - l'initialisation du tableau
    - l'utilisation du tableau.

    D'une manière générale : si tu utilises un tableau de 10 cases quelque part dans ton programme, il a bien fallu, à un moment ou à un autre, que ton programme demande au système de la mémoire pour pouvoir stocker ces 10 cases.

    Dans ton exemple, tu appelles ta fonction "Tab" sur un tableau constant, déclaré à même le code : "['alpha','zoulou','toutou','7','3','81','7']". Quand tu compiles ton exemple, le programme dait donc qu'il doit réserver assez de place pour stocker les 7 chaines de caractère. Tu n'as pas écrit explicitement de "SetLength" ou de "GetMem", mais l'allocation est là.

    Tu aurais pu écrire un autre exemple :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
      var
        LTableau : array of string;
     
    begin
     
      SetLength(LTableau, 7); //<- ici, tu demandes explicitement de la place pour 7 cases...
     
      LTableau[0] := 'alpha';
      LTableau[1] := 'zoulou';
      LTableau[2] := 'toutou';
      LTableau[3] := '7';
      LTableau[4] := '3';
      LTableau[5] := '81';
      LTableau[6] := '7';
     
      Tab(LTableau);  // et l'infini
     
    end;
    Dans le corps de la fonction "Tab", par contre, le tableau "tab_champs_condi" est un argument de la fonction. Il fait donc référence à un tableau, qui a à priori déjà été alloué, avant l'appel à cette fonction. Delphi te cache tout un mécanisme qu'il utilise pour gérer les tableaux de manière dynamique ; mais par exemple, quand tu appelles la fonction "High( tab_... )", il est capable de te donner la taille du tableau à ce moment là de l'exécution - ce qui signifie que d'une manière ou d'une autre, il l'a stockée quelque part, par exemple.


    Quels différences entre le tableau Dynamique et le tableau Ouvert ???
    Pour faire sommaire :
    Quand tu déclares le type "array of string" dans une section Var (par ex: le "LTableau : array of string;" ci-dessus), tu déclares un tableau dynamique. Tu peux entre autres réallouer ce tableau (en faisant "SetLength( LTableau, 7);" );
    Quand tu délcares le type "array of string" lors de la déclaration des paramètres d'une fonction (par ex: le "tab_champs_condi : array of string" de ton exemple), tu déclares un tableau ouvert. Ce tableau peut avoir n'importe quelle taille, et Delphi te donne accès à divers paramètres du tableau avec la même interface qu'un tableau dynamique ( "High" te donne le plus haut indice, "Length" la longueur, "tab[i]" te permet d'accéder au contenu de la i-ème case ) mais tu ne peux pas le réallouer.
    En fait(*) quand tu écris une fonction qui prend en argument un "array of Truc", lorsque tu appelles la fonction, Delphi recopie le contenu du tableau passé en argument sur la pile, puis utilise cette copie dans le corps de la fonction. Comme le tableau est alloué sur la pile, il ne peut pas s'amuser à le retailler...

    Un exemple pour illustrer :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    PROGRAM FourreTout;
     
     
    {$APPTYPE CONSOLE}
     
    //Affiche le contenu d'un tableau :
    procedure ShowTab( ATab : array of string );
      var
        i : integer;
    begin
      for i := 0 to High(ATab) do
        WriteLn( ATab[i] );
      WriteLn;
    end;
     
    //Modifie le contenu de la variable passée en argument, et affiche son nouveau contenu :
    procedure ModifierTab( ATab : array of string );
    begin
      //SetLength( ATab, 5 ) <--
      ATab[0] := 'Hello';
      ATab[1] := 'World';
     
      ShowTab(ATab);
    end;
     
    VAR
      LTab : array of string;
      LTab3 : array[0..2] of string;
     
    BEGIN
     
    //Que ce soit pour LTab ou pour LTab3, le contenu de la variable initiale
    //n'est pas modifié après le passage dans ModifierTab :
        WriteLn( ' *** LTab3 :');
        LTab3[0] := 'a';
        LTab3[1] := 'b';
        LTab3[2] := 'c';
     
        ShowTab( LTab3 );
        ModifierTab( LTab3 );
        ShowTab( LTab3 );
     
        WriteLn( ' *** LTab, setlength 3 :' );
        SetLength( LTab, 3 );
        LTab[0] := 'Riri';
        LTab[1] := 'Fifi';
        LTab[2] := 'LouLou';
     
        ShowTab( LTab );
        ModifierTab( LTab );
        ShowTab( LTab );
     
        ReadLn;
    END.
    Hmmm.... je ne suis pas sûr d'avoir étét limpide dans mes explications, ni d'avoir répondu directement à tes questions, mais j'espère que ça t'aidera.

    *LeGEC*


    (*)si j'ai bien compris... je ne suis pas sûr d'avoir entièrement compris, et je veux bien quelques explications plus claires à ce sujet.

  12. #12
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Bravo LeGEC bel effort

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. Pourquoi tableau dynamique et pas statique
    Par Topeur dans le forum Débuter
    Réponses: 1
    Dernier message: 04/04/2008, 12h12
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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