2017-12-21 7 views
2

Ich habe ein Problem mit Delphi.Wie kann ich Array von String übergeben einen Parameter in Delphi zu funktionieren

Ich schrieb eine Funktion wie folgt aus:

function MyFunction(arr: array of AnsiString): Boolean; 
begin 
    //code here 
end; 

Und jetzt, wenn ich ein Array von AnsiString direkt in Funktion, wie dies passieren, funktioniert alles perfekt:

MyFunction(['one', 'two', 'three']); 

Aber, wenn ich Versuchen Sie, dieses Array wie folgt zu speichern:

Es liegt ein Mismatch-Fehler vor.

Ich bin ein Anfänger mit Delphi, aber das ist wirklich verwirrend.

+0

Sie könnten in diesem Artikel einen Blick: http://rvelthuis.de/articles/articles-openarr.html – MartynA

+0

Warum benutzen Sie überhaupt AnsiString? –

+0

@DavidHeffernan ist das wichtig? Für Array von Zeichenfolge gibt es das gleiche Problem. –

Antwort

8

Ihr zweites Beispiel ist nicht funktional identisch mit dem ersten Beispiel.

Das erste Beispiel ist in Ordnung. Die Funktion nimmt einen open array als Eingabeparameter, und Sie erstellen ein festes Array von Zeichenfolgen direkt in diesem Parameter, was völlig in Ordnung ist. Jeder Array-Typ kann an einen offenen Array-Parameter übergeben werden. Im zweiten Beispiel deklarieren Sie eine dynamic array Zeichenfolge, aber Sie reservieren keinen Speicher für das Array, und Sie versuchen, sein erstes Element (das eine einzelne Zeichenfolge ist) zuzuweisen, um auf ein festes Array zu zeigen von Saiten. Und dann versuchen Sie, dieses Element (wieder eine einzelne Zeichenfolge) zu übergeben, wo ein Array erwartet wird. Aus diesem Grund kann der Code nicht kompiliert werden.

Der richtige Weg, um Ihre Prozedur schreiben möchte dies eher wie:

procedure MyProcedure; 
var 
    arr: array of AnsiString; 
begin 
    SetLength(arr, 3); 
    arr[0] := 'one'; 
    arr[1] := 'two'; 
    arr[2] := 'three'; 
    MyFunction(arr); 
end; 

Alternativ:

procedure MyProcedure; 
var 
    arr: array of AnsiString; 
begin 
    arr := ['one', 'two', 'three']; 
    MyFunction(arr); 
end; 

Alternativ:

type 
    TAnsiStringArray = array of AnsiString; 

procedure MyProcedure; 
var 
    arr: TAnsiStringArray; 
begin 
    arr := TAnsiStringArray.Create('one', 'two', 'three'); 
    MyFunction(arr); 
end; 
Verwandte Themen