Bagikan melalui


Array Multidimensi

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

/* 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.

Pengkompilasi 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.

Metode yang sepenuhnya ditafsirkan marshals data 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.

Perhatian

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

 

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

/* 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 pointer ke blok pointer berukuran d1len, yang masing-masing menunjuk ke d2len pointer ke panjang.

Array multidimensi tidak setara dengan array pointer. Array multidimensi adalah blok data tunggal yang besar dalam memori. Array pointer hanya berisi blok pointer dalam array. Data yang dirujuk pointer 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] []