MIDL-tömbök
A tömbdeklarátorok az IDL-fájl felülettörzsében az alábbiak egyikeként jelennek meg:
- Általános nyilatkozat része
- Egy struktúra vagy szakszervezeti deklarátor tagja
- Egy távoli eljáráshívás paramétere
A tömb minden dimenziójának határai egy külön szögletes zárójelpárban vannak kifejezve. Az n kiértékelő kifejezés nulla alsó és n – 1felső határát jelöli. Ha a szögletes zárójelek üresek, vagy egyetlen csillagot (*) tartalmaznak, az alsó határ nulla, a felső határ pedig futásidőben lesz meghatározva.
A tömb két, három ponttal elválasztott értéket is tartalmazhat, amelyek a tömb alsó és felső határait jelölik, ahogyan az [alsó...felső]. A Microsoft RPC-hez a nulla alsó határa szükséges. A MIDL-fordító nem ismeri fel azokat a szerkezeteket, amelyek nem alsó határokat határoznak meg.
A tömbök társíthatók a size_is, max_is, length_is, first_isés last_is mezőattribútumokkal a tömb vagy a tömb érvényes adatokat tartalmazó részének megadásához. Ezek a mezőattribútumok azonosítják a tömb dimenzióját vagy indexét meghatározó paramétert, struktúramezőt vagy állandót.
A tömböt a következő módon kell társítani a mezőattribútum által megadott azonosítóval: Ha a tömb paraméter, az azonosítónak ugyanahhoz a függvényhez is paraméternek kell lennie; ha a tömb egy struktúramező, az azonosítónak ugyanannak a struktúrának egy másik struktúramezőjének kell lennie.
A tömb neve "konformáló", ha bármely dimenzió felső határa futásidőben van meghatározva. (Futásidőben csak a felső határ határozható meg.) A felső határ meghatározásához a tömbdeklarációnak tartalmaznia kell egy size_is vagy max_is attribútumot.
A tömböket "változónak" nevezzük, ha a kötések a fordításkor vannak meghatározva, de az átvitt elemek tartománya futásidőben van meghatározva. A továbbított elemek tartományának meghatározásához a tömbdeklarációnak tartalmaznia kell egy length_is, first_isvagy last_is attribútumot.
A megfelelő változó tömb (más néven "nyitott") olyan tömb, amelynek a felső határa és az átvitt elemek tartománya futásidőben van meghatározva. Legfeljebb egy konformáló vagy egy megfelelő változó tömb ágyazható be egy C struktúrába, és a szerkezet utolsó elemének kell lennie. Ezzel szemben a nem változó tömbök a struktúra bármely pontján előfordulhatnak.
Példák
/* IDL file interface body */
#define MAX_INDEX 10
typedef char ATYPE[MAX_INDEX];
typedef short BTYPE[]; // Equivalent to [*];
typedef long CTYPE[*][10]; // [][10]
typedef float DTYPE[0..10]; // Equivalent to [11]
typedef float ETYPE[0..(MAX_INDEX)];
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} counted_string;
HRESULT MyFunction(
[in, out] short * pSize,
[in, out, string, size_is(*pSize)] char a[0..*]
);
További információ: Tömbök és mutatók.
Többdimenziós tömbök
A felhasználó deklarálhat tömb típusú típusokat, majd deklarálhatja az ilyen típusú objektumok tömbeit. Az m-dimenziós tömbök n-dimenziótömbök szemantikája megegyezik m+n-dimenziós tömbök szemantikája.
A RECT_TYPE típus például kétdimenziós tömbként definiálható, a rect változó pedig RECT_TYPE tömbjeként definiálható. Ez egyenértékű a háromdimenziós tömb equivalent_rect:
typedef short int RECT_TYPE[10][20];
RECT_TYPE rect[15];
short int equivalent_rect[15][10][20]; // ~RECT_TYPE rect[15]
A Microsoft RPC C-orientált. A C nyelvi konvenciók szerint futásidőben csak a többdimenziós tömb első dimenziója határozható meg. A más nyelveket támogató DCE IDL-tömbökkel való együttműködés a következőkre korlátozódik:
- Többdimenziós tömbök állandó (fordítási idő alapján meghatározott) határokkal.
- Többdimenziós tömbök, az első dimenzió kivételével minden állandó határral. Az első dimenzió továbbított elemeinek felső határa és tartománya futásidejű.
- Minden olyan egydimenziós tömb, amelynek alsó határa nulla.
Ha a [sztring] attribútumot használják többdimenziós tömbökben, az attribútum a jobb szélső tömbre vonatkozik.
Mutatótömbök
A referenciamutatóknak érvényes adatokra kell mutatniuk. Az ügyfélalkalmazásnak minden memóriát le kell foglalnia egy [] vagy [be,ki] hivatkozásmutatók tömbje, különösen akkor, ha a tömb [in], vagy [in,out], [length_is], vagy [last_is] értékeket. Az ügyfélalkalmazásnak a hívás előtt inicializálnia kell az összes tömbelemet is. Mielőtt visszatér az ügyfélhez, a kiszolgálóalkalmazásnak ellenőriznie kell, hogy a továbbított tartomány összes tömbeleme érvényes tárolóra mutat-e.
A kiszolgálóoldalon a csonk minden tömbelem számára lefoglalja a tárolót, függetlenül attól, hogy a hívás időpontjában [length_is] vagy [last_is] értéket. Ez a funkció befolyásolhatja az alkalmazás teljesítményét.
Nincs korlátozás az egyedi mutatótömbökre. Az ügyfélen és a kiszolgálón a tárterület nullmutatókhoz van lefoglalva. Ha a mutatók nem null értékűek, az adatok előre kihelyezett tárolóba kerülnek.
Egy választható mutatódeklarátor megelőzheti a tömbdeklarátort.
Ha a beágyazott referenciamutatók [ki]csak paramétereket, a kiszolgáló-kezelő kódnak érvényes értékeket kell hozzárendelnie a referenciamutatók tömbhöz. Például:
typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );
A létrehozott csonkok lefoglalják a tömböt, és null értékeket rendelnek a tömbbe beágyazott összes mutatóhoz.