2012-10-18 41 views
6

我想用下面的函數來設置一個var參數的動態數組的長度。 只有一個錯誤,當我試圖編譯的代碼:爲什麼我不能在接收數組參數的函數中使用SetLength?

[dcc64錯誤] lolcode.dpr(138):E2008不兼容的類型

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

由於本網站爲英文,因此如果您能夠發佈錯誤消息的英文翻譯,我認爲它會是「不兼容的令牌」,這將使大多數人更容易回答您的問題? – RobV

+1

@RobV:「不兼容的類型」,可能是德語或荷蘭語。 –

+0

是的,對不起。但在這種情況下,英文翻譯沒有那麼大的不同。不相容的類型。 –

回答

7

定義類型

type 
    TStringArray = array of string; 

和你可以做

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

不要忘記參數的'var',否則調用者將看不到更改。 – hvd

+0

@hvd:哦,對不起! –

+0

作品,thx!你真棒 –

13

您是從一個共同的和基本的錯誤易懂的痛苦尋找數組參數。你在這裏有什麼:

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

其實不是dynamic array。這是一個open array parameter

現在,您可以將動態數組作爲參數傳遞給接收開放數組的函數。但是你不能修改動態數組的長度。您只能修改其元素。

如果需要修改動態數組的長度,則該過程必須接收一個動態數組。在現代的Delphi編寫的慣用方法是:

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

如果您正在使用德爾福的舊版本不支持通用陣列,那麼你需要聲明的參數類型:

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

應該如何選擇是使用開放數組還是動態數組參數?在我看來,如果可能的話,你應該總是使用開放數組。如果不行的話,那麼使用動態數組作爲最後的手段。具有開放數組參數的函數的原因比具有動態數組參數的函數更普遍。例如,可以將一個常量大小的數組作爲開放數組參數傳遞,但如果該函數接收到動態數組,則不能傳遞。

+0

感謝您的澄清。這真的很有趣! –

+0

@MarcoAlka Andreas給了你一個解決方案,我試圖解釋發生了什麼。閱讀我包含的文檔鏈接。既然你使用的是現代Delphi,你可以使用通用數組,你應該。它們具有最佳的類型兼容性。我真的很想確保你不會得出結論:開放陣列是可以避免的。我總是使用它們是可能的,因爲它們是該語言中最通用的數組參數。 –

+1

'var參數+1:TArray '成語 –

相關問題