Delen via


Multidimensionale matrices

Matrixkenmerken kunnen ook worden gebruikt met multidimensionale matrices. Zorg er echter voor dat elke dimensie van de matrix een bijbehorend kenmerk heeft. Bijvoorbeeld:

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

De voorgaande matrix is een conforme matrix (grootte d1size) van 30 elementmatrices (met d2len-elementen die voor elk worden verzonden). De komma in de haakjes van het kenmerk [size_is] geeft aan dat de waarde in d1size wordt toegepast op de eerste dimensie van de matrix. Op dezelfde manier geeft de opdracht tussen de haakjes van het kenmerk [length_is] aan dat de waarde in d2len wordt toegepast op de tweede dimensie van de matrix.

De MIDL 2.0-compiler biedt twee methoden voor marshaling-parameters: mixed-mode (/Os) en volledig geïnterpreteerd (/Oif of /Oicf). Standaard compileert de MIDL-compiler interfaces in de gemengde modus. U hoeft niet expliciet de /Os switch op te geven om marshaling in de gemengde modus te krijgen.

De volledig geïnterpreteerde methode marshals gegevens volledig offline. Dit vermindert de grootte van de stub-code aanzienlijk, maar leidt ook tot verminderde prestaties. In mixed-mode marshaling, de stubs marshals enkele parameters online. Hoewel dit resulteert in een grotere stubgrootte, biedt het ook betere prestaties.

Voorzichtigheid

Wees voorzichtig bij het compileren van IDL-bestanden in deze modus. Het gebruik van multidimensionale matrices in de gemengde modus kan leiden tot parameters die niet correct worden marshaled. De schakeloptie /Oicf opdrachtregel wordt aanbevolen wanneer uw interface parameters definieert die multidimensionale matrices zijn.

 

Het kenmerk [tekenreeks] kan ook worden gebruikt met multidimensionale matrices. Het kenmerk is van toepassing op de minst significante dimensie, zoals een conforme matrix met tekenreeksen. U kunt ook multidimensionale aanwijzerkenmerken gebruiken. Bijvoorbeeld:

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

In het voorgaande voorbeeld is de variabele ptr2d een aanwijzer naar een d1len-formaat blok met aanwijzers, die elk naar d2len-aanwijzers verwijst naar lange.

Multidimensionale matrices zijn niet gelijk aan matrices met aanwijzers. Een multidimensionale matrix is één groot blok gegevens in het geheugen. Een matrix met aanwijzers bevat alleen een blok met aanwijzers in de matrix. De gegevens waarnaar de aanwijzers verwijzen, kunnen zich overal in het geheugen bevinden. Bovendien staat de ANSI C-syntaxis toe dat alleen de meest significante (meest linkse) matrixdimensie niet is opgegeven in een multidimensionale matrix. Daarom is het volgende een geldige instructie:

long a1[] [20]

Vergelijk dit met de volgende ongeldige instructie:

long a1[20] []