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

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

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

Примечание

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

Внимание

Следует иметь в виду, что служба IIS (Internet Information Service) обычно препятствует большей части автоматизации COM на базисный, что она может представлять угрозу безопасности. Поэтому XLSREAD и другие службы автоматизации могут отказать при обслуживании IIS, приводя к таким ошибкам, как object reference not set.

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

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

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

Примечание

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

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

Правила преобразования между COM см. в MATLAB в COM VARIANT Conversion Rules и COM VARIANT в MATLAB Conversion Rules VARIANTs и массивы MATLAB.

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

Код типа VARIANT
(C/C + +)
Тип C/C + +Код типа варианта (Visual Basic)Тип Visual BasicОпределение
VT_EMPTY-vbEmpty-

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

VT_I1char--

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

VT_UI1

неподписанные char

vbByteByte

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

VT_I2shortvbIntegerInteger

Двухбайтовое целое число со знаком

VT_UI2unsigned short--

Беззнаковое двухбайтовое целое число

VT_I4longvbLongLong

Подписанное четырехбайтовое целое число

VT_UI4unsigned long--

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

VT_R4floatvbSingleSingle

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

VT_R8doublevbDoubleDouble

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

VT_CYCY+vbCurrencyCurrency

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

VT_BSTRBSTR+vbStringString

Строковое значение

VT_ERRORSCODE+vbError-

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

VT_DATEDATE+vbDateDate

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

VT_INTint--

Целое число со знаком; эквивалентно типу int

VT_UINTunsigned int--

Беззнаковое целое число; эквивалентно типу unsigned int

VT_DECIMALDECIMAL+vbDecimal-

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

VT_BOOLVARIANT_BOOL+vbBooleanBoolean

Двухбайтовое логическое значение (0xFFFF = True; 0x0000 = Ложь)

VT_DISPATCHIDispatch*vbObjectObject

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

VT_VARIANTVARIANT+vbVariantVariant

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

< все >|VT_ARRAY   

Битовое объединение VT_ARRAY с любым базовым типом для объявления в виде массива

< все >|VT_BYREF   

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

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

Правила преобразования MATLAB в COM-варианты

Тип данных MATLABТИП ВАРИАНТА для скалярных данныхТИП ВАРИАНТА для данных массиваКомментарии
cell

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

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

structure

VT_DISPATCH

VT_DISPATCH

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

char

A 1 на 1 char матрица преобразуется в VARIANT типа VT_BSTR с длиной строки = 1.

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

Массивы строк не поддерживаются как char матрицы. Чтобы передать массив строк, используйте массив ячеек с 1-by-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. Комплексный метод 1 на 1 int8 матрица преобразуется в VARIANT типа VT_DISPATCH.

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

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

uint8

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

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

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

int16

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

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

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

uint16

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

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

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

int32

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

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

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

uint32

A 1 на 1 uint32 матрица преобразуется в VARIANT типа VT_UI4. Комплексный метод 1 на 1 uint32 матрица преобразуется в 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 VARIANT в правила преобразования MATLAB

ТИП ВАРИАНТАТип данных MATLAB (скалярные или массивные данные)Комментарии
VT_EMPTY

Н/Д

Создан пустой массив.

VT_I1int8

VT_UI1uint8

VT_I2int16

VT_UI2uint16

VT_I4int32

VT_UI4uint32

VT_R4single

VT_R8double

VT_CYdouble

VT_BSTRchar

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

VT_ERRORint32

VT_DATEdouble

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

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

VT_INTint32

VT_UINTuint32

VT_DECIMALdouble

VT_BOOLlogical

VT_DISPATCHVaries

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

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

anything|VT_BYREFVaries

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

anything|VT_ARRAYVaries

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

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

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

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

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

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

InputArrayFormat

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

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

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

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

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

InputArrayIndFlag

Устанавливает уровень опосредования входного массива, используемый с InputArrayFormat флаг (применяется только к вложенным массивам, т.е. VARIANT массивы VARIANTs, которые сами являются массивами). Значение по умолчанию для этого флага является нулем, что применяет InputArrayFormat флаг крайнему внешнему массиву. Когда этот флаг больше нуля, например, равен N, правило форматирования пытается применить себя к 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, преобразует числовые данные согласно правилам, перечисленным в Data Conversion.

InputDateFormat

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

OutputAsDate как логический

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

DateBias как длинный

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