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


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

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

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