Сущность технологии COM



         

Массивы - часть 7


HRESULT CFoo::Method16(long cMax, long *pcActual, short *rgs) { *pcActual = min(cMax,5); // only write 1st 5 elems // записываем только первые пять элементов for (long n = 0; n < *pcActual; n++) rgs[n] = n * n; return S_OK; }

Это позволяет вызывающей программе контролировать задание размеров буфера, а реализация метода контролирует фактическое количество переданных элементов.

Если открытый массив будет использоваться в качестве входного/выходного параметра, то следует указать переменную длину массива в каждом направлении. Если число элементов на входе может отличаться от числа элементов на выходе, то параметр переменной длины тоже должен иметь входной/выходной тип:

HRESULT Method17([in] long cMax, [in, out] long *pcActual, [in, out, size_is(cMax), length_is(*pcActual)] short *rgs);

что предполагает следующий код на стороне клиента:

void f(IFoo *pFoo) { short rgs[8]; rgs[0] = 0; rgs[1] = 1; long cActual = 2; pFoo->Method17(8, &cActual, rgs); // .. process first cActual elements of rgs // .. обрабатываем первые cActual элементов из массива rgs }

Если число элементов на входе и на выходе одно и то же, то подойдет совместимый массив:

HRESULT Method18([in] long cElems, [in, out, size_is(cElems)] short *rgs);

Данный метод использует эффективность совместимого массива, и его гораздо проще использовать.

Приведенные выше примеры оперировали с одномерными массивами. Рассмотрим следующий прототип на С:

void g(short **arg1);

Этот прототип может означать в С все, что угодно. Возможно, функция ожидает указатель на одно короткое целое число:

void g(short **arg1) { // return ptr to static // возвращаем указатель на static static short s; *arg1 = &s; }

Или, возможно, функция ожидает массив из 100 коротких указателей:

void g(short **arg1) { // square 100 shorts by ref // квадрат из 100 коротких целых указателей for (int n = 0; n < 100; n++) *(arg1[n]) *= *(arg1[n]); }

А также, возможно, функция ожидает указатель на указатель на массив коротких целых:




Содержание  Назад  Вперед