Многомерные массивы
Атрибуты массива также можно использовать с многомерными массивами. Однако будьте внимательны, чтобы убедиться, что каждое измерение массива имеет соответствующий атрибут. Например:
/* 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] ) ;
}
Предыдущий массив является соответствующим массивом (размером d1size) из 30 массивов элементов (с элементами d2len, отправленными для каждого). Запятая в скобках атрибута [size_is] указывает, что значение в d1size применяется к первому измерению массива. Аналогичным образом команда в скобках атрибута [length_is] указывает, что значение в d2len применяется ко второму измерению массива.
Компилятор MIDL 2.0 предоставляет два метода маршалинга параметров: смешанный режим (/Ос) и полностью интерпретируемый (/Oif или /Oicf). По умолчанию компилятор MIDL компилирует интерфейсы в смешанном режиме. Не нужно явно указывать /Os для получения маршалинга в смешанном режиме.
Полностью интерпретируемый метод маршалирует данные полностью в автономном режиме. Это значительно сокращает размер заглушки кода, но также приводит к снижению производительности. В смешанном режиме маршалинг, заглушки маршалирует некоторые параметры в сети. Хотя это приводит к увеличению размера заглушки, он также обеспечивает повышенную производительность.
Осторожность
Соблюдайте осторожность при компиляции файлов IDL в этом режиме. Использование многомерных массивов в смешанном режиме может привести к неправильному маршалингу параметров. Параметр командной строки /Oicf рекомендуется, когда интерфейс определяет параметры, которые являются многомерными массивами.
Атрибут [строка] также можно использовать с многомерными массивами. Атрибут применяется к наименьшему значительному измерению, например к соответствующему массиву строк. Можно также использовать многомерные атрибуты указателя. Например:
/* 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) ;
}
В предыдущем примере переменная ptr2d — это указатель на блок указателей размера d1len, каждый из которых указывает на указатели d2len на длинные.
Многомерные массивы не эквивалентны массивам указателей. Многомерный массив — это один большой блок данных в памяти. Массив указателей содержит только блок указателей в массиве. Данные, указывающие указатели, могут находиться в любой точке памяти. Кроме того, синтаксис ANSI C позволяет не указать только наиболее значительное (левое) измерение массива в многомерном массиве. Таким образом, ниже приведена допустимая инструкция:
long a1[] [20]
Сравните это со следующей недопустимой инструкцией:
long a1[20] []