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 compatível (de tamanho d1size ) de 30 matrizes de elementos (com elementos d2len enviados para cada). A vírgula entre parênteses do atributo [size_is] especifica que o valor em d1size é aplicado à primeira dimensão da matriz. Da mesma forma, o comando entre 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 realizar 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 realiza 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 realiza marshaling de alguns parâmetros online. Embora isso resulte em um tamanho maior de stub, ele também oferece maior desempenho.

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 têm marshaling correto. A opção de linha de comando /Oicf é recomendada quando sua interface define parâmetros que são matrizes multidimensionais.

 

O atributo [string] 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 multidimensionais. 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 long.

Matrizes multidimensionais não são equivalentes a matrizes de ponteiros. Uma matriz multidimensional é um bloco de dados único e grande na memória. Uma matriz de ponteiros contém apenas um bloco de ponteiros na matriz. Os dados para os 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] []