Tableaux multidimensionnels

Les attributs de tableau peuvent également être utilisés avec des tableaux multidimensionnels. Toutefois, veillez à ce que chaque dimension du tableau ait un attribut correspondant. Par exemple :

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

Le tableau précédent est un tableau conforme (de taille d1size ) de 30 tableaux d’éléments (avec des éléments d2len fournis pour chacun d’eux). La virgule dans les parenthèses de l’attribut [size_is] spécifie que la valeur dans d1size est appliquée à la première dimension du tableau. De même, la commande entre parenthèses de l’attribut [length_is] indique que la valeur dans d2len est appliquée à la deuxième dimension du tableau.

Le compilateur MIDL 2.0 fournit deux méthodes de marshaling des paramètres : le mode mixte (/Os) et l’interprétation complète (/Oif ou /Oicf). Par défaut, le compilateur MIDL compile les interfaces en mode mixte. Vous n’avez pas besoin de spécifier explicitement le commutateur /Os pour obtenir le marshaling en mode mixte.

La méthode entièrement interprétée marshale les données complètement hors connexion. Cela réduit considérablement la taille du code stub, mais entraîne également une baisse des performances. Dans le marshaling en mode mixte, les stubs marshalent certains paramètres en ligne. Bien que cela se traduit par une plus grande taille de stub, cela offre également des performances accrues.

Attention

Soyez prudent lors de la compilation de fichiers IDL dans ce mode. L’utilisation de tableaux multidimensionnels en mode mixte peut entraîner des paramètres qui ne sont pas marshalés correctement. Le commutateur de ligne de commande /Oicf est recommandé lorsque votre interface définit des paramètres qui sont des tableaux multidimensionnels.

 

L’attribut [string] peut également être utilisé avec des tableaux multidimensionnels. L’attribut s’applique à la dimension la moins significative, telle qu’un tableau conforme de chaînes. Vous pouvez également utiliser des attributs de pointeur multidimensionnel. Par exemple :

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

Dans l’exemple précédent, la variable ptr2d est un pointeur vers un bloc de pointeurs de taille d1len, chacun pointant vers des pointeurs d2len vers long.

Les tableaux multidimensionnels ne sont pas équivalents aux tableaux de pointeurs. Un tableau multidimensionnel est un bloc de données unique et volumineux en mémoire. Un tableau de pointeurs contient uniquement un bloc de pointeurs dans le tableau. Les données vers laquelle pointent les pointeurs peuvent se trouver n’importe où dans la mémoire. En outre, la syntaxe ANSI C permet uniquement à la dimension de tableau la plus significative (la plus à gauche) d’être non spécifiée dans un tableau multidimensionnel. Par conséquent, l’instruction suivante est valide :

long a1[] [20]

Comparez ceci à l’instruction non valide suivante :

long a1[20] []