Condividi tramite


Matrici multidimensionali

Gli attributi della matrice possono essere usati anche con matrici multidimensionali. Tuttavia, prestare attenzione a garantire che ogni dimensione della matrice abbia un attributo corrispondente. Ad esempio:

/* 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 matrice precedente è una matrice conforme (di dimensioni d1size ) di 30 matrici di elementi (con gli elementi d2len forniti per ognuno). La virgola tra parentesi dell'attributo [size_is] specifica che il valore in d1size viene applicato alla prima dimensione della matrice. Analogamente, il comando tra parentesi dell'attributo [length_is] indica che il valore in d2len viene applicato alla seconda dimensione della matrice.

Il compilatore MIDL 2.0 fornisce due metodi per il marshalling dei parametri: modalità mista (/Os) e completamente interpretati (/Oif o /Oicf). Per impostazione predefinita, il compilatore MIDL compila le interfacce in modalità mista. Non è necessario specificare in modo esplicito l'opzione /Os per ottenere il marshalling in modalità mista.

Il metodo completamente interpretato effettua il marshalling dei dati completamente offline. Ciò riduce notevolmente le dimensioni del codice stub, ma comporta anche una riduzione delle prestazioni. Nel marshalling in modalità mista, gli stub esegue il marshalling di alcuni parametri online. Anche se ciò comporta una dimensione stub maggiore, offre anche prestazioni migliori.

Attenzione

Prestare attenzione durante la compilazione di file IDL in questa modalità. L'uso di matrici multidimensionali in modalità mista può comportare parametri di cui non viene eseguito correttamente il marshalling. L'opzione della riga di comando /Oicf è consigliata quando l'interfaccia definisce i parametri che sono matrici multidimensionali.

 

L'attributo [string] può essere usato anche con matrici multidimensionali. L'attributo si applica alla dimensione meno significativa, ad esempio una matrice di stringhe conforme. È anche possibile usare gli attributi del puntatore multidimensionale. Ad esempio:

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

Nell'esempio precedente la variabile ptr2d è un puntatore a un blocco di puntatori di dimensioni d1len, ognuno dei quali punta ai puntatori d2len a long.

Le matrici multidimensionali non sono equivalenti alle matrici di puntatori. Una matrice multidimensionale è un singolo blocco di dati di grandi dimensioni in memoria. Una matrice di puntatori contiene solo un blocco di puntatori nella matrice. I dati a cui puntano i puntatori possono trovarsi in qualsiasi punto della memoria. Inoltre, la sintassi ANSI C consente di specificare solo la dimensione di matrice più significativa (all'estrema sinistra) in una matrice multidimensionale. Di conseguenza, di seguito è riportata un'istruzione valida:

long a1[] [20]

Confrontarlo con l'istruzione non valida seguente:

long a1[20] []