2009-12-18 14 views

risposta

1

, consultare la Guida Delphi per "parametri non tipizzate"

È possibile passare in qualsiasi tipo, ma è necessario gettarlo nella realizzazione. Aiuto dice che non puoi passargli un numero o una costante numerica non tipizzata. Quindi, in pratica, devi sapere che tipo aspettarti, e il compilatore non può aiutarti, quindi hai bisogno di una buona ragione per farlo in questo modo. Suppongo che potrebbe essere utile se hai bisogno del metodo per gestire i tipi incompatibili, ma poi potresti scrivere diverse versioni sovraccaricate per ogni tipo previsto, io suggerirei che fosse una soluzione migliore.

+2

Il parametro 'Buffer' non è un puntatore. Tratta come un puntatore e le cose andranno in crash. È il * buffer effettivo * che si desidera modificare, non un puntatore a un buffer. L'indirizzo del parametro è l'indirizzo del buffer. –

+0

Sono stato corretto –

0

var in una lista di parametri è la sintassi Delphi per call by reference. Può essere digitato come ad es. il parametro AllowChange nel gestore OnChanging di un Listview:

procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean); 
begin 
    if SomeProblemOccurred then 
    AllowChange := False; 
end; 

o non tipizzata come nel tuo esempio.

18

Ho scritto un articolo su questo argomento molto a pochi anni fa:

What is an untyped parameter?

parametri non tipizzate sono utilizzati in alcune situazioni; il metodo TStream.Read che si chiede in merito alle corrispondenze più ravvicinate con la procedura Move di cui ho scritto. Ecco un estratto:

procedure Move(const Source; var Dest; Count: Integer); 

La Move procedura di copia dei dati da una variabile arbitraria in qualsiasi altra variabile. Deve accettare fonti e destinazioni di di tutti i tipi, il che significa che non può richiedere alcun tipo singolo. La procedura non modifica il valore della variabile passata per Source, in modo che la dichiarazione del parametro utilizzi const anziché var, che è il modificatore più comune per i parametri non tipizzati.

Nel caso della TStream.Read, la fonte è il contenuto del corso d'acqua, in modo da non passare che come parametro, ma la destinazione è il parametro Buffer indicato nella domanda. Puoi passare qualsiasi tipo di variabile che desideri per quel parametro, ma ciò significa che devi stare attento. È il tuo lavoro, non quello del compilatore, per garantire che il contenuto dello stream sia davvero un valore valido per il tipo di parametro che fornisci.

Leggi il resto del mio articolo per ulteriori situazioni in cui Delphi utilizza parametri non tipizzati.

+5

+1 @Rob, articolo molto bello. – RRUZ

0

Forse sorprendentemente, è legale passare un puntatore dereferenziato come parametro non tipizzato. E il puntatore stesso non ha nemmeno bisogno di avere un tipo.

procedure SomeMethod(var aParameter); 
    ∶ 

procedure CallSomeMethod(aIsInteger : Boolean); 
type 
    buffer : Pointer; 
    intValue : Integer; 
    realValue : Single; 
begin 
    if aIsInteger then 
    begin 
    buffer := @intValue; 
    end 
    else 
    begin 
    buffer := @realValue; 
    end; 
    SomeMethod(buffer^); 

Naturalmente Probabilmente sarebbe stato più facile se il parametro da SomeMethod() era stato un puntatore, ma questo potrebbe non essere sotto il vostro controllo.

Problemi correlati