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 :

Question Array Dimensions.


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut Question Array Dimensions.
    Bonjour,

    J´ai une question au sujet des dimensions d´un array.

    Un petit schéma pour m´expliquer.

    0: (0:c,d,b)(1:c,d,b)(2:c,d,b)(3:c,d,b)(4:c,d,b)(5:c,d,b)(6:c,d,b)(7:c,d,b)
    1: (0:c,d,b)(1:c,d,b)(2:c,d,b)(3:c,d,b)(4:c,d,b)(5:c,d,b)(6:c,d,b)(7:c,d,b)
    2: ...
    3: ...
    jusque a 15 (car il m´en faut max.16)
    Voici ma question:
    Est ce que cette définition est correcte? ou peut on faire mieux?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Type
      TFeld = record
        c: char;
        d: Boolean;
        b: Boolean
    end;
     
    var
        TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    non ce n'est pas la bonne définition
    tu peut le faire de différente façon

    le plus simple est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Type
      TFeld = record
          c: char;
          d: Boolean;
          b: Boolean
      end;
      TArrFeld = array[0..7] of TFeld; 
      TMatFeld = Array[0..15] of TArrFeld;  
    var
        TestArray: TMatFeld;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      type 
         TFeld = record
           c: char;
           d: Boolean;
           b: Boolean
        end;
        TMatFeld = Array[0..15,0..7] of TFeld;  
     var
        TestArray: TMatFeld;
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
       // Define dynamic array
       TMatFeld : Array of Array of TFeld;  // Multi-dimension array 
    ....
    begin
      SetLength(multiArray, 15, 7);
      ...
    a toi de voir ce que tu prefere
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Bonjour

    Pas certain de bien comprendre ta question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    Mais si c'est : Est-ce que tu peux faire un tableau à 0 dimension comme ceci

    Alors c'est oui

    Autrement dit

    Cette déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMatFeld = Array[0..15,0..7] of TFeld;
    est équivalente a celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    Habituellement pour la lisibilité la seconde déclaration est à privilégiée, mais pas toujours.

    ...

    Par exemple, tu veux fusionner deux tableaux pour en former un seul. Avec l'indice 0, tu n'as pas à écrire deux routine de fusion:
    une routine pour fusionner 2 tableaux à 3 dimensions,
    une routine pour fusionner un tableau à 3 dimensions et un à 2 dimensions

    Note bien cela m'arrive avec les tableaux dynamiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array of array of array of TFeld;

    A+

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    Ok, maintenamt je vois beaucoup plus clair.

    Merci vous deux.

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    Citation Envoyé par sgmsg Voir le message
    Bonjour

    Pas certain de bien comprendre ta question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    Mais si c'est : Est-ce que tu peux faire un tableau à 0 dimension comme ceci

    Alors c'est oui

    Autrement dit

    Cette déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMatFeld = Array[0..15,0..7] of TFeld;
    est équivalente a celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    ah bin non c'est pas équivalent du tout tu passe d'un tableau de 2 à 3 dimension
    ce n'est pas du tout pareil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    ce serait plutot l'equivalent d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TestArray:  array of array of array of TFeld;
    la notation [0..0] sert à déclarer des tableaux "ouvert".
    C'était "l'ancienne" manière de réaliser des tableaux dynamiques.

    Pour ça, on crée une structure tableau sans bornes réelles (avec [0..0]), ce qui permet dans la suite du programme d'adresser notre tableau comme n'importe quel autre tableau.
    Bien entendu, on ne peut pas utiliser ce tableau directement. On lui ajoute donc un type pointeur vers celui-ci pour pouvoir lui allouer la mémoire nécessaire à la taille voulue.

    Habituellement pour la lisibilité la seconde déclaration est à privilégiée, mais pas toujours.
    A+
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut


    ah bin non c'est pas équivalent du tout tu passe d'un tableau de 2 à 3 dimension
    ce n'est pas du tout pareil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    ce serait plutot l'equivalent d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TestArray:  array of array of array of TFeld;
    la notation [0..0] sert à déclarer des tableaux "ouvert".
    C'était "l'ancienne" manière de réaliser des tableaux dynamiques.

    Pour ça, on crée une structure tableau sans bornes réelles (avec [0..0]), ce qui permet dans la suite du programme d'adresser notre tableau comme n'importe quel autre tableau.
    Bien entendu, on ne peut pas utiliser ce tableau directement. On lui ajoute donc un type pointeur vers celui-ci pour pouvoir lui allouer la mémoire nécessaire à la taille voulue.
    C'était "l'ancienne" manière de réaliser des tableaux dynamiques.

    J'en savait rien. Et puis franchement est-ce que ça change de l'utilité ou non d'une telle déclaration?


    ah bin non c'est pas équivalent du tout tu passe d'un tableau de 2 à 3 dimension
    ce n'est pas du tout pareil


    Pas d'accord le tableau occupe le même espace.

    Un exemple simplifié de ce qui traîne dans un de mes programmes qui roule tout les jours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const MonTableauDeFruits:array[0..3]of string=('Pomme','Orange','Banane','Poire'):
    var i:integer;
    begin
        for i:=0 to high(tableau) do begin
             ... //confitures
        end;
    Après quelques temps je n'avais besoin que d'un seul fruit le code est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const MonTableauDeFruits:array[0..0]of string=('Pomme');//,'Orange','Banane',Poire'):
    var i:integer;
    begin
        for i:=0 to high(tableau) do begin
             ... //compote
        end;
    Ça pris moins de 3 secondes pour modifier ce code. Si tu ne vois pas l'intérêt à de tels tableaux, bien je te laisse le plaisir de réécrire deux jours de code pour des principes d'orthodoxie informatique.

    Avec un peu d'imagination tu trouveras d'autres applications. Que ce soit pour la logique ou pour la lisibilité.


    A+

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    sauf que dans ton cas tu reste bien que sur une dimension
    lui dans sont cas il en gère trois au lieu de deux
    1 2
    TMatFeld = Array[0..15,0..7] of TFeld;
    1 2 3
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    pour visualiser le code dans des boucle

    pour les deux dimension
    For i := low(TMatFeld) to high(TMatFeld) do
    For j:= low(TMatFeld[i]) to high(TMatFeld[i]) do
    TMatFeld[i,j]
    pour les 3
    For i := low(TestArray) to high(TestArray) do
    For j:= low(TestArray[i,0]) to high(TestArray[i,0]) do
    TestArray[i,0,J]
    d’après toi c'est la même chose ?
    ensuite comment le système gère ça c'est différent
    je me souvient très récemment avoir eu la surprise de voir que les tableau étais rangé de façon contigu en mémoire
    a ce moment là on parlé de la propriété pixels[] et effectivement
    Pixel[x,y] est équivalente pour le moment
    a Pixel[x+(y*L)] avec L la longueur de l'image
    donc sur le fait qu'effectivement ceci prend le même espace mémoire je suis d'accord avec toi
    mais pour la maintenance et la compréhension du code je préfère cent fois avoir des principes d'orthodoxie informatique.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Est-ce que les déclarations des routines gérant deux ou trois dimensions sont les mêmes ? Non.

    Est-ce que ça représente les mêmes données? Oui.

    Est-ce que ça peut être utile? [Je te laisse réponde...]

    Pour mon code simplifié, c'était en fait 3 boucles imbriquées (3 dimensions) + 2 dimensions temporelles.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par sgmsg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMatFeld = Array[0..15,0..7] of TFeld;
    est équivalente a celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestArray: array [0 .. 15, 0 .. 0, 0 .. 7] of TFeld;
    Pas du tout si on parle d'implémentation, oui si on parle d'allocation. Pourvu qu'il y ait 128 TFeld, on peut imaginer toutes les variantes.

    Citation Envoyé par anapurna Voir le message
    la notation [0..0] sert à déclarer des tableaux "ouvert".
    Un tableau dit "ouvert" est un tableau passé en paramètre d'une procédure. Si on déclare un tel type de [0..0] élément, c'est surtout pour leurrer le compilateur.

    Citation Envoyé par sgmsg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const MonTableauDeFruits:array[0..0]of string=('Pomme');//,'Orange','Banane',Poire'):
    var i:integer;
    begin
        for i:=0 to high(tableau) do begin
             ... //compote
        end;
    Ça a simplifié ton boulot, c'est bien mais ce n'est en tout cas pas du code optimisé
    C'est de plus sans rapport avec la question de jeng37.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par sgmsg Voir le message
    Est-ce que les déclarations des routines gérant deux ou trois dimensions sont les mêmes ? Non.
    S'il s'agit d'un tableau statique, on peut très bien passer un pointeur sur le premier élément et le nombre d'éléments.

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

Discussions similaires

  1. [Débutant] Question de dimension - subtilité
    Par agparchitecture dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/06/2014, 11h47
  2. Réponses: 11
    Dernier message: 29/10/2012, 14h00
  3. Question sur dimension site web
    Par LEK dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 12/01/2010, 14h51
  4. Réponses: 6
    Dernier message: 19/10/2009, 12h10
  5. [Tableaux] petite question.. array()
    Par weldoo dans le forum Langage
    Réponses: 14
    Dernier message: 23/10/2006, 23h10

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