2012-10-18 4 views
6

Ich versuche, die folgende Funktion zu verwenden, um die Länge eines dynamischen Arrays, das ein Var-Parameter ist, festzulegen. Es gibt nur ein Fehler, wenn ich versuche, den Code zu kompilieren:Warum kann ich SetLength nicht in einer Funktion verwenden, die einen Array-Parameter empfängt?

[dcc64 Error] lolcode.dpr (138): Inkompatible E2008 Typen

function execute(var command : array of string) : Boolean; 
begin 
    // Do something 
    SetLength(command,0); 
end; 
+0

Da diese Seite auf Englisch ist, würde es für die meisten Leute einfacher sein, Ihre Frage zu beantworten, wenn Sie die englische Übersetzung Ihrer Fehlermeldung posten könnten - ich nehme an, es wäre "Incompatible Token"? – RobV

+1

@RobV: "Inkompatible Typen", vielleicht auf Deutsch oder Niederländisch. –

+0

Ja, tut mir leid. Aber in diesem Fall ist die englische Übersetzung nicht viel anders. Inkompatible Typen. –

Antwort

7

einen Typ definieren

type 
    TStringArray = array of string; 

und Sie können tun

function Execute(var StringArray: TStringArray): boolean; 
begin 
    // Do something 
    SetLength(StringArray, 0); 
end; 
+0

Vergessen Sie nicht die 'var' für den Parameter oder der Aufrufer sieht die Änderungen nicht. – hvd

+0

@hvd: Oh, Entschuldigung! –

+0

funktioniert, thx! Du bist großartig –

13

Sie leiden unter einem gemeinsamen und grundlegenden mis-Untergebenen nding von Array-Parametern. Was haben Sie hier:

function execute(var command: array of string): Boolean; 

nicht in der Tat ein dynamic array. Es ist ein open array parameter.

Jetzt können Sie ein dynamisches Array als Parameter an eine Funktion übergeben, die ein offenes Array empfängt. Sie können die Länge des dynamischen Arrays jedoch nicht ändern. Sie können nur seine Elemente ändern.

Wenn Sie die Länge des dynamischen Arrays ändern müssen, muss die Prozedur ein dynamisches Array erhalten. In der modernen Delphi der idiomatische Weg, das zu schreiben ist:

function execute(var command: TArray<string>): Boolean; 

Wenn Sie eine ältere Version von Delphi verwenden, die nicht generischer Arrays, dann müssen Sie einen Typen für die Parameter deklarieren unterstützt:

type 
    TStringArray = array of string; 
.... 
function execute(var command: TStringArray): Boolean; 

Wie sollten Sie entscheiden, ob Sie Open-Array- oder dynamische Array-Parameter verwenden möchten? Meiner Meinung nach sollten Sie immer offene Arrays verwenden, wenn dies möglich ist. Und wenn das nicht möglich ist, verwenden Sie dynamische Arrays als letzten Ausweg. Der Grund dafür ist eine Funktion mit einem offenen Array-Parameter, die allgemeiner ist als eine mit einem dynamischen Array-Parameter. Beispielsweise können Sie ein Array mit konstanter Größe als offenen Array-Parameter übergeben, jedoch nicht, wenn die Funktion ein dynamisches Array empfängt.

+0

danke für Ihre Klarstellung. Das ist wirklich interessant! –

+0

@MarcoAlka Während Andreas Ihnen eine Lösung gab, habe ich versucht zu erklären, was vor sich geht. Lesen Sie die Dokumentationslinks, die ich eingefügt habe. Da Sie moderne Delphi verwenden, können Sie generische Arrays verwenden und Sie sollten. Sie haben die besten Typkompatibilitätseigenschaften. Ich wollte wirklich sicherstellen, dass Sie nicht zu dem Schluss kommen, dass offene Arrays vermieden werden sollten. Ich benutze sie immer, weil sie die allgemeinsten Array-Parameter in der Sprache sind. –

+1

+1 für das 'var-Argument: TArray ' idiom –

Verwandte Themen