多次元配列
配列属性は、多次元配列でも使用できます。 ただし、配列のすべての次元に対応する属性が含まれるように注意してください。 例えば:
/* 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] ) ;
}
上記の配列は、30 個の要素配列 (d2len 要素ごとに出荷される) の適合配列 (サイズ d1size) です。 [size_is] 属性のかっこ内のコンマは、d1size の値が配列の最初の次元に適用されることを指定します。 同様に、[length_is] 属性のかっこ内のコマンドは、d2len の値が配列の 2 番目の次元に適用されることを示します。
MIDL 2.0 コンパイラには、混合モード (/Os) と完全に解釈された (/Oifまたは /Oicf) の 2 つのマーシャリング メソッドが用意されています。 既定では、MIDL コンパイラは混合モードでインターフェイスをコンパイルします。 混在モードのマーシャリングを取得するために、/Os スイッチを明示的に指定する必要はありません。
完全に解釈されたメソッドは、データを完全にオフラインでマーシャリングします。 これにより、スタブ コードのサイズが大幅に削減されますが、パフォーマンスも低下します。 混合モードのマーシャリングでは、スタブは一部のパラメーターをオンラインでマーシャリングします。 これによりスタブ サイズが大きくなりますが、パフォーマンスも向上します。
注意
このモードで IDL ファイルをコンパイルするときは注意が必要です。 混合モードで多次元配列を使用すると、パラメーターが正しくマーシャリングされない可能性があります。 /Oicf コマンド ライン スイッチは、インターフェイスで多次元配列であるパラメーターを定義する場合に推奨されます。
[文字列] 属性は、多次元配列でも使用できます。 この属性は、文字列の一致する配列など、最下位ディメンションに適用されます。 多次元ポインター属性を使用することもできます。 例えば:
/* 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) ;
}
前の例では、変数 ptr2d は d1len サイズのポインター ブロックへのポインターであり、各ポインターは d2len ポインターを長い 指しています。
多次元配列は、ポインターの配列と同等ではありません。 多次元配列は、メモリ内の単一の大きなデータ ブロックです。 ポインターの配列には、配列内のポインターのブロックのみが含まれます。 ポインターが指すデータは、メモリ内の任意の場所に置くことができます。 また、ANSI C 構文では、多次元配列で最も重要な (左端の) 配列次元のみを指定できます。 したがって、有効なステートメントは次のとおりです。
long a1[] [20]
これを次の無効なステートメントと比較します。
long a1[20] []