2012-10-18 18 views
6

Próbuję użyć następującej funkcji, aby ustawić długość tablicy dynamicznej, która jest var param. Jest tylko błąd, gdy próbuję skompilować kod:Dlaczego nie można użyć funkcji SetLength w funkcji, która otrzymuje parametr tablicy?

[dcc64 Error] lolcode.dpr (138): E2008 niezgodne typy

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

Ponieważ ta strona jest w języku angielskim, łatwiej byłoby większości ludzi odpowiedzieć na twoje pytanie, gdybyś mógł zamieścić angielskie tłumaczenie swojego komunikatu o błędzie - zakładam, że byłby to "Niezgodny token"? – RobV

+1

@RobV: "Niezgodne typy", prawdopodobnie w języku niemieckim lub holenderskim. –

+0

Tak, przepraszam. Ale w tym przypadku angielskie tłumaczenie nie różni się zbytnio. Niezgodne typy. –

Odpowiedz

7

określić typ

type 
    TStringArray = array of string; 

i możesz zrobić

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

Nie zapomnij o 'var' dla parametru, lub dzwoniący nie zobaczy zmian. – hvd

+0

@hvd: Oh, przepraszam! –

+0

działa, thx! Jesteś niesamowity –

13

Cierpisz na wspólną i podstawową mis-understa nding parametrów tablicy. Co tu masz:

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

nie jest w rzeczywistości numerem dynamic array. Jest to open array parameter.

Teraz można przekazać dynamiczną tablicę jako parametr do funkcji, która otrzymuje otwartą tablicę. Ale nie można modyfikować długości tablicy dynamicznej. Możesz modyfikować tylko jego elementy.

Jeśli konieczne jest zmodyfikowanie długości tablicy dynamicznej, procedura musi otrzymać tablicę dynamiczną. We współczesnej Delphi idiomatyczne sposób napisać, że jest:

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

Jeśli używasz starszej wersji Delphi, który nie obsługuje macierze generyczne to trzeba zadeklarować typ parametru:

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

Jak wybrać, czy używać parametrów tablicy otwartej lub dynamicznej? Moim zdaniem zawsze powinieneś używać otwartych tablic, jeśli to możliwe. A jeśli nie jest to możliwe, użyj dynamicznych tablic jako ostatecznego ośrodka. Powód będący funkcją z otwartym parametrem tablicy jest bardziej ogólny niż z parametrem dynamicznej tablicy. Na przykład można przekazać tablicę o stałej wielkości jako parametr otwartej tablicy, ale nie, jeśli funkcja otrzymuje tablicę dynamiczną.

+0

dziękuję za wyjaśnienia. To naprawdę interesujące! –

+0

@MarcoAlka Podczas gdy Andreas dał ci rozwiązanie, próbowałem wyjaśnić, co się dzieje. Zapoznaj się z załączonymi linkami do dokumentacji. Ponieważ używasz nowoczesnego Delphi możesz używać ogólnych tablic i powinieneś. Mają najlepsze właściwości kompatybilności typów. Naprawdę chciałem się upewnić, że nie wyciągniesz wniosku, że należy unikać otwartych tablic. Zawsze ich używam jest możliwe, ponieważ są najbardziej ogólnym parametrem tablicy w języku. –

+1

+1 dla argumentu 'var argument: TArray ' –

Powiązane problemy