다차원 배열
배열 특성은 다차원 배열과 함께 사용할 수도 있습니다. 그러나 배열의 모든 차원에 해당하는 특성이 있는지 주의해야 합니다. 예:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d( [in] short d1size,
[in] short d2len,
[in, size_is( d1size, ), length_is ( , d2len) ] long array2d[*][30] ) ;
}
앞의 배열은 30개의 요소 배열(각각에 대해 d2len 요소가 제공됨)의 규칙적인 배열(d1size 크기)입니다. [size_is] 특성의 괄호 안에 있는 쉼표는 d1size의 값이 배열의 첫 번째 차원에 적용되도록 지정합니다. 마찬가지로 [length_is] 특성의 괄호 안에 있는 명령은 d2len의 값이 배열의 두 번째 차원에 적용됨을 나타냅니다.
MIDL 2.0 컴파일러는 매개 변수를 마샬링하는 두 가지 메서드인 혼합 모드(/Os)와 완전히 해석된(/Oif 또는 /Oicf)를 제공합니다. 기본적으로 MIDL 컴파일러는 혼합 모드로 인터페이스를 컴파일합니다. 혼합 모드 마샬링을 가져오기 위해 /Os 스위치를 명시적으로 지정할 필요가 없습니다.
완전히 해석된 메서드는 데이터를 완전히 오프라인으로 마샬링합니다. 이렇게 하면 스텁 코드의 크기가 상당히 줄어들지만 성능도 저하됩니다. 혼합 모드 마샬링에서 스텁은 온라인에서 일부 매개 변수를 마샬링합니다. 이로 인해 스텁 크기가 커지지만 성능도 향상됩니다.
주의
이 모드에서 IDL 파일을 컴파일할 때는 주의해야 합니다. 혼합 모드에서 다차원 배열을 사용하면 매개 변수가 올바르게 마샬링되지 않을 수 있습니다. 인터페이스가 다차원 배열인 매개 변수를 정의하는 경우 /Oicf 명령줄 스위치를 사용하는 것이 좋습니다.
[string] 특성은 다차원 배열과 함께 사용할 수도 있습니다. 특성은 규칙적인 문자열 배열과 같이 가장 중요한 차원에 적용됩니다. 다차원 포인터 특성을 사용할 수도 있습니다. 예:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d([in] short d1len,
[in] short d2len,
[in] size_is(d1len, d2len) ] long ** ptr2d) ;
}
앞의 예제에서 ptr2d 변수는 d1len 크기의 포인터 블록에 대한 포인터로, 각각 d2len 포인터를 long으로 가리킵니다.
다차원 배열은 포인터 배열과 동일하지 않습니다. 다차원 배열은 메모리에 있는 단일 큰 데이터 블록입니다. 포인터 배열에는 배열의 포인터 블록만 포함됩니다. 포인터가 가리키는 데이터는 메모리의 어느 곳에나 있을 수 있습니다. 또한 ANSI C 구문을 사용하면 가장 중요한(맨 왼쪽) 배열 차원만 다차원 배열에서 지정되지 않을 수 있습니다. 따라서 유효한 문은 다음과 같습니다.
long a1[] [20]
이를 다음과 같은 잘못된 문과 비교합니다.
long a1[20] []