Поделиться через


Многомерные массивы

Атрибуты массива также можно использовать с многомерными массивами. Однако будьте внимательны, чтобы каждое измерение массива было соответствующим атрибутом. Пример:

/* 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] []