Megosztás a következőn keresztül:


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.