2010-01-26 5 views
2

AFAIK 형식이 명명되지 않은 경우 컴파일러에서 RTTI를 생성하지 않습니다. 예 : Integer의 T = array [0..1,0.1.1]; 이 경우 배열의 전체 크기를 알 수 있지만 각 차원의 크기를 알 수는 없습니다.unamed 데이터 형식에 대한 RTTI 없음

명시 적으로 명명 된 유형을 사용하는 경우에만 작동합니다 : T01 = 0..1; T = 정수 배열 [T01, T01];

내가 놓친 것이 있습니까?

테스트 코드 :

type 
    t = array[0..1, 0..1] of Integer; 

procedure test; 
var 
    i: PTypeInfo; 
    d: TArrayTypeData; 
begin 
    i := TypeInfo(t); 
    assert(i.Kind = tkArray); 
    d := GetTypeData(i).ArrayData; 
end; 

답변

1

당신은 여전히 ​​내장 매크로에게 HighLow를 사용하여 배열의 차원을 얻을 수 있습니다. 의는 예를 형에게 array[0..1,3..4] of Integer을 보자 : 뒤의 두에서

Low(T) // low bound of first range (0) 
High(T) // high bound of first range (1) 
Low(T[Low(T)]) // low bound of second range (3) 
High(T[Low(T)]) // high bound of second range (4) 

, 당신은 인덱스 값에 유효한 인덱스를 사용할 수 있습니다.

+0

Delphi 2010의 새로운 RTTI에 대해 ... 내 질문을 이해 했습니까? –

+0

@Henri : 내가 한 일은, 당신이이 작업을 위해 RTTI를 필요로하지 않는다는 것을 의미합니다. RTTI 인터페이스를 고집한다면 (왜?), 나는 생각을하지 못합니다. –

+0

내가 superobject의 저자이기 때문에 json 파서가 http://www.progdigy.com/?page_id=6 RTT를 사용하여 기본 유형을 json으로 자동 직렬화합니다. –

1

예 현재 생성 된 RTTI 정보가 제한되어 있으므로 유형 이름이 있어야합니다.

var 
StrArray : Array of String; 

을하지만 다음은 작동합니다 :이 같은

상황이 작동하지 않습니다

type 
    TStrArray = Array of String; 
var 
    StrArray : TStrArray; 

내가 일반적으로 전환 한 내입니다 TArrayNoInit이 새로운 구문을 사용하는 내 동적 배열을 전환 system.pas 유닛에 정의되어 있습니다. 이름이 있는지 확인하십시오.

TArray<T> = array of T;

그래서 특정 문제에 대한 해결 방법은 해당 배열의 유형 이름을 선언하는 것입니다.

type 
    TMyArray = array[0..1, 0..1] of Integer; 
var 
    t : TMyArray; 
관련 문제