[Delphi] tableaux dynamiques & paramètres

tableaux dynamiques & paramètres [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 23-07-2004 à 10:17:26    

Salut,
 
J'ai un type, que nous appelerons TMonBeauTableau, qui est un tableau dynamique de string :  
 

Code :
  1. type TMonBeauTableau = array of string;


 
J'ai une procédure, que nous appelerons MaBelleFonction, qui prend un paramètre de type TMonBeauTableau, de type nul par défaut :  
 

Code :
  1. procedure MaBelleFonction(Parameters : TMonBeauTableau= nil);


 
Ma question : comment appeler cette procédure en initialisant le paramètre tableau directement au moment de l'appel (comme cela est possible avec un tableau à taille fixe ?
 
En gros, là je suis obligé de faire :  
 

Code :
  1. var MonBeauParametre : TMonBeauTableau
  2. [...]
  3. SetLength(MonBeauParametre, 2);
  4. MonBeauParametre[0] := 'pipo';
  5. MonBeauParametre[1] := 'bimbo';
  6. MaBelleProcedure(MonBeauParametre);


 
Or, je voudrais faire quelque chose comme :
 

Code :
  1. MaBelleProcedure(('pipo', 'bimbo'));


 
Mais ..... comme je suis un gros boulet je n'y arrive pas :(
 
Merci pour votre aide =)
 

Reply

Marsh Posté le 23-07-2004 à 10:17:26   

Reply

Marsh Posté le 23-07-2004 à 11:51:57    

Et si tu mets "array of string" plutôt qu'un type prédéfini ?
S'il n'accepte pas le nil, ce qui est bien possible, tu peux mettre [] (tableau vide) à la place normalement

Reply

Marsh Posté le 23-07-2004 à 12:05:53    

antp a écrit :

Et si tu mets "array of string" plutôt qu'un type prédéfini ?
S'il n'accepte pas le nil, ce qui est bien possible, tu peux mettre [] (tableau vide) à la place normalement


 
Salut, merci pour ta réponse.
 
En fait, j'ai deux possibilités :  
 
1) Utiliser un type maison, TMonBeauTableau. Dans ce cas :
- Je peux affecter une valeur par défaut à un paramètre de ce type (mais en utilisant nil, et non [])
- Je ne peux pas construire 'dynamiquement' un paramètre de ce type lors de l'appel à une fonction
 
2) Utiliser un type de base non redéfini (array of string). Dans ce cas !
- Je ne peux plus affecter de valeur par défaut à un paramètre de ce type, que ce soit via nil ou []
- Je peux construire dynamiquement un paramètre de ce type quand j'appelle ma procédure
 
Bref - pas moyen d'avoir le beurre et l'argent du beurre ? :)

Reply

Marsh Posté le 23-07-2004 à 12:07:24    

En y repensant, j'ai dû avoir ce problème aussi.
Deux solutions :
- passer "manuellement" un tableau vide [] plutôt que de pouvoir appeler la fonction sans paramètre
- faire une seconde fonction (overload) qui a le même nom mais pas de paramètre, et qui appelle la première en passant nil ou [] si veux avoir un seul endroit où cette valeur vide est définie.


Message édité par antp le 23-07-2004 à 12:07:45
Reply

Marsh Posté le 23-07-2004 à 12:11:43    

antp a écrit :

En y repensant, j'ai dû avoir ce problème aussi.
Deux solutions :
- passer "manuellement" un tableau vide [] plutôt que de pouvoir appeler la fonction sans paramètre
- faire une seconde fonction (overload) qui a le même nom mais pas de paramètre, et qui appelle la première en passant nil ou [] si veux avoir un seul endroit où cette valeur vide est définie.


 
Oui tout à fait, actuellement je me suis rabattu sur cette seconde solution. Mais je ne comprends pas qu'en faisant :  
 

Code :
  1. type TMonBeauType = array of string


 
On n'ait ces différences bizarres de comportement suivant qu'une variable ou un paramètre est déclaré(e) en tant que TMonBeauType ou en tant qu'array of string...  
 
Bref tant pis, et merci de t'être penché sur mon problème en tout cas !  

Reply

Marsh Posté le 23-07-2004 à 12:15:39    

Delphi est assez strict avec les types.
 
Il me semble qu'il y a un truc de ce genre :
 
var
  a: array of string;
  b: array of string;
 
a et b ne sont pas du même type
 
var
  a, b: array of string;
 
a et b sont du même type
 
:D


Message édité par antp le 23-07-2004 à 12:16:08
Reply

Marsh Posté le 23-07-2004 à 12:20:26    

antp a écrit :

Delphi est assez strict avec les types.
 
Il me semble qu'il y a un truc de ce genre :
 
var
  a: array of string;
  b: array of string;
 
a et b ne sont pas du même type
 
var
  a, b: array of string;
 
a et b sont du même type
 
:D


 
Hmm tu es sûr ?
 
J'aurais plutôt dit :  
 

Code :
  1. type
  2.   TPipo = array of string;
  3. var
  4.   a: array of string;
  5.   b: TPipo;
  6. a et b ne sont pas du même type
  7. var
  8.   a: array of string;
  9.   b: array of string;
  10. a et b sont du même type


 
Non ?
 
Enfin bref, le Pascal Objet est du genre super typé - on est bien d'accord :)


Message édité par fred_malette le 23-07-2004 à 12:20:56
Reply

Marsh Posté le 23-07-2004 à 12:27:18    


var
  a, b: array of string;
  c: array of string;
begin
  a := b;
  a := c;
end;
 


 
"a := b" ça passe, "a := c" donne "[Error] Unit1.pas(32): Incompatible types" ;)

Reply

Marsh Posté le 23-07-2004 à 12:32:35    

antp a écrit :


var
  a, b: array of string;
  c: array of string;
begin
  a := b;
  a := c;
end;
 


 
"a := b" ça passe, "a := c" donne "[Error] Unit1.pas(32): Incompatible types" ;)


 
Ha oui au temps pour moi : tu as parfaitement raison - d'ailleurs j'imagine que c'est pour ça qu'il est toujours conseillé de définir ses propres types personnalisés, non ?
 
(bon sauf que dans mon cas, je suis justement obligé d'utiliser un type de base ... :( )
 
Mais merci pour cette précision :)

Reply

Marsh Posté le 23-07-2004 à 12:35:04    

fred_malette a écrit :

d'ailleurs j'imagine que c'est pour ça qu'il est toujours conseillé de définir ses propres types personnalisés, non ?


 
C'est vrai que ça permet de rendre le code plus clair et parfois d'éviter des erreurs.
 
Il vaut par exemple mieux utiliser des énumérations que des entiers pour des paramètres, pour éviter les erreurs (d'ailleurs Delphi est bien à ce niveau : on ne risque pas d'accidentellement mettre une valeur d'une enum à la place d'une valeur d'une autre enum comme on le ferait en C).
 
Ça permet aussi de changer facilement un type, genre si on utilise TYear au lieu de Byte, quand on se rend compte que les années peuvent s'écrire sur 4 chiffres on change le type de TYear plutôt que de devoir aller le changer partout dans le code (exemple bidon car ce n'est pas toujours si simple, mais tu vois où je veux en venir).
 
Mais d'un autre côté avoir des dizaines de types à soi c'est un truc pour s'embrouiller :D


Message édité par antp le 23-07-2004 à 12:36:58
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed