coder.ceval

Вызовите внешнюю функцию C/C++

Синтаксис

coder.ceval(cfun_name)
coder.ceval(cfun_name,cfun_arguments)
coder.ceval('-global',cfun_name)
coder.ceval('-global',cfun_name,cfun_arguments)
coder.ceval('-layout:rowMajor',cfun_name,cfun_arguments)
coder.ceval('-layout:columnMajor',cfun_name,cfun_arguments)
coder.ceval('-layout:any',cfun_name,cfun_arguments)
cfun_return = coder.ceval(___)

Описание

пример

coder.ceval(cfun_name) выполняет внешнюю функцию C/C++, заданную cfun_name. Задайте cfun_name во внешнем исходном файле C/C++ или библиотеке. Обеспечьте внешний источник, библиотеку и заголовочные файлы к генератору кода.

пример

coder.ceval(cfun_name,cfun_arguments) выполняет cfun_name с аргументами cfun_arguments. cfun_arguments является списком, разделенным запятыми входных параметров в порядке, которого требует cfun_name.

По умолчанию coder.ceval передает аргументы значением к функции C/C++ каждый раз, когда поддержки C/C++ передающие аргументы значением. Чтобы привести аргументы передачи coder.ceval ссылкой, используйте построения coder.ref, coder.rref и coder.wref. Если C/C++ не поддерживает передающие аргументы значением, например, если аргумент является массивом, coder.ceval передает аргументы ссылкой. Если вы не используете coder.ref, coder.rref или coder.wref, копия аргумента, может казаться, в сгенерированном коде осуществляет семантику MATLAB® для массивов.

пример

coder.ceval('-global',cfun_name) выполняет cfun_name и указывает, что cfun_name использует одну или несколько глобальных переменных MATLAB. Генератор кода может затем произвести код, который сопоставим с этим использованием глобальной переменной.

coder.ceval('-global',cfun_name,cfun_arguments) выполняет cfun_name с аргументами cfun_arguments и указывает, что cfun_name использует одну или несколько глобальных переменных MATLAB.

пример

coder.ceval('-layout:rowMajor',cfun_name,cfun_arguments) выполняет cfun_name с аргументами cfun_arguments и передает данные, хранившие в главном строкой размещении. Когда названо от функции, которая использует главное столбцом размещение, генератор кода преобразовывает входные параметры в главное строкой размещение и преобразовывает выходные параметры назад в главное столбцом размещение. Для более короткого синтаксиса используйте coder.ceval('-row',...).

coder.ceval('-layout:columnMajor',cfun_name,cfun_arguments) выполняет cfun_name с аргументами cfun_arguments и передает данные, хранившие в главном столбцом размещении. Когда названо от функции, которая использует главное строкой размещение, генератор кода преобразовывает входные параметры в главное столбцом размещение и преобразовывает выходные параметры назад в главное строкой размещение. Для более короткого синтаксиса используйте coder.ceval('-col',...).

coder.ceval('-layout:any',cfun_name,cfun_arguments) выполняет cfun_name с аргументами cfun_arguments и передает данные с его размещением современного массива, даже когда размещения массивов не соответствуют. Генератор кода не преобразовывает размещение массивов данных ввода или вывода.

пример

cfun_return = coder.ceval(___) выполняет cfun_name и возвращает единственное скалярное значение, cfun_return, соответствуя значению, которое функция C/C++ возвращает в операторе return. Чтобы быть сопоставимым с C/C++, coder.ceval может возвратить только скалярное значение. Это не может возвратить массив. Используйте эту опцию с любыми комбинациями входных аргументов в предыдущих синтаксисах.

Примеры

свернуть все

Вызовите функцию C foo(u) от функции MATLAB, от которой вы намереваетесь сгенерировать код С.

Создайте заголовочный файл C foo.h для функционального foo, который берет два входных параметра типа double и возвращает значение типа double.

double foo(double in1, double in2);

Запишите функции C foo.c c.

#include <stdio.h>
#include <stdlib.h>
#include "foo.h"

double foo(double in1, double in2)
{
  return in1 + in2;
}

Запишите функциональный callfoo, который вызывает foo при помощи coder.ceval. Предоставьте исходные и заголовочные файлы генератору кода в функции.

function y = callfoo  %#codegen
y = 0.0;
if coder.target('MATLAB')
    % Executing in MATLAB, call MATLAB equivalent of
    % C function foo
    y = 10 + 20;
else
    % Executing in generated code, call C function foo
    coder.updateBuildInfo('addSourceFiles','foo.c');
    coder.cinclude('foo.h');
    y = coder.ceval('foo', 10, 20);
end
end

Сгенерируйте код библиотеки C для функционального callfoo. Функция codegen генерирует код С в подпапке \codegen\lib\callfoo.

codegen -config:lib callfoo -report

Вызовите библиотечную функцию C из кода MATLAB.

Запишите функции MATLAB myabsval.

function y = myabsval(u)   
%#codegen
y = abs(u);

Сгенерируйте статическую библиотеку C для myabsval, с помощью опции -args, чтобы задать размер, введите, и сложность входного параметра.

codegen -config:lib myabsval -args {0.0}
Функция codegen создает файл библиотеки myabsval.lib и заголовочный файл myabsval.h в папке \codegen\lib\myabsval. (Расширение файла библиотеки может измениться в зависимости от вашей платформы.) Это генерирует функции myabsval_initialize и myabsval_terminate в той же папке.

Запишите функцию MATLAB, чтобы вызвать сгенерированную библиотечную функцию C с помощью coder.ceval.

function y = callmyabsval(y)  
%#codegen
% Check the target. Do not use coder.ceval if callmyabsval is
% executing in MATLAB
if coder.target('MATLAB')
  % Executing in MATLAB, call function myabsval
  y = myabsval(y);
else
  % add the required include statements to generated function code
  coder.updateBuildInfo('addIncludePaths','$(START_DIR)\codegen\lib\myabsval');
  coder.cinclude('myabsval_initialize.h');
  coder.cinclude('myabsval.h');
  coder.cinclude('myabsval_terminate.h');

  % Executing in the generated code. 
  % Call the initialize function before calling the 
  % C function for the first time
  coder.ceval('myabsval_initialize');

  % Call the generated C library function myabsval
  y = coder.ceval('myabsval',y);
  
  % Call the terminate function after
  % calling the C function for the last time
  coder.ceval('myabsval_terminate');
end

Сгенерируйте MEX-функцию callmyabsval_mex. Обеспечьте сгенерированный файл библиотеки в командной строке.

codegen -config:mex callmyabsval codegen\lib\myabsval\myabsval.lib -args {-2.75}

Вместо того, чтобы обеспечивать библиотеку в командной строке, можно использовать coder.updateBuildInfo, чтобы задать библиотеку в функции. Используйте эту опцию, чтобы предварительно сконфигурировать сборку. Добавьте эту строку к блоку else:

coder.updateBuildInfo('addLinkObjects','myabsval.lib','$(START_DIR)\codegen\lib\myabsval',100,true,true);

Запустите MEX-функцию callmyabsval_mex, который вызывает библиотечную функцию myabsval.

callmyabsval_mex(-2.75)
ans =

    2.7500

Вызовите функцию MATLAB callmyabsval.

callmyabsval(-2.75)
ans =

    2.7500
Функция callmyabsval показывает желаемое поведение для выполнения в MATLAB и в генерации кода.

Используйте флаг '-global', когда вы вызываете функцию C, которая изменяет глобальную переменную.

Запишите функции MATLAB useGlobal, который вызывает функцию C addGlobal. Используйте флаг '-global', чтобы указать к генератору кода, что функция C использует глобальную переменную.

function y = useGlobal()
global g;
t = g;
% compare execution with/without '-global' flag
coder.ceval('-global','addGlobal'); 
y = t;
end

Создайте заголовочный файл C addGlobal.h для функционального addGlobal.

void addGlobal(void);

Напишите функции C addGlobal в файле addGlobal.c c. Эта функция включает заголовочный файл useGlobal_data.h, который создает генератор кода, когда вы генерируете код для функционального useGlobal. Этот заголовочный файл содержит объявление глобальной переменной для g.

#include "addGlobal.h"
#include "useGlobal_data.h"
void addGlobal(void) {
    g++;
}

Сгенерируйте MEX-функцию для useGlobal. Чтобы задать входной параметр к генератору кода, объявите глобальную переменную в рабочей области.

global g;
g = 1;
codegen useGlobal -report addGlobal.h addGlobal.c
y = useGlobal_mex();

С флагом '-global' MEX-функция приводит к результату y = 1. Флаг '-global' указывает к генератору кода, что функция C возможно изменяет глобальную переменную. Для useGlobal генератор кода производит этот код:

real_T useGlobal(const emlrtStack *sp)
{
  real_T y;
  (void)sp;
  y = g;
  addGlobal();
  return y;
}

Без флага '-global' MEX-функция производит y = 2. Поскольку нет никакой индикации, что функция C изменяет g, генератор кода принимает, что y и g идентичны. Этот код С сгенерирован:

real_T useGlobal(const emlrtStack *sp)
{
  (void)sp;
  addGlobal();
  return g;
}

Предположим, что у вас есть функция C testRM, который разработан, чтобы использовать главное строкой размещение. Вы хотите интегрировать эту функцию в функцию MATLAB bar, который работает с массивами. Функциональный bar разработан, чтобы использовать главное столбцом размещение, используя директиву coder.columnMajor.

function out = bar(in)
%#codegen
coder.columnMajor;
coder.ceval('-layout:rowMajor','testRM', ...
    coder.rref(in),coder.wref(out));
end

В сгенерированном коде генератор кода вставляет преобразование размещения от главного столбцом размещения до главного строкой размещения на переменном in прежде, чем передать его testRM. На выходной переменной out генератор кода вставляет преобразование размещения назад в главный столбцом.

В целом, если вы не задаете опцию layout для coder.ceval, внешние аргументы функции приняты, чтобы использовать главный столбцом.

Входные параметры

свернуть все

Имя внешнего C/C++ функционирует, чтобы вызвать.

Пример: coder.ceval ('нечто')

Типы данных: char | string

Список, разделенный запятыми входных параметров в порядке, которого требует cfun_name.

Пример: coder.ceval ('нечто', 10, 20);

Пример: coder.ceval ('MyFunction', coder.ref (x));

Типы данных: единственный | удваиваются | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический | char | struct
Поддержка комплексного числа: Да

Ограничения

  • Вы не можете использовать coder.ceval на функциях, которые вы объявляете внешний с coder.extrinsic.

  • Когда компилятор LCC создает библиотеку, он добавляет начальный символ подчеркивания к именам библиотечной функции. Если бы компилятор для библиотеки был LCC, и ваш компилятор генерации кода не является LCC, необходимо добавить начальный символ подчеркивания к имени функции, например, coder.ceval('_mylibfun'). Если компилятор для библиотеки не был LCC, вы не можете использовать LCC, чтобы сгенерировать код из кода MATLAB, который вызывает функции от той библиотеки. Те имена библиотечной функции не имеют начального символа подчеркивания, которого требует компилятор LCC.

  • Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является Системой object™ свойство с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для Some Properties.

Советы

  • Для генерации кода, прежде, чем вызвать coder.ceval, необходимо задать тип, размер и тип данных сложности возвращаемых значений и выходных аргументов.

  • Используйте coder.ceval только в MATLAB для генерации кода. coder.ceval генерирует ошибку в нескомпилированном коде MATLAB. Чтобы определить, выполняется ли функция MATLAB в MATLAB, используйте coder.target. Если функция выполняется в MATLAB, вызовите версию MATLAB функции C/C++.

Введенный в R2011a

Была ли эта тема полезной?