2014-07-12 5 views
2

Comment imprimer un tableau générique sur la console? Cela fonctionne pour les tableaux entiers simples mais pas pour les tableaux génériques.Impression d'un tableau générique sur la console

class procedure Print(const A: TArray<Integer>; const Name: String); 
var 
    I: Integer; 
begin 
    Write('Array ' + Name +' : '); 
    Write('['); 
    for I := 0 to High(A) do 
    if I <> High(A) then 
    begin 
    WriteLn(A[I]); 
    Write(', '); 
    end 
    else 
    Write(A[I]); 
    Write(']'); 
    WriteLn(''); 
end; 
+0

Pourriez-vous clarifier la question? Votre code fonctionne très bien. C'est une fois que vous corrigez les erreurs de syntaxe –

+0

Je suppose qu'il ou elle veut faire cela pour tout type de T dans TArray , IOW, (s) il veut une procédure de classe Imprimer (const A: TArray ; const Nom: chaîne); Je suppose (s) qu'il ne sait pas comment faire la partie 'Write (A [I])' si 'A [I] 'est générique. –

+0

@RudyVelthuis Exactement! Cordes, etc. – user3764855

Répondre

6

Les procédures Write et Writeln ne peuvent pas être appelées avec des arguments génériques. Ainsi, la conclusion évidente est que vous devez convertir la valeur générique en une chaîne avant d'appeler Write et Writeln.

Ceci peut être réalisé en utilisant TValue en tirant parti des fonctionnalités suivantes:

  1. La méthode TValue.From<T> générique qui fait une nouvelle instance TValue.
  2. La méthode TValue.ToString qui convertit les types les plus courants en chaîne.

Donc, je pense que vous cherchez quelque chose comme ceci:

{$APPTYPE CONSOLE} 

uses 
    System.Rtti; 

type 
    TMyClass = class 
    class procedure Write<T>(const arr: array of T; const Name: string); static; 
    end; 

class procedure TMyClass.Write<T>(
    const arr: array of T; const Name: string); 
var 
    I: Integer; 
begin 
    System.Write('Array ' + Name +' : ['); 
    for I := 0 to high(arr) do begin 
    System.Write(TValue.From(arr[i]).ToString); 
    if I <> high(arr) then begin 
     System.Write(', '); 
    end; 
    end; 
    System.Writeln(']'); 
end; 

begin 
    TMyClass.Write<Integer>([1,2,3,4], 'integer'); 
    TMyClass.Write<Double>([42.666, 123.4], 'floating point'); 
    TMyClass.Write<string>(['foo', 'bar'], 'string'); 
    Readln; 
end. 

Sortie

 
Array integer : [1, 2, 3, 4] 
Array floating point : [42.666, 123.4] 
Array string : [foo, bar] 

En aparté, il me contrarie vraiment que je dois créer une classe pour contenir ces méthodes. Je ne comprends pas pourquoi les concepteurs de langage ont pris cette décision.

+0

Ah! Le bon vieux 'ToString'. – user3764855

+0

Heck, j'ai complètement oublié 'TValue.ToString'. –

+0

FWIW, 'TStringHelper' a une méthode' Join (Separator, Values) ', ce qui pourrait rendre la boucle un peu plus simple. Il vous faut cependant générer un 'array of string' en premier. –

Questions connexes