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 Pascal Discussion :

Obtenir les multiples dimensions d'un tableau


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut Obtenir les multiples dimensions d'un tableau
    Bonjour !

    En Basic (FreeBasic plus exactement, dans les autres dialectes je ne sais pas) il y a deux fonctions à peu près équivalentes aux fonctions Low() et High() du Pascal, avec cette différence qu'elles admettent un second paramètre facultatif et qu'elles permettent ainsi d'obtenir les dimensions d'un tableau à plusieurs... dimensions.

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ' FreeBasic
    dim a(2, 1 to 3, 1 to 4) as integer
     
    print LBound(a)   ' 0
    print UBound(a)   ' 2
    print LBound(a,2) ' 1
    print UBound(a,2) ' 3
    print LBound(a,3) ' 1
    print UBound(a,3) ' 4
    print LBound(a,4) ' 0
    print UBound(a,4) '-1

    Comment feriez-vous la même chose en Pascal ? Pour le moment, je n'ai trouvé que ça, qui ne paraît pas très convaincant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    program dimensions;
    var
      a: array[0..2, 1..3]of integer;
    begin
      WriteLn(Low(a));         // 0
      WriteLn(Low(a[Low(a)])); // 1
      ReadLn;
    end.
    Une remarque en passant, c'est que les fonctions FreeBasic renvoient le même résultat pour un tableau passé en paramètre :

    Code VB : 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
    ' FreeBasic
    declare sub PrintBounds(a() as integer)
     
    dim b(2, 1 to 3, 1 to 4) as integer
     
    PrintBounds(b())
     
    ' 0
    ' 2
    ' 1
    ' 3
    ' 1
    ' 4
    ' 0
    '-1
     
    sub PrintBounds(a() as integer)
      print LBound(a)
      print UBound(a)
      print LBound(a,2)
      print UBound(a,2)
      print LBound(a,3)
      print UBound(a,3)
      print LBound(a,4)
      print UBound(a,4)
    end sub

    Alors qu'en Pascal (comme je l'ai appris récemment, après avoir cherché longtemps dans mon code une erreur qui n'existait pas ), les fonctions High() et Low(), dans ce cas, renvoient systématiquement 0 pour le premier indice, quelles que soient les "vraies" dimensions du tableau.

    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
    program dimensions;
     
    procedure PrintBounds(a: array of integer);
    begin
      WriteLn(Low(a));
      WriteLn(High(a));
    end;
     
    var
      b: array[1..3]of integer;
     
    begin
      WriteLn(Low(b));
      WriteLn(High(b));
      PrintBounds(b);
      ReadLn;
    end.
     
    { 1
      3
      0
      2 }
    Une fois qu'on le sait, on s'arrange mais c'est un peu surprenant.

    Mais pour revenir à la question principale, comment obtenir les multiples dimensions d'un tableau ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    les réponses sont dans ta question, il n'y a pas mieux
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    les réponses sont dans ta question, il n'y a pas mieux
    D'accord, merci pour ta réponse. Alors je pensais faire une fonction sur cette base, mais je constate que ça ne marche pas : le tableau passé en paramètre de type array of ne peut avoir qu'une seule dimension, n'est-ce pas ?

    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
    program array_param;
     
    function F(a: array of integer): integer;
    begin
      F := 0;
    end;
     
    var
      b: array[0..1]of integer;
      c: array[0..1, 0..1]of integer;
     
    begin
      WriteLn(F(b));
      WriteLn(F(c)); // types incompatibles
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Donc, pour passer en paramètre un tableau à deux dimensions, il faut déclarer préalablement le type.

    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
    program dimensions2;
     
    {$IFDEF VPASCAL}
      {&PMTYPE VIO}
      {&USE32+}
    {$ELSE}
      {$APPTYPE CONSOLE}
      {$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
    {$ENDIF}
     
    type
      tArray = array of array of integer;
     
    procedure PrintBounds(a: tArray);
    begin
      WriteLn('Ce tableau a ', Length(a), ' lignes et ', Length(a[0]), ' colonnes.');
    end;
     
    var
      b: tArray;
     
    begin
      SetLength(b, 2, 3);
      PrintBounds(b);
      ReadLn;
    end.
    D'autre part j'ai appris que chaque ligne (pour dire les choses ainsi) pouvait avoir un nombre de colonnes différent.

    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
    program dimensions3;
     
    {$IFDEF VPASCAL}
      {&PMTYPE VIO}
      {&USE32+}
    {$ELSE}
      {$APPTYPE CONSOLE}
      {$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
    {$ENDIF}
     
    type
      tArray = array of array of integer;
     
    procedure PrintArray(a: tArray);
    var
      i, j: integer;
    begin
      for i := 0 to Length(a)-1 do
      begin
        for j := 0 to Length(a[i])-1 do
          Write(a[i, j]);
        WriteLn;
      end;
    end;
     
    var
      b: tArray;
      i: integer;
     
    begin
      SetLength(b, 9);
      for i := 0 to Length(b)-1 do
        SetLength(b[i], i * i + 1);
      PrintArray(b);
      ReadLn;
    end.
    Mais alors mes fonctions LBound et UBound n'ont plus beaucoup de sens, puisqu'il n'y a pas une valeur unique à renvoyer. Et si on utilise un tableau à dimensions constantes, on connaît ses bornes qui sont déclarées dans le type ou imposées par la procédure SetLength().
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    oui un tableau dynamique est un tableau de tableaux qui peuvent avoir des tailles différentes. en mémoire c'est un tableau de pointeurs vers les différents sous-tableaux alors que dans un tableau dimensionné c'est une seule zone mémoire contiguë.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    oui un tableau dynamique est un tableau de tableaux qui peuvent avoir des tailles différentes. en mémoire c'est un tableau de pointeurs vers les différents sous-tableaux alors que dans un tableau dimensionné c'est une seule zone mémoire contiguë.
    Merci pour la précision, je comprends mieux.

    Voici une représentation graphique d'un tableau à trois dimensions, dont la troisième est irrégulière. Le point intéressant (comme dans l'exemple précédent) est l'usage des fonctions Length() et SetLength().

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    { Compilation testée : FreePascal 2.6.2, Delphi 6
      Unité WinGraph : http://math.ubbcluj.ro/~sberinde/wingraph/
      Représentation d'un tableau à trois dimensions }
     
    program dimensions4;
     
    {$APPTYPE GUI}
    {$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
     
    uses
      WinCrt, WinGraph, WinMouse;
     
    procedure GraphMode;
    var
      gd, gm: smallInt;
    begin
      SetWindowSize(540, 540);
      gd := d8bit;
      gm := mCustom;
      InitGraph(gd, gm, 'FreePascal et WinGraph');
      SetBkColor(MidnightBlue);
      SetColor(Tangerine);
      ClearViewPort;
    end;
     
    procedure TextMode;
    begin
      while not(KeyPressed or CloseGraphRequest) do
        Delay(10);
      CloseGraph;
    end;
     
    type
      tArray = array of array of array of integer;
     
    procedure GraphArray(a: tArray);
    const
      top = true;
      c1 = 100;
      c2 =  40;
      c3 =  10;
    var
      i, j, k: integer;
      x1, y1, x2, y2: smallint;
      depth: word;
    begin
      SetFillStyle(EmptyFill, 0);
      for i := 0 to Length(a)-1 do
      begin
        x1 := c1 * (i+1);
        x2 := x1 + c2;
        for j := 0 to Length(a[i])-1 do
        begin
          y1 := c1 * (j+1);
          y2 := y1 + c2;
          for k := 0 to Length(a[i,j])-1 do
          begin
            depth := c3 * (k+1);
            Bar3D(x1, y1, x2, y2, depth, top);
          end;
        end;
      end;
    end;
     
    var
      b: tArray;
      i, j: integer;
     
    begin
      Randomize;
      GraphMode;
      OutTextXY(10, 10, 'Tableau à trois dimensions');
     
      SetLength(b, 4, 4);
     
      for i := 0 to Length(b)-1 do
        for j := 0 to Length(b[i])-1 do
          SetLength(b[i,j], Random(6)); // 3e dimension aléatoire de 0 à 5
     
      GraphArray(b);
      TextMode;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Obtenir tout les ordres possible d'un tableau
    Par HULK dans le forum Windows Forms
    Réponses: 9
    Dernier message: 19/06/2009, 14h36
  2. Obtenir les vraies dimensions d'un élément
    Par Cypselos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/09/2008, 22h43
  3. [débutants] obtenir les dimensions d'une matrice
    Par roro_la_patate dans le forum C++
    Réponses: 9
    Dernier message: 19/05/2008, 16h14
  4. [ImageMagick] Obtenir les dimensions d'une image externe?
    Par Death83 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/01/2006, 10h57
  5. Obtenir les coordonnées d'un tableau
    Par Etanne dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/12/2005, 10h14

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