多維度陣列
數位屬性也可以與多維度數位搭配使用。 不過,請小心確保陣列的每個維度都有對應的屬性。 例如:
/* 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個元素陣列的一致陣列(大小為 d1size),每個陣列都有 d2len 元素。 [size_is] 屬性括弧中的逗號指定 d1size 中的值會套用至陣列的第一個維度。 同樣地,[length_is] 屬性括弧中的命令表示 d2len 中的值會套用至陣列的第二個維度。
MIDL 2.0 編譯程式提供兩種方法來封送處理參數:混合模式(/Os)和完全解譯的 (/Oif 或/Oicf)。 根據預設,MIDL 編譯程式會以混合模式編譯介面。 您不需要明確指定 /Os參數來取得混合模式封送處理。
完全解譯的方法會完全脫機封送處理數據。 這可大幅減少存根程序代碼的大小,但也會導致效能降低。 在混合模式封送處理中,存根會在在線封送處理某些參數。 雖然這會產生較大的存根大小,但它也會提供更高的效能。
謹慎
在此模式中編譯 IDL 檔案時,請小心。 在混合模式中使用多維度陣列,可能會導致未正確封送處理的參數。 當您的介面定義多維度陣列的參數時,建議使用 /Oicf 命令行參數。
[字串] 屬性也可以與多維度陣列搭配使用。 屬性會套用至最不重要的維度,例如一致性字串數位。 您也可以使用多維度指標屬性。 例如:
/* 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 指標,長。
多維度陣列不等於指標陣列。 多維度陣列是記憶體中的單一大型數據區塊。 指標陣列只包含陣列中的指標區塊。 指標指向的數據可以是記憶體中的任何位置。 此外,ANSI C 語法只允許在多維度陣列中未指定最重要的 (最左邊) 陣列維度。 因此,以下是有效的 語句:
long a1[] [20]
將此與下列無效的 語句進行比較:
long a1[20] []