Matrices MIDL
Los declaradores de matriz aparecen en el cuerpo de la interfaz del archivo IDL como uno de los siguientes:
- Parte de una declaración general
- Miembro de una estructura o declarador de unión
- Parámetro a una llamada a procedimiento remoto
Los límites de cada dimensión de la matriz se expresan dentro de un par de corchetes independientes. Una expresión que se evalúa como n significa un límite inferior de cero y un límite superior de n - 1. Si los corchetes están vacíos o contienen un único asterisco (*), el límite inferior es cero y el límite superior se determina en tiempo de ejecución.
La matriz también puede contener dos valores separados por puntos suspensivos que representan los límites inferior y superior de la matriz, como en [inferior...superior]. Microsoft RPC requiere un límite inferior de cero. El compilador de MIDL no reconoce construcciones que especifican límites inferiores distintos de cero.
Las matrices se pueden asociar con los atributos de campo size_is, max_is, length_is, first_is y last_is para especificar el tamaño de la matriz o la parte de la matriz que contiene datos válidos. Estos atributos de campo identifican el parámetro, el campo de estructura o la constante que especifica la dimensión o índice de la matriz.
La matriz debe estar asociada al identificador especificado por el atributo field de la siguiente manera: cuando la matriz es un parámetro, el identificador también debe ser un parámetro para la misma función; cuando la matriz es un campo de estructura, el identificador debe ser otro campo de estructura de esa misma estructura.
Una matriz se denomina "conforme" si el límite superior de cualquier dimensión se determina en tiempo de ejecución. (Solo se pueden determinar límites superiores en tiempo de ejecución). Para determinar el límite superior, la declaración de matriz debe incluir un atributo size_is o max_is.
Una matriz se denomina "variable" cuando sus límites se determinan en tiempo de compilación, pero el intervalo de elementos transmitidos se determina en tiempo de ejecución. Para determinar el intervalo de elementos transmitidos, la declaración de matriz debe incluir un atributo length_is, first_is, o last_is.
Una matriz variable conforme (también denominada "abierta") es una matriz cuyo límite superior e intervalo de elementos transmitidos se determinan en tiempo de ejecución. Como máximo, una matriz variable conforme o conforme se puede anidar en una estructura C y debe ser el último elemento de la estructura. En cambio, las matrices variables no conformes pueden producirse en cualquier parte de una estructura.
Ejemplos
/* 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..*]
);
Para obtener más información, consulte Matrices y punteros.
Matrices multidimensionales
El usuario puede declarar tipos que son matrices y, a continuación, declarar matrices de objetos de dichos tipos. La semántica de matrices dimensionales m de tipos de matriz dimensionales n es la misma que la semántica de matrices dimensionales m+n.
Por ejemplo, el tipo RECT_TYPE se puede definir como una matriz bidimensional y la variable rect se puede definir como una matriz de RECT_TYPE. Esto equivale a la matriz tridimensional 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á orientado a C. Siguiendo las convenciones del lenguaje C, solo la primera dimensión de una matriz multidimensional puede determinarse en tiempo de ejecución. La interoperación con matrices IDL de DCE que admiten otros idiomas está limitada a:
- Matrices multidimensionales con límites constantes (determinados en tiempo de compilación).
- Matrices multidimensionales con todos los límites constantes, excepto la primera dimensión. El límite superior y el intervalo de elementos transmitidos de la primera dimensión dependen del tiempo de ejecución.
- Cualquier matriz unidimensional con un límite inferior de cero.
Cuando se usa el atributo [string] en matrices multidimensionales, el atributo se aplica a la matriz situada más a la derecha.
Matrices de punteros
Los punteros de referencia deben apuntar a datos válidos. La aplicación cliente debe asignar toda la memoria para una matriz [in] o [ in,out] de punteros de referencia, especialmente cuando la matriz está asociada a los valores [in] o [ in,out], [length_is] o [last_is]. La aplicación cliente también debe inicializar todos los elementos de matriz antes de la llamada. Antes de volver al cliente, la aplicación de servidor debe comprobar que todos los elementos de la matriz del intervalo transmitido apuntan al almacenamiento válido.
En el lado servidor, el código auxiliar asigna almacenamiento para todos los elementos de matriz, independientemente del valor [length_is] or [last_is] en el momento de la llamada. Esta función puede afectar al rendimiento de la aplicación.
No se aplican restricciones en matrices de punteros únicos. Tanto en el cliente como en el servidor, el almacenamiento se asigna para punteros NULL. Cuando los punteros no son NULL, los datos se colocan en el almacenamiento asignado previamente.
Un declarador de puntero opcional puede preceder al declarador de matriz.
Cuando los punteros de referencia incrustados son parámetros de solo [out], el código del administrador del servidor debe asignar valores válidos a la matriz de punteros de referencia. Por ejemplo:
typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );
Los códigos auxiliares generados asignan la matriz y asignan valores NULL a todos los punteros incrustados en la matriz.