Share via


Matrices multidimensionales

Los atributos de matriz también se pueden usar con matrices multidimensionales. Sin embargo, tenga cuidado de asegurarse de que cada dimensión de la matriz tiene un atributo correspondiente. Por ejemplo:

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

La matriz anterior es una matriz conforme (de tamaño d1size ) de 30 matrices de elementos (con elementos d2len enviados para cada uno). La coma en los paréntesis del atributo [size_is] especifica que el valor de d1size se aplica a la primera dimensión de la matriz. Del mismo modo, el comando entre paréntesis del atributo [length_is] indica que el valor de d2len se aplica a la segunda dimensión de la matriz.

El compilador MIDL 2.0 proporciona dos métodos para serializar parámetros: el modo mixto (/Os) y totalmente interpretado (/Oif o /Oicf). De forma predeterminada, el compilador MIDL compila interfaces en modo mixto. No es necesario especificar explícitamente el modificador /Os para obtener serializaciones en modo mixto.

El método totalmente interpretado serializa los datos completamente sin conexión. Esto reduce considerablemente el tamaño del código auxiliar, pero también reduce el rendimiento. En la serialización en modo mixto, los códigos auxiliares serializa algunos parámetros en línea. Aunque esto da como resultado un tamaño de código auxiliar mayor, también ofrece un mayor rendimiento.

Precaución

Tenga cuidado al compilar archivos IDL en este modo. El uso de matrices multidimensionales en modo mixto puede dar lugar a parámetros que no se serializan correctamente. Se recomienda el modificador de línea de comandos /Oicf cuando la interfaz define parámetros que son matrices multidimensionales.

 

El atributo [string] también se puede usar con matrices multidimensionales. El atributo se aplica a la dimensión menos significativa, como una matriz compatible de cadenas. También puede usar atributos de puntero multidimensional. Por ejemplo:

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

En el ejemplo anterior, la variable ptr2d es un puntero a un bloque de punteros de tamaño d1len, cada uno de los cuales apunta a punteros d2len a long.

Las matrices multidimensionales no son equivalentes a matrices de punteros. Una matriz multidimensional es un único bloque grande de datos en memoria. Una matriz de punteros solo contiene un bloque de punteros de la matriz. Los datos a los que apuntan los punteros pueden estar en cualquier parte de la memoria. Además, la sintaxis de ANSI C solo permite que la dimensión de matriz más significativa (más a la izquierda) no se especifique en una matriz multidimensional. Por lo tanto, lo siguiente es una instrucción válida:

long a1[] [20]

Compare esto con la siguiente instrucción no válida:

long a1[20] []