Преобразование данных

Правила преобразования

В этом разделе описываются правила преобразования данных для COM-компонентов, созданных с продуктом MATLAB® Compiler SDK™. Этими компонентами являются двойные интерфейсные COM-объекты, которые поддерживают типы данных, совместимые с Автоматизацией.

Примечание

Automation (раньше названная Автоматизация OLE) является технологией, которая позволяет пакетам программного обеспечения представлять свои уникальные функции сценариям инструментов и других приложений. Автоматизация использует Объектную модель программных компонентов (COM), но может быть реализована независимо от других функций OLE, таких как активизация "на месте".

Внимание

Следует иметь в виду, что IIS (интернет-Информационная служба) обычно предотвращает большую часть автоматизации COM на основании, что это может изложить угрозу безопасности. Поэтому XLSREAD и другие услуги по Автоматизации могут перестать работать, когда подается IIS, ведя к ошибкам, таким как object reference not set.

Когда метод вызывается на компонент MATLAB Compiler SDK, входные параметры преобразованы в формат внутреннего массива MATLAB и переданы скомпилированной функции MATLAB. Когда функция выходит, выходные параметры преобразованы от формата внутреннего массива MATLAB до типов Автоматизации COM.

COM-клиент передает все аргументы ввода и вывода в скомпилированных функциях MATLAB как тип VARIANT. Тип VARIANT COM является объединением нескольких простых типов данных. Переменная VARIANT типа может сохранить переменную любого из простых типов, а также массивов любого из этих значений.

Win32 API обеспечивает много функций для создания и управления VARIANT s на C/C++, и Microsoft® Visual Basic® оказывает поддержку родного языка для этого типа. См. документацию Microsoft Visual Studio® для определений и поддержку API VARIANT COM s. переменные VARIANT являются сам описание и хранят свой код типа как внутреннее поле структуры.

Примечание

Это обсуждение данных относится к VARIANT и к типам данных Variant. VARIANT является именем C++, и Variant является соответствующим типом данных в Visual Basic.

См. Коды Типа VARIANT, Поддержанные для списка кодов типа VARIANT, поддержанных компонентами компилятора.

Смотрите MATLAB к Правилам Преобразования COM VARIANT и COM VARIANT к Правилам Преобразования MATLAB для правил преобразования между VARIANT COM s и массивами MATLAB.

Поддерживаемые коды типа VARIANT

Код типа VARIANT
(C/C++)
Тип C/C++Различный код типа (Visual Basic)Тип Visual BasicОпределение
VT_EMPTY-vbEmpty-

Неинициализированный VARIANT

VT_I1char--

Однобайтовый символ со знаком

VT_UI1

char без знака

vbByteByte

Однобайтовый символ без знака

VT_I2shortvbIntegerInteger

Целое число 2D байта со знаком

VT_UI2unsigned short--

Целое число 2D байта без знака

VT_I4longvbLongLong

Четырехбайтовое целое число со знаком

VT_UI4unsigned long--

Четырехбайтовое целое число без знака

VT_R4floatvbSingleSingle

IEEE® четырехбайтовое значение с плавающей точкой

VT_R8doublevbDoubleDouble

IEEE восьмибайтовое значение с плавающей точкой

VT_CYCY +vbCurrencyCurrency

Значение валюты (64-битное целое число, масштабируемое 10 000)

VT_BSTRBSTR +vbStringString

Представьте значение в виде строки

VT_ERRORSCODE +vbError-

HRESULT (подписал четырехбайтовое целое число, представляющее код ошибки COM),

VT_DATEDATE +vbDateDate

Восьмибайтовое значение с плавающей точкой, представляющее дату и время

VT_INTint--

Целое число со знаком; эквивалентный, чтобы ввести int

VT_UINTunsigned int--

Беззнаковое целое; эквивалентный, чтобы ввести unsigned int

VT_DECIMALDECIMAL +vbDecimal-

96-битное (12-байтовое) беззнаковое целое, масштабируемое переменной мощностью 10

VT_BOOLVARIANT_BOOL +vbBooleanBoolean

Булево значение 2D байта (0xFFFF = Верный; 0x0000 = Ложь)

VT_DISPATCHIDispatch*vbObjectObject

Указатель IDispatch* на объект

VT_VARIANTVARIANT +vbVariantVariant

VARIANT (может только быть задан, если объединено с VT_BYREF или VT_ARRAY),

<anything>|VT_ARRAY   

Поразрядно объедините VT_ARRAY с любым основным типом, чтобы объявить как массив

<anything>|VT_BYREF   

Поразрядно объедините VT_BYREF с любым основным типом, чтобы объявить как ссылка на значение

+ Обозначает определенный тип Windows®. Не часть стандартного C/C++.

MATLAB к правилам преобразования COM VARIANT

Тип данных MATLABТип VARIANT для скалярных данныхТип VARIANT для данных массиваКомментарии
cell

Массив ячеек 1 на 1 преобразовывает в один VARIANT с типом, соответствующим правилу преобразования для типа данных MATLAB содержимого ячейки.

Многомерный массив ячеек преобразовывает в VARIANT типа VT_VARIANT|VT_ARRAY с типом каждого участника массивов, соответствующего правилу преобразования для типа данных MATLAB соответствующей ячейки.

structure

VT_DISPATCH

VT_DISPATCH

Массив struct MATLAB преобразован в объект MWStruct. (См. Класс MWStruct.) Этот объект передается как тип VT_DISPATCH.

char

Матрица char 1 на 1 преобразовывает в VARIANT типа VT_BSTR с длиной строки = 1.

1 L матрицей char принят, чтобы представлять строку длины L в MATLAB. Этот случай преобразовывает в VARIANT типа VT_BSTR с длиной строки = L. матрицы char больше чем одной строки, или более высокой размерности преобразовывают в VARIANT типа VT_BSTR|VT_ARRAY. Каждая строка в конвертированном массиве имеет длину 1 и соответствует каждому символу в исходной матрице.

Массивы строк не поддержаны как матрицы char. Чтобы передать массив строк, используйте массив ячеек 1 L матрицами char.

sparse

VT_DISPATCH

VT_DISPATCH

Разреженный массив MATLAB преобразован в объект MWSparse. (См. Класс MWSparse.) Этот объект передается как тип VT_DISPATCH.

double

Действительная двойная матрица 1 на 1 преобразовывает в VARIANT типа VT_R8. Комплекс 1 на 1 удваивается, матрица преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная двойная матрица преобразовывает в VARIANT типа VT_R8|VT_ARRAY.
Комплексная многомерная двойная матрица преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex. Смотрите Класс MWComplex

single

Действительная одна матрица 1 на 1 преобразовывает в VARIANT типа VT_R4. Комплекс 1 на 1 одна матрица преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная одна матрица преобразовывает в VARIANT типа VT_R4|VT_ARRAY.
Комплексная многомерная одна матрица преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

int8

Действительная матрица int8 1 на 1 преобразовывает в VARIANT типа VT_I1. Комплексная матрица int8 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная матрица int8 преобразовывает в VARIANT типа VT_I1|VT_ARRAY.
Комплексная многомерная матрица int8 преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

uint8

Действительная матрица uint8 1 на 1 преобразовывает в VARIANT типа VT_UI1. Комплексная матрица uint8 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная матрица uint8 преобразовывает в VARIANT типа, VT_UI1|VT_ARRAY.A объединяет многомерную матрицу uint8, преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

int16

Действительная матрица int16 1 на 1 преобразовывает в VARIANT типа VT_I2. Комплексная матрица int16 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная матрица int16 преобразовывает в VARIANT типа VT_I2|VT_ARRAY. Комплексная многомерная матрица int16 преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

uint16

Действительная матрица uint16 1 на 1 преобразовывает в VARIANT типа VT_UI2. Комплексная матрица uint16 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Действительная многомерная матрица uint16 преобразовывает в VARIANT типа VT_UI2|VT_ARRAY. Комплексная многомерная матрица uint16 преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

int32

Матрица int32 1 на 1 преобразовывает в VARIANT типа VT_I4. Комплексная матрица int32 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Многомерная матрица int32 преобразовывает в VARIANT типа VT_I4|VT_ARRAY. Комплексная многомерная матрица int32 преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

uint32

Матрица uint32 1 на 1 преобразовывает в VARIANT типа VT_UI4. Комплексная матрица uint32 1 на 1 преобразовывает в VARIANT типа VT_DISPATCH.

Многомерная матрица uint32 преобразовывает в VARIANT типа VT_UI4|VT_ARRAY. Комплексная многомерная матрица uint32 преобразовывает в VARIANT типа VT_DISPATCH.

Комплексные массивы передаются и от скомпилированных функций MATLAB с помощью класса MWComplex.

Указатель на функцию

VT_EMPTY

VT_EMPTY

Не поддерживаемый

Класс Java®

VT_EMPTY

VT_EMPTY

Не поддерживаемый

Пользовательский класс

VT_EMPTY

VT_EMPTY

Не поддерживаемый

логический

VT_Bool

VT_Bool|VT_ARRAY

ВАРИАНТ COM к правилам преобразования MATLAB

Тип VARIANTТип данных MATLAB (Скалярные или данные массива)Комментарии
VT_EMPTY

Нет данных

Пустой массив создается.

VT_I1int8

VT_UI1uint8

VT_I2int16

VT_UI2uint16

VT_I4int32

VT_UI4uint32

VT_R4single

VT_R8double

VT_CYdouble

VT_BSTRchar

VARIANT типа VT_BSTR преобразовывает в 1 L MATLAB массив char, где L = длина строки, которая будет преобразована. VARIANT типа VT_BSTR|VT_ARRAY преобразовывает в массив ячеек MATLAB 1 L массивами char.

VT_ERRORint32

VT_DATEdouble

Даты VARIANT хранятся, как удваивает запуск в полночь 31 декабря 1899. Даты MATLAB хранятся, как удваивает запуск в 0/0/00 0:00:00. Поэтому дата VARIANT 0,0 карт к MATLAB числовая дата 693 960,0. даты VARIANT преобразованы в MATLAB двойные типы и постепенно увеличены 693 960,0.

Даты VARIANT могут быть опционально преобразованы в строки. Смотрите Флаги Преобразования Данных для получения дополнительной информации о приведении типа.

VT_INTint32

VT_UINTuint32

VT_DECIMALdouble

VT_BOOLlogical

VT_DISPATCHVaries

Указатели IDispatch* обработаны в контексте того, на что они указывают. Объекты должны поддерживаться типы с известной экстракцией данных и правилами преобразования, или представить типичное свойство Value, которое указывает на один тип VARIANT. Данные, извлеченные от объекта, преобразованы на основе правил для конкретного полученного VARIANT.

В настоящее время поддержка существует для объектов Excel® Range, а также типов MWStruct, MWComplex, MWSparse и MWArg. Смотрите Ссылочные Служебные Классы для получения информации о типах, чтобы использовать с COM-компонентами.

anything |VT_BYREFVaries

Указатели на любой из основных типов обрабатываются согласно правилам для того, на что они указывают. Получившийся массив MATLAB содержит глубокую копию значений.

anything |VT_ARRAYVaries

Многомерные массивы VARIANT преобразовывают в многомерные массивы MATLAB, каждый элемент, преобразованный согласно правилам для основных типов. Многомерные массивы VARIANT типа VT_VARIANT|VT_ARRAY преобразовывают в многомерные массивы ячеек, каждая ячейка, преобразованная согласно правилам для того определенного типа.

Флаги форматирования массивов

Компоненты имеют флаги, которые управляют, как данные массива отформатированы в обоих направлениях. Обычно необходимо разработать клиентский код, который совпадает с намеченными вводами и выводами функций MATLAB с соответствующими методами на скомпилированных COM-объектах, в соответствии с правилами, перечисленными в MATLAB к Правилам Преобразования COM VARIANT и COM VARIANT к Правилам Преобразования MATLAB. В некоторых случаях это не возможно, например, когда существующий код MATLAB используется в сочетании со сторонним продуктом как Excel.

Следующая таблица показывает флаги форматирования массивов.

Флаги форматирования массивов

Флаг Описание

InputArrayFormat

Задает правило форматирования массивов, использованное на входных массивах.
Входной массив является массивом VARIANT, созданным клиентом, отправленным как входной параметр в вызов метода на скомпилированном COM-объекте.

Допустимыми значениями для этого флага является mwArrayFormatAsIs, mwArrayFormatMatrix и mwArrayFormatCell.

mwArrayFormatAsIs передает неизменный массив.

mwArrayFormatMatrix (значение по умолчанию) форматы все массивы как матрицы. Когда вход VARIANT имеет тип VT_ARRAY | type, где type является любым числовым типом, этот флаг не имеет никакого эффекта. Когда вход VARIANT имеет тип VT_VARIANT|VT_ARRAY, VARIANT s в массиве исследован. Если они являются однозначными и гомогенными в типе, матрица MATLAB соответствующего типа производится вместо массива ячеек.

mwArrayFormatCell интерпретирует все массивы как массивы ячеек MATLAB.

InputArrayIndFlag

Устанавливает косвенный уровень входного массива, используемый с флагом InputArrayFormat (применимый только к вложенным массивам, т.е. массивам VARIANT VARIANT s, которые самим являются массивами). Значение по умолчанию для этого флага является нулем, который применяет флаг InputArrayFormat к наиболее удаленному массиву. Когда этот флаг больше, чем нуль, например, равен N, правило форматирования пытается применить себя к Энному уровню вложения.

OutputArrayFormat

Задает правило форматирования массивов, использованное на выходных массивах. Выходной массив является массивом MATLAB, созданным скомпилированным COM-объектом, отправленным как выходной параметр от вызова метода до клиента. Значения для этого флага, mwArrayFormatAsIs, mwArrayFormatMatrix, и mwArrayFormatCell, вызывают то же поведение как соответствующие флаговые значения InputArrayFormat.

OutputArrayIndFlag

(Применяется к вложенным массивам ячеек только.) Косвенный уровень выходного массива используется с флагом OutputArrayFormat. Этот флаг работает точно как InputArrayIndFlag.

AutoResizeOutput

(Применяется к областям значений Excel только.), Когда целевой вывод от вызова метода является областью значений ячеек в рабочем листе Excel и размере выходного массива и форме, не известен во время вызова, установите этот флаг на True изменять размер каждой области значений Excel, чтобы соответствовать выходному массиву.

TransposeOutput

Установите этот флаг на True транспонировать выходные аргументы. Полезный при вызове компонента от Excel, где функция MATLAB возвращает выходные параметры как векторы - строки, и вы хотите данные в столбцах.

Флаги преобразования данных

Компоненты MATLAB Compiler SDK содержат флаги, чтобы управлять преобразованием определенных типов VARIANT к типам MATLAB. Эти флаги следующие:

CoerceNumericToType

Этот флаг говорит преобразователю данных преобразовывать все числовые данные VARIANT в один определенный тип MATLAB. кодами типа VARIANT, затронутыми этим флагом, является VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_R4, VT_R8, VT_CY, VT_DECIMAL, VT_INT, VT_UINT, VT_ERROR, VT_BOOL и VT_DATE. Допустимыми значениями для этого флага является mwTypeDefault, mwTypeChar, mwTypeDouble, mwTypeSingle, mwTypeLogical, mwTypeInt8, mwTypeUint8, mwTypeInt16, mwTypeUint16, mwTypeInt32 и mwTypeUint32.

Значение по умолчанию для этого флага, mwTypeDefault, преобразовывает числовые данные согласно правилам, перечисленным в Преобразовании Данных.

InputDateFormat

Этот флаг говорит преобразователь данных, как преобразовать даты VARIANT в даты MATLAB. Допустимыми значениями для этого флага является mwDateFormatNumeric (значение по умолчанию) и mwDateFormatString. Значение по умолчанию преобразовывает даты VARIANT согласно правилу, перечисленному в Поддерживаемых Кодах Типа VARIANT. Флаг mwDateFormatString преобразовывает дату VARIANT в свое строковое представление. Этот флаг только влияет на код типа VARIANT VT_DATE.

OutputAsDate как булевская переменная

Этот флаг дает преобразователю данных команду обрабатывать выходной аргумент как дату. По умолчанию числовые даты, которые являются выходными параметрами от скомпилированных функций MATLAB, передаются как Double s, который должен быть постепенно уменьшен смещением даты COM (693960), а также принужден на даты COM. Установите этот флаг на True преобразовывать все выходные значения типа Double.

DateBias как долго

Этот флаг устанавливает смещение даты для выполнения COM к MATLAB числовые преобразования даты. Значение по умолчанию этого свойства 693960, который представляет различие между типом Date COM и MATLAB числовые даты. Этот флаг позволяет существующий код MATLAB, который уже выполняет шаг числовых дат 693 960, чтобы использоваться неизменный с компонентами. На даты процесса с таким кодом, набор это свойство к 0.