Partager via


Tableaux multidimensionnels

Les attributs de tableau peuvent également être utilisés avec des tableaux multidimensionnels. Toutefois, veillez à vous assurer que chaque dimension du tableau a 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 expédiés pour chacun). La virgule entre parenthèses de l’attribut [size_is] spécifie que cette 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 pour le marshaling des paramètres : mode mixte (/Os) et entièrement interprété (/Oif ou /d’Office). 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 elle entraîne également une diminution des performances. En marshaling en mode mixte, les stubs marshalent certains paramètres en ligne. Bien que cela entraîne une taille de stub plus grande, elle offre également des performances accrues.

Prudence

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 /Ociéf est recommandé lorsque votre interface définit des paramètres qui sont des tableaux multidimensionnels.

 

L’attribut [chaîne] 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 auxquelles les pointeurs pointent peuvent être n’importe où en 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, voici une instruction valide :

long a1[] [20]

Comparez ceci à l’instruction non valide suivante :

long a1[20] []