Передайте аргументы в общие функции библиотеки 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 (Окна®)

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). Обычно можно передать переменную из столбца Equivalent MATLAB Type в функции с соответствующим типом данных аргумента. Смотрите аргументы указателя в функциях C для получения информации о том, когда использовать lib.pointer вместо этого объект.

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

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

Функция , взятая в качестве примера, в
Shared Library shrlibsample

double *

doublePtr

doubleaddDoubleRef

float *

singlePtr

single 

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

(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 см. в разделе Sharibsample Общей библиотеки.

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

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

  • Если функция библиотеки использует индексацию одинарного индекса для ссылки на двумерную матрицу, имейте в виду, что 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 для автоматического преобразования типа.

См. также

| | |

Похожие примеры

Подробнее о