Compartir a través de


Matrices multidimensionales

Los atributos de matriz también se pueden usar con matrices multidimensionales. Sin embargo, tenga cuidado de asegurarse de que todas las dimensiones de la matriz tengan 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 de 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: mixed-mode (/Os) y totalmente interpretados (/Oif o /Oicf). De forma predeterminada, el compilador MIDL compila interfaces en modo mixto. No es necesario especificar explícitamente el modificador de /Os para obtener serialización 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 produce una disminución del 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.

Cautela

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 serializaron correctamente. Se recomienda modificador de línea de comandos /Oic f cuando la interfaz define parámetros que son matrices multidimensionales.

 

El atributo [cadena] 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 en la matriz. Los datos a los que apuntan los punteros pueden estar en cualquier parte de la memoria. Además, la sintaxis 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] []