Multidimenzionální pole
Atributy pole lze také použít s multidimenzionálními poli. Dávejte však pozor, abyste zajistili, že každá dimenze pole má odpovídající atribut. Například:
/* 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] ) ;
}
Předchozí pole je odpovídající matice (velikost d1size) 30 polí prvků (s prvky d2len expedovanými pro každý). Čárka v závorkách atributu [size_is] určuje, že hodnota v d1size se použije na první dimenzi pole. Podobně příkaz v závorkách atributu [length_is] označuje, že hodnota v d2lenu se použije na druhou dimenzi pole.
Kompilátor MIDL 2.0 poskytuje dvě metody pro zařazování parametrů: smíšený režim (/Os) a plně interpretovaný (/Oif nebo /Oicf). Kompilátor MIDL ve výchozím nastavení zkompiluje rozhraní ve smíšeném režimu. Není nutné explicitně zadávat /Os přepínač pro zařazování ve smíšeném režimu.
Plně interpretovaná metoda zařazuje data zcela offline. Tím se výrazně zmenší velikost kódu zástupných procedur, ale výsledkem je také snížení výkonu. V zařazování v smíšeném režimu zástupné procedury zařadí některé parametry online. Výsledkem je větší velikost zástupných procedur, ale nabízí také vyšší výkon.
Opatrnost
Při kompilaci souborů IDL v tomto režimu buďte opatrní. Použití multidimenzionálních polí ve smíšeném režimu může vést k tomu, že parametry, které nejsou správně zařazovány. Přepínač příkazového řádku /Oicf se doporučuje, když vaše rozhraní definuje parametry, které jsou multidimenzionální pole.
Atribut [řetězec] lze použít také s multidimenzionálními poli. Atribut se vztahuje na nejméně významnou dimenzi, například odpovídající pole řetězců. Můžete také použít atributy multidimenzionálního ukazatele. Například:
/* 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) ;
}
V předchozím příkladu je proměnná ptr2d ukazatel na blok ukazatelů s velikostí d1len, z nichž každý odkazuje na d2len ukazatele na dlouhé.
Multidimenzionální pole nejsou ekvivalentní polím ukazatelů. Multidimenzionální pole je jeden velký blok dat v paměti. Pole ukazatelů obsahuje pouze blok ukazatelů v poli. Data, na která ukazatele odkazují, můžou být kdekoli v paměti. Syntaxe ANSI C také umožňuje zadat v multidimenzionálním poli pouze nejvýznamnější (úplně vlevo) dimenzi pole. Proto platí následující příkaz:
long a1[] [20]
Porovnejte tento příkaz s následujícím neplatným příkazem:
long a1[20] []