2013-10-10 4 views
1

선택적 매개 변수로 동적 배열을 함수 또는 프로 시저에 전달할 수 있습니까? 그렇다면 어떻게?델파이 7의 선택적 매개 변수로 동적 배열

procedure testp (str : string; var arr : StringArray = nil); 
begin 
    str := 'Ciao Alessio !'; 
    SetLength(arr, 2); 
    arr[0] := 'Ale'; 
    arr[1] := 'Ale'; 
end; 

을하지만 제공합니다 :

나는이 방법으로 시도 default parameter 'arr' must be by-value or const.

저는 델파이 7을 사용하고 있습니다 만, 델파이 7에서는 가능하지 않다면 델파이 나 프리 파스칼의 최신 버전이 있습니까?

+0

이와 같이 var 매개 변수를 사용하는 것은 바람직하지 않습니다. 코드에서 매개 변수가 수정된다는 것은 명확하지 않습니다. 값을 반환하는 함수를 사용하는 것이 좋습니다. – alcalde

+0

왜 TStrings 매개 변수가없고 nil을 전달해야합니까? 문자열 배열 SUCK, 빠르고 친숙한 API를 원할 경우 매개 변수에 TStringList (기본 클래스 TStrings) 만 사용하면됩니다. 왜 단지 클래스를 사용할 수있을 때, 백만 개의 find-a-string-in-array 루틴을 작성합니까? –

+0

배열 (내가 openArrays 뜻) 때문에 당신은 단순히 배열 생성자를 사용할 수 있습니다 프로 시저 호출에서 매개 변수를 전달하지만, TStrings 당신은 var 선언, 델파이 모든 것을 파괴해야합니다. – Mic

답변

3

기본 매개 변수는 const 또는 value 매개 변수에 대해서만 지정할 수 있습니다. var 매개 변수에는 지정할 수 없습니다.

호출자가 원하는 유연성을 얻으려면 과부하를 사용해야합니다.

procedure foo(var arr: StringArray); overload; 
begin 
    .... do stuff 
end; 

procedure foo; overload; 
var 
    arr: StringArray; 
begin 
    foo(arr); 
end; 
+0

따라서 기본 매개 변수로 비어있는 동적 배열을 초기화 할 방법이 없습니다. 오버로딩 만이 유일한 방법일까요? – aleroot

+0

예. 그렇습니다. 'var' 매개 변수는 변수에 대한 참조를 전달합니다. 기본 매개 변수를 사용하면 참조 할 변수가 없습니다. –

1

오류 메시지는 정확히 무엇을 말하는지와 매개 변수가 동적 배열과 아무 관련이 없습니다. 컴파일러는 참조로 전달 된 매개 변수에 대한 기본값을 제공 할 수 없기 때문에 매개 변수의 유형에 관계없이 해당 코드를 거부했을 것입니다.

선택적 참조 매개 변수를 만들려면 오버로드를 사용하여 두 가지 버전의 함수를 제공하십시오. 컴파일러는 조언으로, 값 또는 const를하여 매개 변수를받을 현재 함수를 변경 한 다음 해당 매개 변수없이 다른 함수를 선언, 다음과 같이

입니다
procedure testp (str : string); 
var 
    arr: StringArray; 
begin 
    testp(str, arr); 
end; 

, 더미 매개 변수를 선언하고 그것을 전달하는 " 진짜 "기능. 그런 다음 반환하는 값을 버립니다.

참조 값을 계산할 때 비용이 많이 드는 경우 testp의 단일 매개 변수 버전을 구현하면 두 개의 인수 버전에서 더 많은 코드가 복제됩니다.