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