exponenta event banner

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

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

В этом разделе описываются правила преобразования данных для 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 ® Visual Basic ® обеспечивает поддержку этого типа на родном языке. Определения и поддержку API для COM см. в документации по Microsoft Visual Studio ®VARIANTs. VARIANT переменные являются самоописанием и сохраняют код типа в качестве внутреннего поля структуры.

Примечание

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

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

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

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

Код типа VARIANT
(C/C + +)
Тип C/C + +Код типа варианта (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(четырехбайтовое целое число со знаком, представляющее код ошибки COM)

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 VARIANT

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

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

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

structure

VT_DISPATCH

VT_DISPATCH

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

char

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

А 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

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

Настоящая многомерность int8 матрица преобразуется в VARIANT типа VT_I1|VT_ARRAY.
Сложный многомерный int8 матрица преобразуется в VARIANT типа VT_DISPATCH.

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

uint8

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

Настоящая многомерность uint8 матрица преобразуется в VARIANT типа VT_UI1|VT_ARRAY. Сложный многомерный uint8 матрица преобразуется в VARIANT типа VT_DISPATCH.

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

int16

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

Настоящая многомерность int16 матрица преобразуется в VARIANT типа VT_I2|VT_ARRAY. Сложный многомерный int16 матрица преобразуется в VARIANT типа VT_DISPATCH.

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

uint16

Вещественный 1 за 1 uint16 матрица преобразуется в 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

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

OutputArrayFormat

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

OutputArrayIndFlag

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

AutoResizeOutput

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

TransposeOutput

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

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

Компоненты SDK компилятора MATLAB содержат флаги для управления преобразованием определенных 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, передаются как Doubles, которые должны быть уменьшены смещением даты COM (693960), а также принуждены к датам COM. Установить этот флаг в значение True преобразование всех выходных значений типа Double.

DateBias As Long

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