Matrices MIDL

Les déclarateurs de tableau apparaissent dans le corps de l’interface du fichier IDL comme l’un des éléments suivants :

  • Partie d’une déclaration générale
  • Membre d’une structure ou d’un déclarateur d’union
  • Paramètre d’un appel de procédure distante

Les limites de chaque dimension du tableau sont exprimées à l’intérieur d’une paire distincte de crochets. Une expression qui prend la valeur n signifie une limite inférieure de zéro et une limite supérieure de n - 1. Si les crochets sont vides ou contiennent un astérisque unique (*), la limite inférieure est égale à zéro et la limite supérieure est déterminée au moment de l’exécution.

Le tableau peut également contenir deux valeurs séparées par des points de suspension qui représentent les limites inférieures et supérieures du tableau, comme dans [inférieur... upper]. Microsoft RPC nécessite une limite inférieure de zéro. Le compilateur MIDL ne reconnaît pas les constructions qui spécifient des limites inférieures différente de zéro.

Les tableaux peuvent être associés aux attributs de champ size_is, max_is, length_is, first_is et last_is pour spécifier la taille du tableau ou la partie du tableau qui contient des données valides. Ces attributs de champ identifient le paramètre, le champ de structure ou la constante qui spécifie la dimension ou l’index du tableau.

Le tableau doit être associé à l’identificateur spécifié par l’attribut de champ de la manière suivante : lorsque le tableau est un paramètre, l’identificateur doit également être un paramètre de la même fonction ; lorsque le tableau est un champ de structure, l’identificateur doit être un autre champ de structure de cette même structure.

Un tableau est appelé « conformant » si la limite supérieure d’une dimension est déterminée au moment de l’exécution. (Seules les limites supérieures peuvent être déterminées au moment de l’exécution.) Pour déterminer la limite supérieure, la déclaration de tableau doit inclure un attribut size_is ou max_is .

Un tableau est appelé « variable » lorsque ses limites sont déterminées au moment de la compilation, mais la plage d’éléments transmis est déterminée au moment de l’exécution. Pour déterminer la plage d’éléments transmis, la déclaration de tableau doit inclure un attribut length_is, first_is ou last_is .

Un tableau variable conforme (également appelé « ouvert ») est un tableau dont la limite supérieure et la plage d’éléments transmis sont déterminées au moment de l’exécution. Au maximum, un tableau variable conforme ou conforme peut être imbriqué dans une structure C et doit être le dernier élément de la structure. En revanche, des tableaux différents nonconformants peuvent se produire n’importe où dans une structure.

Exemples

/* IDL file interface body */ 
#define MAX_INDEX 10 
 
typedef char  ATYPE[MAX_INDEX]; 
typedef short BTYPE[];        // Equivalent to [*]; 
typedef long  CTYPE[*][10];   // [][10] 
typedef float DTYPE[0..10];   // Equivalent to [11] 
typedef float ETYPE[0..(MAX_INDEX)];  
 
typedef struct 
{ 
    unsigned short size; 
    unsigned short length; 
    [size_is(size), length_is(length)] char string[*]; 
} counted_string; 
 
HRESULT MyFunction( 
     [in, out] short * pSize,  
     [in, out, string, size_is(*pSize)] char a[0..*] 
);

Pour plus d’informations, consultez Tableaux et pointeurs.

Tableaux multidimensionnels

L’utilisateur peut déclarer des types qui sont des tableaux, puis déclarer des tableaux d’objets de ces types. La sémantique des tableaux mdimensionnelsde types de tableaux ndimensionnels est identique à la sémantique des tableaux mndimensionnels+.

Par exemple, le type RECT_TYPE peut être défini en tant que tableau à deux dimensions et la variable rect peut être définie en tant que tableau de RECT_TYPE. Cela équivaut au tableau tridimensionnel equivalent_rect :

typedef short int RECT_TYPE[10][20]; 
RECT_TYPE rect[15]; 
short int equivalent_rect[15][10][20];  // ~RECT_TYPE rect[15]

Microsoft RPC est orienté C. Après les conventions de langage C, seule la première dimension d’un tableau multidimensionnel peut être déterminée au moment de l’exécution. L’interopérabilité avec des tableaux IDL DCE qui prennent en charge d’autres langages est limitée à :

  • Tableaux multidimensionnels avec des limites constantes (déterminées au moment de la compilation).
  • Tableaux multidimensionnels avec toutes les limites constantes à l’exception de la première dimension. La limite supérieure et la plage d’éléments transmis de la première dimension dépendent du runtime.
  • Tous les tableaux unidimensionnels avec une limite inférieure de zéro.

Lorsque l’attribut [string] est utilisé sur les tableaux multidimensionnels, l’attribut s’applique au tableau le plus à droite.

Tableaux de pointeurs

Les pointeurs de référence doivent pointer vers des données valides. L’application cliente doit allouer toute la mémoire pour un tableau [in] ou [in,out] de pointeurs de référence, en particulier lorsque le tableau est associé à [in], [in,out], [length_is] ou [last_is] valeurs. L’application cliente doit également initialiser tous les éléments de tableau avant l’appel. Avant de revenir au client, l’application serveur doit vérifier que tous les éléments de tableau du point de plage transmis vers un stockage valide.

Côté serveur, le stub alloue le stockage pour tous les éléments de tableau, quelle que soit la valeur [length_is] ou [last_is] au moment de l’appel. Cette fonctionnalité peut affecter les performances de votre application.

Aucune restriction n’est appliquée aux tableaux de pointeurs uniques. Sur le client et le serveur, le stockage est alloué pour les pointeurs Null. Lorsque les pointeurs ne sont pas null, les données sont placées dans un stockage préalloué.

Un déclarateur de pointeur facultatif peut précéder le déclarateur de tableau.

Lorsque les pointeurs de référence incorporés sont des paramètres [out]uniquement, le code du gestionnaire de serveur doit affecter des valeurs valides au tableau de pointeurs de référence. Par exemple :

typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );

Les stubs générés allouent le tableau et attribuent des valeurs Null à tous les pointeurs incorporés dans le tableau.