2012-10-18 7 views
6

Tôi đang cố sử dụng hàm sau để đặt độ dài của mảng động là tham số var. Chỉ có một lỗi khi tôi cố gắng để biên dịch mã:Tại sao tôi không thể sử dụng SetLength trong một hàm nhận tham số mảng?

[dcc64 Lỗi] lolcode.dpr (138): E2008 loại không tương thích

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

Vì trang web này bằng tiếng Anh nên mọi người trả lời câu hỏi của bạn dễ dàng hơn nếu bạn có thể đăng bản dịch tiếng Anh của thông báo lỗi - tôi cho rằng đó là "Mã thông báo không tương thích"? – RobV

+1

@RobV: "Các loại không tương thích", có thể bằng tiếng Đức hoặc tiếng Hà Lan. –

+0

Có, xin lỗi. Nhưng trong trường hợp này, bản dịch tiếng Anh không khác nhiều lắm. Loại không tương thích. –

Trả lời

7

Xác định một loại

type 
    TStringArray = array of string; 

và bạn có thể làm

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

Đừng quên 'var' cho tham số hoặc người gọi sẽ không thấy thay đổi. – hvd

+0

@hvd: Ồ, xin lỗi! –

+0

hoạt động, thx! Bạn đang tuyệt vời –

13

Bạn đang gặp phải một understa cơ bản và phổ biến các tham số mảng. Những gì bạn có ở đây:

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

không thực tế là dynamic array. Đây là một số open array parameter.

Bây giờ, bạn có thể truyền một mảng động làm tham số cho hàm nhận mảng mở. Nhưng bạn không thể sửa đổi độ dài của mảng động. Bạn chỉ có thể sửa đổi các phần tử của nó.

Nếu bạn cần sửa đổi độ dài của mảng động, quy trình phải nhận mảng động. Trong Delphi hiện đại cách thành ngữ để viết đó là:

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

Nếu bạn đang sử dụng một phiên bản cũ của Delphi mà không hỗ trợ mảng chung thì bạn cần phải khai báo một kiểu cho các tham số:

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

Bạn nên chọn có sử dụng các tham số mảng hoặc mảng động không? Theo tôi, bạn nên luôn sử dụng các mảng mở nếu có thể. Và nếu không thể, sau đó sử dụng mảng động như một khu nghỉ mát cuối cùng. Lý do là một hàm có tham số mảng mở là tổng quát hơn một với tham số mảng động. Ví dụ, bạn có thể vượt qua một mảng có kích thước không đổi như một tham số mảng mở, nhưng không phải nếu hàm nhận được một mảng động.

+0

cảm ơn bạn đã làm rõ. Điều này thực sự thú vị! –

+0

@MarcoAlka Trong khi Andreas cung cấp cho bạn một giải pháp, tôi đã cố gắng giải thích những gì đang xảy ra. Có một đọc của các liên kết tài liệu tôi bao gồm. Vì bạn đang sử dụng Delphi hiện đại, bạn có thể sử dụng các mảng chung và bạn nên làm như vậy. Chúng có đặc tính tương thích kiểu tốt nhất. Tôi thực sự muốn chắc chắn rằng bạn không kết luận rằng các mảng mở phải tránh. Tôi luôn luôn sử dụng chúng là có thể vì chúng là tham số mảng chung nhất trong ngôn ngữ. –

+1

+1 cho thành ngữ 'var argument: TArray ' –