exponenta event banner

Передать аргументы в общие функции библиотеки C

Эквивалентные типы C и MATLAB

Интерфейс общей библиотеки поддерживает все стандартные скалярные типы C. В следующей таблице показаны типы C с эквивалентными типами MATLAB ®. MATLAB использует тип из правого столбца для аргументов, имеющих тип C, показанный в левом столбце.

Примечание

Все скалярные значения, возвращаемые MATLAB, имеют тип double.

Типы примитивов MATLAB

Тип CЭквивалентный тип MATLAB

char, byte

int8

unsigned char, byte

uint8

short

int16

unsigned short

uint16

int

int32

long (Windows ®)

int32,
long

long (Linux ®)

int64,
long

unsigned int

uint32

unsigned long (Windows)

uint32,
long

unsigned long (Linux)

uint64,
long

float

single

double

double

char *

char массив (1xn)

*char[]

массив ячеек символьных векторов

В следующей таблице показано, как MATLAB сопоставляет указатели C (столбец 1) с эквивалентной сигнатурой функции MATLAB (столбец 2). Обычно переменную можно передать из столбца Эквивалентный тип MATLAB в функции с соответствующим типом данных аргумента. См. раздел Аргументы указателя в функциях C для получения информации о том, когда использовать lib.pointer вместо этого объект.

Расширенные типы MATLAB

Тип указателя CАргумент
Тип данных
Эквивалентный
Тип MATLAB

Пример функции в
Образец shrlibsample общей библиотеки

double *

doublePtr

doubleaddDoubleRef

float *

singlePtr

single 

intsize * (целочисленные типы указателей)

(u)int(size)Ptr
Например, int64 * становится int64Ptr.

(u)int(size)multiplyShort

byte[]

int8Ptr

int8 

char[] (строка с нулевым окончанием передается значением)

cstring

char массив (1xn)

stringToUpper

char ** (массив указателей на строки)

stringPtrPtr

массив ячеек символьных векторов

 
enum

enumPtr

  

type **

typePtrPtr
Например, double **
становится doublePtrPtr.

lib.pointer объект

allocateStruct

void *

voidPtr

 deallocateStruct

void **

voidPtrPtr

lib.pointer объект

 

struct (Структура в стиле C)

structure

MATLAB struct

addStructFields

mxArray *

MATLAB array

Массив MATLAB

 

mxArray **

MATLAB arrayPtr

lib.pointer объект

 

Как MATLAB отображает сигнатуры функций

Ниже приведено описание входных и выходных аргументов, отображаемых в сигнатурах функций MATLAB.

  • Много аргументов (как int32 и double) похожи на свои аналоги C. В этих случаях передайте типы MATLAB, показанные для этих аргументов.

  • Некоторые аргументы C (например, **double, или предопределенные структуры), отличаются от стандартных типов MATLAB. В этих случаях либо передайте стандартный тип MATLAB и позвольте MATLAB преобразовать его для вас, либо преобразуйте данные самостоятельно с помощью функций MATLAB. libstruct и libpointer. Дополнительные сведения см. в разделе Преобразование данных, переданных функциям вручную.

  • Функции C часто возвращают данные во входных аргументах, передаваемых по ссылке. MATLAB создает дополнительные выходные аргументы для возврата этих значений. Входные аргументы, оканчивающиеся на Ptr или PtrPtr также перечислены как выходные данные.

Пример сигнатур функций MATLAB см. в разделе Shrlibsample общей библиотеки.

Рекомендации по передаче аргументов

  • Нескалярные аргументы должны быть объявлены как переданные по ссылке в функциях библиотеки.

  • Если функция библиотеки использует индексирование одного подстрочного индекса для ссылки на двумерную матрицу, помните, что программы C обрабатывают матрицы последовательно. MATLAB обрабатывает матрицы по столбцам. Чтобы получить поведение C из функции, транспонируйте входную матрицу перед вызовом функции, а затем транспонируйте вывод функции.

  • Используйте пустой массив, [], для передачи NULL для библиотечной функции, поддерживающей необязательные входные аргументы. Эта нотация действительна, только если аргумент объявлен как Ptr или PtrPtr как показано libfunctions или libfunctionsview.

Указатель NULL

Можно создать NULL чтобы передать функции библиотеки следующими способами:

  • Передача пустого массива [] в качестве аргумента.

  • Используйте libpointer функция:

    p = libpointer; % no arguments 
    p = libpointer('string') % string argument
    p = libpointer('cstring') % pointer to a string argument
  • Используйте libstruct функция:

    p = libstruct('structtype'); % structure type  

Пустой libstruct Объект

Создание пустого libstruct объект, вызов libstruct только с помощью structtype аргумент. Например:

sci = libstruct('c_struct')
get(sci)
    p1: 0
    p2: 0
    p3: 0

MATLAB отображает инициализированные значения.

Преобразование данных, переданных функциям вручную

В большинстве случаев программное обеспечение MATLAB автоматически преобразует данные, передаваемые во внешние библиотечные функции и из них, в тип, ожидаемый внешней функцией. Однако можно преобразовать данные аргумента вручную. Например:

  • При передаче одних и тех же данных в ряд библиотечных функций преобразуйте их вручную перед вызовом первой функции вместо автоматического преобразования MATLAB при каждом вызове. Эта стратегия сокращает количество ненужных операций копирования и преобразования.

  • При передаче больших структур следует экономить память путем создания структур MATLAB, соответствующих форме структур C, используемых в функции, вместо использования общих структур MATLAB. libstruct создает структуру MATLAB, смоделированную из структуры C, взятой из библиотеки.

  • Когда аргумент внешней функции использует более одного уровня ссылки (например, double **), передайте указатель, созданный с помощью libpointer вместо использования MATLAB для автоматического преобразования типа.

См. также

| | |

Связанные примеры

Подробнее