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 ?