Compartilhar via


Matrizes Multidimensionais

Atributos de matriz também podem ser usados com matrizes multidimensionais. No entanto, tenha cuidado para garantir que cada dimensão da matriz tenha um atributo correspondente. Por exemplo:

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

A matriz anterior é uma matriz de conformidade (de tamanho d1size) de 30 matrizes de elementos (com elementos d2len enviados para cada). A vírgula nos parênteses do atributo [size_is] especifica que o valor em d1size é aplicado à primeira dimensão da matriz. Da mesma forma, o comando nos parênteses do atributo [length_is] indica que o valor em d2len é aplicado à segunda dimensão da matriz.

O compilador MIDL 2.0 fornece dois métodos para marshaling de parâmetros: modo misto (/Os) e totalmente interpretado (/Oif ou/Oicf). Por padrão, o compilador MIDL compila interfaces no modo misto. Você não precisa especificar explicitamente a opção /Os para obter marshaling de modo misto.

O método totalmente interpretado faz marshaling de dados completamente offline. Isso reduz consideravelmente o tamanho do código stub, mas também resulta em um desempenho reduzido. No marshaling de modo misto, os stubs empacotam alguns parâmetros online. Embora isso resulte em um tamanho maior de stub, ele também oferece um desempenho maior.

Cuidado

Tenha cuidado ao compilar arquivos IDL nesse modo. O uso de matrizes multidimensionais no modo misto pode resultar em parâmetros que não são empacotados corretamente. A opção de linha de comando /Oicf é recomendada quando sua interface define parâmetros que são matrizes multidimensionais.

 

O atributo [cadeia de caracteres] também pode ser usado com matrizes multidimensionais. O atributo se aplica à dimensão menos significativa, como uma matriz de cadeias de caracteres em conformidade. Você também pode usar atributos de ponteiro multidimensional. Por exemplo:

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

No exemplo anterior, a variável ptr2d é um ponteiro para um bloco de ponteiros do tamanho d1len, cada um dos quais aponta para ponteiros d2len para longo.

Matrizes multidimensionais não são equivalentes a matrizes de ponteiros. Uma matriz multidimensional é um único bloco grande de dados na memória. Uma matriz de ponteiros contém apenas um bloco de ponteiros na matriz. Os dados aos quais os ponteiros apontam podem estar em qualquer lugar na memória. Além disso, a sintaxe ANSI C permite que apenas a dimensão de matriz mais significativa (à esquerda) não seja especificada em uma matriz multidimensional. Portanto, o seguinte é uma instrução válida:

long a1[] [20]

Compare isso com a seguinte instrução inválida:

long a1[20] []