2009-10-30 4 views
3

는 D2010을 사용하여 같은 이름의 동적 배열 유형을 가질 수 있습니다,이 같은 일을하고 싶습니다. 내 "aArr"매개 변수는 동적 배열이 아니기 때문에 열린 배열 매개 변수입니다. 그리고 SetLength를 호출 할 수 없습니다. 동적 배열이되도록 매개 변수를 강제 적용하는 유일한 방법은 다음과 같이 형식 이름을 지정하는 것입니다.내가 바르 매개 변수

type 
    TIntArray = array of integer; 

procedure SizeArray(var aArr: TIntArray; aSize: integer); 
begin 
    SetLength(aArr,aSize); 
end; 

이제 코드가 컴파일됩니다. 그리고 대부분의 경우 잘 작동하지만이 실패

procedure Test; 
var 
    a : array of integer; 
begin 
    SizeArray(a,5); 
end; 

은 실제와 공식 VAR 매개 변수의 유형이 동일해야하기 때문에 컴파일러는 "정수의 배열"와 동일로 "TIntArray"를 인식하지 못합니다 유형.

그래서, 여기 내 질문 : 호출자가 간단한 "정수 배열"대신 일부 선언 할 수 있도록 열린 배열 대신 동적 배열로 내 var 매개 변수를 식별하는 컴파일러를 얻을 수있는 몇 가지 방법이 있나요? 명명 된 유형?

미리 감사드립니다.

+0

왜 원하십니까/필요합니까? 이것은 표준 파스칼 사용법입니다. TIntArray로 "a"를 선언하면됩니다. 레거시 코드를 작업하는 경우 어쨌든 (SizeArray 호출을 추가) SizeArray가 예제 일뿐입니다. 그렇지 않으면 직접 SetLength를 호출하지 않는 이유> –

+0

호출자가 명명 된 형식을 사용하도록 강요합니다 ,하지만 그건 내 취향이 아니야.나는 그것을 필요로하지 않고 간단한 "X 배열"유형을 받아 들일 수있는 것을 원합니다. 그래서 제가 할 수 있는지 묻고 싶다고 생각했습니다. – TrespassersW

+1

호출자가 올바른 유형을 사용하는 것은 큰 문제가 아닙니다. 레코드 및 클래스 유형으로 항상 그렇게하므로 다른 구조화 된 유형은 없습니까? 코드가 컴파일되지 않기 때문에 프로그래머가 매우 빨리 발견 할 수있는 요구 사항입니다. 따라서 제품을 출시 할 준비가 될 때까지는 시시 때때로 폭탄을 터뜨리는 것과 다름이 없습니다. RTL이 제공하는 유형을 사용한다면, 반드시 자신의 선언을 작성하는 대신 RTL이 제공하는 유형을 사용해야합니다. –

답변

10

파스칼 및 확장 Delphi는 동적 배열을 포함하여 배열 유형에 대해 구조적 동등성보다는 이름 동등성을 사용합니다. ...

var 
    x: array of Integer; 

다른 유형의 이름이 일치하지 않는 익명의 이름을 사용하여 결국이 같은 이름이없는 유형으로 선언 된 변수. 그래서 당신은 오류가 발생합니다. 이 오류는 유용 할 수 있습니다. 예를 들어 Kilometers의 배열과 Kilograms의 배열을 생각해보십시오. 그러나 모든 고유 한 유형의 이름을 선언하는 것이 불편한 경우가 종종 있습니다.

이 문제를 해결하고 안전 형식 시스템에 머물러 있기 때문에 (형식화되지 않은 매개 변수를 사용하지 않도록 skamradt에서 제시 한 것처럼) 모든 특정 배열 모양에 동일한 이름을 사용하는 것이 좋습니다. 시스템 단위에 선언 된 TArray<T> 유형을 사용하여 비교적 큰 정도로이 작업을 수행 할 수 있습니다. 따라서 array of Integer으로 작업하는 대신 TArray<Integer>을 사용하십시오.

TArray<T>

는 다음과 같이 선언한다 :

type 
    TArray<T> = array of T; 

를 ... 그것은 임의의 동적 배열의 이름을 제공 할 수 있습니다.

+0

나는 System에서 선언을 알아 채지 못했습니다. 좋았어. 이 방법으로 배열을 선언하는 습관을 갖춰야한다고 생각합니다. 처음에는 시스템의 TArray가 Generics의 충돌과 충돌했다고 생각 했었습니다. 콜렉션 (Cllections)이긴하지만 일반적인 것이 아니기 때문에 생각하지 않습니다. 이것은 좋은 해결책입니다. 감사. – TrespassersW

0

아니요, 그렇게 할 방법이 없습니다. 이는 Pascal 언어 스펙의 일부이며 변경할 가능성이 없습니다.

편집 : Skamradt가 길을 찾았습니다. 다시 말해 볼게. 을 안전하게 수행 할 수있는 방법은 없습니다.

+4

아,하지만 레일이없는 프로그래밍은 약간의 아드레날린을 믹스에 추가합니다. ... 오, 잠깐만 요, 밤새도록 디버깅 중 마지막 라운드에서 발생한 충격적인 콜라였습니다. :) – skamradt

+0

나는 항상 레일없이 프로그램. 루비에 대한 열렬한 팬이 아니 었습니다. 솔직히 ... –

9

실제로 이것은 가능합니다 ... 형식이 지정되지 않은 var와 함께 absolute 키워드를 사용하십시오.

procedure SizeArray(var aArr; aSize: integer); 
var 
    ActArr : Array of Integer absolute aArr; 
begin 
    SetLength(ActArr,aSize); 
end; 

var 
    Test : Array of Integer; 
begin 
    SizeArray(Test,5); 
    showMessage(IntTostr(High(Test))); // -- returns 4 
end; 
+0

+1 극단적 인 영리함. 나는 이미 배리 켈리의 길을 시작 했으므로 나는 그의 대답을 받아 들일 것이다. 그러나, 길을 찾는 것 ... 나는 감동했다. :) – TrespassersW