Bagikan melalui


Array Multidirmansional

Atribut array juga dapat digunakan dengan array multidirmensional. Namun, berhati-hatilah untuk memastikan bahwa setiap dimensi array memiliki atribut yang sesuai. Misalnya:

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

Array sebelumnya adalah array yang sesuai (ukuran d1size ) dari 30 array elemen (dengan elemen d2len dikirim untuk masing-masing). Koma dalam tanda kurung atribut [size_is] menentukan bahwa nilai dalam d1size diterapkan ke dimensi pertama array. Demikian juga, perintah dalam tanda kurung atribut [length_is] menunjukkan bahwa nilai dalam d2len diterapkan ke dimensi kedua array.

Kompilator MIDL 2.0 menyediakan dua metode untuk parameter marshaling: mode campuran (/Os) dan sepenuhnya ditafsirkan (/Oif atau /Oicf). Secara default, pengkompilasi MIDL mengkompilasi antarmuka dalam mode campuran. Anda tidak perlu secara eksplisit menentukan sakelar/Os untuk mendapatkan marshaling mode campuran.

Data marshal metode yang sepenuhnya ditafsirkan benar-benar offline. Ini mengurangi ukuran kode stub secara besar-besaran, tetapi juga mengakibatkan penurunan performa. Dalam marshaling mode campuran, stubs marshals beberapa parameter online. Meskipun ini menghasilkan ukuran stub yang lebih besar, ini juga menawarkan peningkatan performa.

Hati

Berhati-hatilah saat mengkompilasi file IDL dalam mode ini. Menggunakan array multidemiksa dalam mode campuran dapat mengakibatkan parameter yang tidak di-marshal dengan benar. Sakelar baris perintah /Oicf direkomendasikan saat antarmuka Anda menentukan parameter yang merupakan array multidemia.

 

Atribut [string] juga dapat digunakan dengan array multidmensional. Atribut ini berlaku untuk dimensi yang paling tidak signifikan, seperti array string yang sesuai. Anda juga dapat menggunakan atribut pointer multidmensional. Misalnya:

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

Dalam contoh sebelumnya, variabel ptr2d adalah penunjuk ke blok pointer berukuran d1len, yang masing-masing menunjuk ke penunjuk d2len untuk panjang.

Array multidampingan tidak setara dengan array penunjuk. Array multidireksional adalah blok data tunggal yang besar dalam memori. Array pointer hanya berisi blok penunjuk dalam array. Data yang dirujuk penunjuk dapat berada di mana saja dalam memori. Selain itu, sintaks ANSI C hanya memungkinkan dimensi array (paling kiri) yang paling signifikan untuk tidak ditentukan dalam array multidimensi. Oleh karena itu, berikut ini adalah pernyataan yang valid:

long a1[] [20]

Bandingkan ini dengan pernyataan tidak valid berikut:

long a1[20] []