Condividi tramite


Matrici multidimensionali

Gli attributi di matrice possono essere usati anche con matrici multidimensionali. Tuttavia, prestare attenzione a assicurarsi che ogni dimensione della matrice abbia un attributo corrispondente. Per 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 dimensione d1size ) di 30 matrici di elementi (con 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 dimensioni stub maggiori, offre anche prestazioni migliori.

Cautela

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 è stato eseguito correttamente il marshalling. L'opzione della riga di comando/Oicfè consigliata quando l'interfaccia definisce i parametri che sono matrici multidimensionali.

 

L'attributo [stringa] può essere usato anche con matrici multidimensionali. L'attributo si applica alla dimensione meno significativa, ad esempio una matrice conforme di stringhe. È anche possibile usare gli attributi del puntatore multidimensionale. Per 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 d1len, ognuno dei quali punta ai puntatori d2len a lungo.

Le matrici multidimensionali non sono equivalenti a 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 non specificare solo la dimensione della 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] []