Freigeben über


Mehrdimensionale Arrays

Arrayattribute können auch mit mehrdimensionalen Arrays verwendet werden. Achten Sie jedoch darauf, dass jede Dimension des Arrays über ein entsprechendes Attribut verfügt. Beispiel:

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

Das vorangehende Array ist ein konformes Array (der Größe d1size ) von 30 Elementarrays (mit jeweils d2len-Elementen). Das Komma in den Klammern des [size_is]-Attributs gibt an, dass der Wert in d1size auf die erste Dimension des Arrays angewendet wird. Ebenso gibt der Befehl in den Klammern des [length_is]-Attributs an, dass der Wert in d2len auf die zweite Dimension des Arrays angewendet wird.

Der MIDL 2.0-Compiler stellt zwei Methoden zum Marshallen von Parametern bereit: gemischter Modus (/Os) und vollständig interpretiert (/Oif oder /Oicf). Standardmäßig kompiliert der MIDL-Compiler Schnittstellen im gemischten Modus. Sie müssen den Schalter /Os nicht explizit angeben, um das Marshalling im gemischten Modus zu erhalten.

Die vollständig interpretierte Methode marshallt Daten vollständig offline. Dies reduziert die Größe des Stubcodes erheblich, führt aber auch zu einer Leistungsminderung. Beim Marshallen im gemischten Modus marshallen die Stubs einige Parameter online. Dies führt zwar zu einer größeren Stubgröße, bietet aber auch eine höhere Leistung.

Achtung

Seien Sie beim Kompilieren von IDL-Dateien in diesem Modus vorsichtig. Die Verwendung mehrdimensionaler Arrays im gemischten Modus kann zu Parametern führen, die nicht ordnungsgemäß gemarshallt werden. Der Befehlszeilenschalter /Oicf wird empfohlen, wenn Ihre Schnittstelle Parameter definiert, die mehrdimensionale Arrays sind.

 

Das Attribut [string] kann auch mit mehrdimensionalen Arrays verwendet werden. Das Attribut gilt für die am wenigsten signifikante Dimension, z. B. ein konformes Array von Zeichenfolgen. Sie können auch mehrdimensionale Zeigerattribute verwenden. Beispiel:

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

Im vorherigen Beispiel ist die Variable ptr2d ein Zeiger auf einen d1len-Block von Zeigern, die jeweils auf d2len-Zeiger auf long zeigen.

Mehrdimensionale Arrays entsprechen nicht Arrays von Zeigern. Ein mehrdimensionales Array ist ein einzelner, großer Datenblock im Arbeitsspeicher. Ein Array von Zeigern enthält nur einen Block von Zeigern im Array. Die Daten, auf die die Zeiger zeigen, können sich an einer beliebigen Stelle im Arbeitsspeicher befinden. Außerdem lässt die ANSI C-Syntax zu, dass nur die bedeutendste Arraydimension (ganz links) in einem mehrdimensionalen Array nicht angegeben wird. Daher ist folgendes eine gültige Anweisung:

long a1[] [20]

Vergleichen Sie dies mit der folgenden ungültigen Anweisung:

long a1[20] []