Flerdimensionella matriser

Matrisattribut kan också användas med flerdimensionella matriser. Var dock noga med att se till att varje dimension i matrisen har ett motsvarande attribut. Till exempel:

/* 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] ) ;
}

Föregående matris är en överensstämmande matris (av storlek d1size ) med 30 elementmatriser (med d2len-element som levereras för varje). Kommatecknet i parenteserna för attributet [size_is] anger att värdet i d1size tillämpas på matrisens första dimension. På samma sätt anger kommandot i parenteserna för attributet [length_is] att värdet i d2len tillämpas på matrisens andra dimension.

MIDL 2.0-kompilatorn innehåller två metoder för att konvertera parametrar: mixed-mode (/Os) och fullständigt tolkad (/Oif eller /Oicf). Som standard kompilerar MIDL-kompilatorn gränssnitt i blandat läge. Du behöver inte uttryckligen ange växeln /Os för att hämta marskalkning i blandat läge.

Den fullständigt tolkade metoden konverterar data helt offline. Detta minskar stub-kodens storlek avsevärt, men det ger också sämre prestanda. I blandat läge marshaling, stubs marskalkar vissa parametrar online. Även om detta resulterar i en större stub-storlek, ger det också ökad prestanda.

Försiktighet

Var försiktig när du kompilerar IDL-filer i det här läget. Användning av flerdimensionella matriser i blandat läge kan resultera i parametrar som inte är korrekt konverterade. Kommandoradsväxeln /Oicf rekommenderas när gränssnittet definierar parametrar som är flerdimensionella matriser.

 

Attributet [string] kan också användas med flerdimensionella matriser. Attributet gäller för den minst betydande dimensionen, till exempel en konform matris med strängar. Du kan också använda flerdimensionella pekarattribut. Till exempel:

/* 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) ;
}

I föregående exempel är variabeln ptr2d en pekare till ett d1len-storleksblock med pekare, som var och en pekar på d2len-pekare till långa.

Flerdimensionella matriser motsvarar inte matriser med pekare. En flerdimensionell matris är ett enda, stort datablock i minnet. En matris med pekare innehåller bara ett block med pekare i matrisen. De data som pekarna pekar på kan finnas var som helst i minnet. Dessutom tillåter ANSI C-syntax att endast den mest betydande matrisdimensionen (längst till vänster) är ospecificerad i en flerdimensionell matris. Därför är följande en giltig instruktion:

long a1[] [20]

Jämför detta med följande ogiltiga instruktion:

long a1[20] []