メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

coder.ceval

生成コードから C/C++ 関数を呼び出す

説明

out = coder.ceval(functionName,arg1,...,argN) は、生成されたコードから functionName で指定された C/C++ 関数を呼び出します。関数呼び出し内の呼び出される C/C++ 関数に 1 つ以上の入力引数を渡すことができます。呼び出された C/C++ 関数は、単一のスカラー出力を返すことができます。たとえば、入力 myChar と出力 isNum をもつ C 標準関数 isalnum を呼び出すには、isnum = coder.ceval("isalnum",myChar) を使用します。

C/C++ 関数によって返される出力の型は、コード生成時にコード ジェネレーターによって認識されないため、coder.ceval 呼び出しの前に、out の型を (ダミー値を代入するなどして) 指定する必要があります。非スカラー出力を保持する変数は、coder.ref (MATLAB Coder) または coder.wref (MATLAB Coder) を使用して、呼び出された C/C++ 関数に参照渡しすることができます。

C/C++ 標準関数を呼び出すには、coder.cinclude (MATLAB Coder) または coder.ceval"-headerfile" 引数を使用してヘッダー ファイルを指定する必要があります。カスタム C/C++ 関数を呼び出すには、ヘッダー ファイルの指定に加え、coder.updateBuildInfo (MATLAB Coder) を使用して外部ソース ファイルまたはライブラリも指定する必要があります。

関数 coder.ceval は、生成コードでのみ使用できます。MATLAB® の実行中に coder.ceval を呼び出すとエラーが発生します。MATLAB 関数が MATLAB で実行されているかどうかを判断するには、coder.target (MATLAB Coder) を使用します。

out = coder.ceval(options,functionName,arg1,...,argN) は、options 引数で指定されたオプションを使用して、生成されたコードから functionName で指定された C/C++ 関数を呼び出します。たとえば、C/C++ ヘッダー ファイルを指定するには "-headerfile" を使用し、呼び出される C/C++ 関数でグローバル変数を使用することを示すには "-global" を使用します。

すべて折りたたむ

coder.ceval を使用して、生成コードから C 標準ライブラリ関数 cosh() を呼び出します。

角度 (ラジアン単位) を表す double 型の入力を受け取り、C 関数 cosh() を使用してその角度の双曲線余弦を計算する MATLAB 関数 callCosh を作成します。coder.ceval を使用して cosh() を呼び出し、coder.cinclude を使用して cosh() が定義されている math.h ヘッダー ファイルを含めます。math.h を山かっこ <> で囲み、math.h が C 標準ヘッダー ファイルであることを示します。

coder.ceval 呼び出しによって返される出力の型はコード生成時には不明なため、型が以前の代入によって既に定義されている変数に出力を代入することで、coder.ceval 呼び出しの出力を既知の型に変換する必要があります。この事前の代入を行わないと、コード生成に失敗します。

MATLAB の実行中に coder.ceval を呼び出すとエラーが発生します。coder.target (MATLAB Coder)を使用して、coder.ceval 呼び出しの前に callCosh が生成コードで実行されていることを確認してください。

type callCosh.m
function out = callCosh(x)
arguments
    x (1,1) double
end
out = 0; % assign a dummy value to specify variable type
if coder.target("MATLAB")
    disp("This function not supported in MATLAB execution");
else
    coder.cinclude("<math.h>")
    out = coder.ceval("cosh",x);
end
end

MATLAB で callCosh をテストします。callCoshcoder.ceval を呼び出しません。

x = callCosh(1);
This function not supported in MATLAB execution

callCosh の MEX 関数を生成します。

codegen callCosh
Code generation successful.

角度 π ラジアンを使用して、生成された MEX 関数 callCosh_mex をテストします。callCosh は生成コードで実行されるため、coder.ceval の呼び出しでエラーは発生しません。

callCosh_mex(pi)
ans = 
11.5920

callCosh の C コードを生成し、生成コードを検査します。生成される C 関数には、cosh() の呼び出しが含まれます。

codegen -config:lib callCosh
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report
type(fullfile("codegen","lib","callCosh","callCosh.c"))
/*
 * Prerelease License - for engineering feedback and testing purposes
 * only. Not for sale.
 * File: callCosh.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 01-Feb-2025 08:01:58
 */

/* Include Files */
#include "callCosh.h"
#include <math.h>

/* Function Definitions */
/*
 * Arguments    : double x
 * Return Type  : double
 */
double callCosh(double x)
{
  /*  assign a dummy value to specify variable type */
  return cosh(x);
}

/*
 * File trailer for callCosh.c
 *
 * [EOF]
 */

coder.ceval を使用して生成コードから C 関数 fopen()fclose()、および fscanf() を呼び出し、これらの関数を使用してコンマ区切り値を含むテキスト ファイルの最初の行を読み取ります。これらの C 関数に相当する MATLAB 関数であるfopenfclose、およびfscanfが、コード生成でサポートされています。この例では、C ファイル I/O 関数を直接呼び出す方法を示します。

coder.ceval を使用して C ファイル I/O 関数 fopen()fclose()、および fscanf() を呼び出すことで、テキスト ファイル data.csv の最初の行を返す MATLAB 関数 useCFileIO を作成します。山かっこと共に coder.cinclude を使用して、C ファイル I/O 関数が定義されている C 標準ヘッダー ファイル stdio.h を生成コードに含めます。coder.opaque (MATLAB Coder)を使用して、ファイル ポインターを格納する変数を、初期値 NULL をもつ FILE * 型変数として初期化します。

coder.ceval は配列出力をサポートしていないため、coder.wref を使用して、出力変数 out を C 関数 fscanf() に参照渡しします。コード生成時には out の型が不明なため、coder.ceval 呼び出しの前にダミー値を使用してこの変数を初期化します。この代入を行わないと、コード生成に失敗します。coder.ceval を使用して呼び出される C/C++ 関数に MATLAB 文字ベクトルを渡すには、各文字ベクトルの終端を明示的に null 文字 (0) とする必要があります。詳細については、MATLAB 文字列および文字の行ベクトルからの C/C++ 文字列の生成 (MATLAB Coder)を参照してください。

MATLAB の実行中に coder.ceval を呼び出すとエラーが発生します。coder.target を使用して、coder.ceval 呼び出しの前に useCFileIO が生成コードで実行されていることを確認してください。

type useCFileIO.m
function out = useCFileIO %#codegen
fileName = 'data.csv';
if coder.target("MATLAB")
    fid = fopen(fileName);
    out = fscanf(fid, "%f,%f,%f",3);
    fclose(fid);
else
    coder.cinclude("<stdio.h>")
    fileName = [fileName 0];
    fileMode = ['r' 0];
    fileFormat = ['%lf,%lf,%lf' 0];
    fileHandle = coder.opaque("FILE*", "NULL");
    fileHandle = coder.ceval("fopen", fileName, fileMode);
    out = [0,0,0];
    coder.ceval("fscanf", fileHandle, fileFormat, ...
        coder.wref(out), coder.wref(out(2)), coder.wref(out(3)));
    coder.ceval("fclose", fileHandle);
end

useCFileIO の MEX 関数を生成してテストします。

codegen useCFileIO
Code generation successful.
out = useCFileIO_mex
out = 1×3

    0.7071    0.6690    0.5985

useCFileIO の C コードを生成し、生成コードを検査します。生成される C 関数は、fopen()fclose() および fscanf() を直接呼び出します。

codegen -config:lib -c useCFileIO
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report
type(fullfile("codegen","lib","useCFileIO","useCFileIO.c"))
/*
 * Prerelease License - for engineering feedback and testing purposes
 * only. Not for sale.
 * File: useCFileIO.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 01-Feb-2025 08:01:52
 */

/* Include Files */
#include "useCFileIO.h"
#include <stdio.h>

/* Function Definitions */
/*
 * Arguments    : double out[3]
 * Return Type  : void
 */
void useCFileIO(double out[3])
{
  static const char b_fileFormat[12] = "%lf,%lf,%lf";
  static const char b_fileName[9] = "data.csv";
  FILE *fileHandle;
  int i;
  char fileFormat[12];
  char fileName[9];
  for (i = 0; i < 9; i++) {
    fileName[i] = b_fileName[i];
  }
  char fileMode[2];
  fileMode[0] = 'r';
  fileMode[1] = '\x00';
  fileHandle = fopen(&fileName[0], &fileMode[0]);
  out[0] = 0.0;
  out[1] = 0.0;
  out[2] = 0.0;
  for (i = 0; i < 12; i++) {
    fileFormat[i] = b_fileFormat[i];
  }
  fscanf(fileHandle, &fileFormat[0], &out[0], &out[1], &out[2]);
  fclose(fileHandle);
}

/*
 * File trailer for useCFileIO.c
 *
 * [EOF]
 */

MATLAB 関数 addTwo からカスタム C 関数 myAdd() を呼び出します。

カスタム C 関数の作成

C ヘッダー ファイル myAdd.h を作成します。このヘッダー ファイルで、double 型の入力引数を 2 つ受け入れ、double 型の値を返す関数 myAdd() を宣言します。

type myAdd.h
double myAdd(double a, double b);

2 つの入力引数を加算する C 関数 myAdd() を作成します。関数を myAdd.c に保存して、ヘッダー ファイル myAdd.h を含めます。

type myAdd.c
#include <stdio.h>
#include <stdlib.h>
#include "myAdd.h"

double myAdd(double a, double b)
{
  return a + b;
}

カスタム C 関数を呼び出す MATLAB 関数の作成

coder.ceval を使用してカスタム C 関数 myAdd() を呼び出す MATLAB 関数 addTwo を作成します。C 関数 myAdd() を再現するローカル MATLAB 関数 myAddML を作成します。coder.target (MATLAB Coder)を使用して、addTwo が、MATLAB で実行される際にローカル MATLAB 関数 myAddML を呼び出し、生成コードで実行される際に C 関数 myAdd() を呼び出すことを確認します。coder.updateBuildInfo (MATLAB Coder)を使用して関数 myAdd() を含む C ファイルを検索する場所をコンパイラに伝え、"-headerfile" オプションを指定した coder.ceval を使用して myAdd.h ヘッダー ファイルを含めるようコード ジェネレーターに指示します。

type addTwo.m
function z = addTwo(x,y)  %#codegen
arguments
    x (1,1) double;
    y (1,1) double;
end
z = 0;
if coder.target("MATLAB")
    % Executing in MATLAB, call local MATLAB function
    z = myAddML(x,y);
else
    % Executing in generated code, call C function
    coder.updateBuildInfo("addSourceFiles","myAdd.c");
    z = coder.ceval("-headerfile","myAdd.h","myAdd",x,y);
end
end

function out = myAddML(a,b)
arguments
    a (1,1) double
    b (1,1) double
end
out = a + b;
end

MEX 関数の生成とテスト

addTwo の MEX 関数を生成し、addTwo_mex の出力が、同じ入力に対する addTwo の出力と一致することを確認します。

codegen addTwo
Code generation successful.
addTwo(4,5)
ans = 
9
addTwo_mex(4,5)
ans = 
9

C コードの生成と検査

-config:lib オプションを指定した codegen コマンドを使用して、コマンド ラインで addTwo からスタンドアロン C ライブラリとしてパッケージ化された C コードを生成します。生成される C コードには、C 関数 myAdd() への呼び出しとともに #include "myAdd.h" 命令が含まれます。

codegen -config:lib addTwo.m
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report
type(fullfile("codegen","lib","addTwo","addTwo.c"))
/*
 * Prerelease License - for engineering feedback and testing purposes
 * only. Not for sale.
 * File: addTwo.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 01-Feb-2025 08:02:19
 */

/* Include Files */
#include "addTwo.h"
#include "myAdd.h"

/* Function Definitions */
/*
 * Arguments    : double x
 *                double y
 * Return Type  : double
 */
double addTwo(double x, double y)
{
  /*  Executing in generated code, call C function */
  return myAdd(x, y);
}

/*
 * File trailer for addTwo.c
 *
 * [EOF]
 */

C++ では、メンバー関数 (メソッドとも呼ばれる) は特定のクラスまたはオブジェクトに関連付けられた関数です。coder.ceval を使用して、生成コードからカスタム C++ クラス MyClass のパブリック メソッドを呼び出します。

単純な C++ クラスの作成

この例の目的は、ファイル MyClass.hpp に C++ クラス MyClass を作成することです。このヘッダー ファイルで、定数値を返す関数 getValue() を定義します。

type MyClass.hpp
class MyClass {
   public:
    double getValue() const {
        return 3.14;
    }
};

生成コードからのメンバー関数の呼び出し

C++ メンバー関数 getValue() を呼び出す MATLAB 関数 callGetValue を作成します。coder.opaque (MATLAB Coder)を使用して、変数 instanceOfMyClass を C++ クラス MyClass のインスタンスとして宣言します。"HeaderFile" 引数を使用して、MyClass がヘッダー ファイル MyClass.hpp で定義されていることを示します。

coder.ceval を使用して生成コードから getValue() を呼び出すには、C++ 関数テンプレート std:mem_fn を使用して getValue() にアクセスします。この関数テンプレートは、C++ 標準ヘッダー <functional> で定義されています。coder.ref を使用して getValue()instanceOfMyClass を渡し、コード ジェネレーターにこの変数を値ではなく参照で渡すよう強制します。

type callGetValue.m
function out = callGetValue
instanceOfMyClass = coder.opaque("MyClass", "MyClass{}", "HeaderFile", "MyClass.hpp");
out = 0;
out = coder.ceval("-headerfile", "<functional>", ...
    "std::mem_fn(&MyClass::getValue)", coder.ref(instanceOfMyClass));
end

MEX 関数の生成とテスト

callGetValue の MEX 関数を生成し、MEX 関数で期待した出力が生成されることを確認します。C++ MEX 関数を生成するには、codegen コマンドで -lang:C++ を指定します。

codegen -lang:c++ callGetValue
Code generation successful.
callGetValue_mex
ans = 
3.1400

C++ コードの生成と検査

-config:lib オプションおよび -lang:c++ オプションを指定した codegen コマンドを使用して、コマンド ラインで callGetValue からスタンドアロン C++ ライブラリとしてパッケージ化された C++ コードを生成します。生成された C++ コードは MyClass のインスタンスを作成し、メンバー関数 getValue() を呼び出します。

codegen -config:lib -lang:c++ callGetValue
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report
type(fullfile("codegen","lib","callGetValue","callGetValue.cpp"))
//
// Prerelease License - for engineering feedback and testing purposes
// only. Not for sale.
// File: callGetValue.cpp
//
// MATLAB Coder version            : 25.1
// C/C++ source code generated on  : 01-Feb-2025 08:02:24
//

// Include Files
#include "callGetValue.h"
#include "MyClass.hpp"
#include <functional>

// Function Definitions
//
// Arguments    : void
// Return Type  : double
//
double callGetValue()
{
  MyClass instanceOfMyClass;
  instanceOfMyClass = MyClass{};
  return std::mem_fn(&MyClass::getValue)(&instanceOfMyClass);
}

//
// File trailer for callGetValue.cpp
//
// [EOF]
//

coder.ceval を使用して、カスタム C/C++ ライブラリで定義された C/C++ 関数を呼び出すことができます。これらの関数には、独自の初期化関数と終了関数をもつものがあります。

カスタム C 関数およびライブラリの作成

この例の目的は、区間 [min, max] における x2 の定積分を計算する MATLAB 関数 integrateSquare を作成することです。integrateSquare のスタンドアロン C ライブラリを生成します。

type integrateSquare.m
function out = integrateSquare(min,max)
arguments
    min (1,1) double
    max (1,1) double
end
f = @(x) x.^2;
out = integral(f, min, max);
end
codegen -config:lib integrateSquare
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report

codegen/lib/integrateSquare ディレクトリにある生成された C コードを検査します。同じディレクトリに、integrateSquare ライブラリとヘッダー ファイルに加え、関数 integrateSquare_initialize() および integrateSquare_terminate() の定義が含まれたファイルがあります。

type(fullfile("codegen","lib","integrateSquare","integrateSquare.c"))
/*
 * Prerelease License - for engineering feedback and testing purposes
 * only. Not for sale.
 * File: integrateSquare.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 01-Feb-2025 08:02:03
 */

/* Include Files */
#include "integrateSquare.h"
#include "integral.h"
#include "rt_nonfinite.h"

/* Function Definitions */
/*
 * Arguments    : double b_min
 *                double b_max
 * Return Type  : double
 */
double integrateSquare(double b_min, double b_max)
{
  return integral(b_min, b_max);
}

/*
 * File trailer for integrateSquare.c
 *
 * [EOF]
 */

カスタム C 関数を呼び出す MATLAB 関数の作成

coder.ceval を使用してカスタム C 関数 integrateSquare() を呼び出す MATLAB 関数 callIntegrateSquare を作成します。この例の目的は、integrateSquare() 呼び出しの前に関数 integrateSquare_initialize() を呼び出し、その後、関数 integrateSquare_terminate() を呼び出すことです。

coder.updateBuildInfo (MATLAB Coder)を使用して、integrateSquare() ライブラリおよびその他のファイルを含むディレクトリをインクルード パスに追加します。関数 coder.updateBuildInfo の呼び出しでは、START_DIR マクロを使用して現在の作業フォルダーを参照できます。このマクロは、コード生成用の MATLAB コードでのみ使用できます。MATLAB Coder はプラットフォーム固有の拡張子をもつスタティック ライブラリ ファイルを生成するため、ispcを使用して、ご使用のプラットフォームに適した拡張子を使用していることを確認してください。

type callIntegrateSquare.m
function out = callIntegrateSquare(x,y) %#codegen
arguments
    x (1,1) double
    y (1,1) double
end
if coder.target("MATLAB")
    disp("Calling MATLAB function");
    out = integrateSquare(x,y);
else
    disp("Calling custom C function");
    out = 0;
    coder.updateBuildInfo("addIncludePaths", ...
        "$(START_DIR)/codegen/lib/integrateSquare");
    if ispc
        coder.updateBuildInfo("addLinkObjects","integrateSquare.lib", ...
            "$(START_DIR)/codegen/lib/integrateSquare","",true,true); 
    else
        coder.updateBuildInfo("addLinkObjects","integrateSquare.a", ...
            "$(START_DIR)/codegen/lib/integrateSquare","",true,true); 
    end  
    coder.ceval("-headerfile","integrateSquare_initialize.h", ...
        "integrateSquare_initialize");
    out = coder.ceval("-headerfile","integrateSquare.h","integrateSquare", ...
        x,y);
    coder.ceval("-headerfile","integrateSquare_terminate.h", ...
        "integrateSquare_terminate");
end
end

MEX 関数の生成とテスト

callIntegrateSquare の MEX 関数を生成します。MATLAB と MEX 関数の結果が一致していることを確認します。

codegen callIntegrateSquare
Code generation successful.
callIntegrateSquare(-2,2)
Calling MATLAB function
ans = 
5.3333
callIntegrateSquare_mex(-2,2)
Calling custom C function
ans = 
5.3333

C コードの生成と検査

callIntegrateSquare のスタンドアロン C ライブラリを生成し、生成コード内の integrateSquare_initialize()integrateSquare()、および integrateSquare_terminate() の呼び出しを検査します。

codegen -config:lib callIntegrateSquare
Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
Embedded Coder is not installed, this might cause some Embedded Coder features
to fail.


Code generation successful (with warnings): View report
type(fullfile("codegen","lib","callIntegrateSquare","callIntegrateSquare.c"))
/*
 * Prerelease License - for engineering feedback and testing purposes
 * only. Not for sale.
 * File: callIntegrateSquare.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 01-Feb-2025 08:02:13
 */

/* Include Files */
#include "callIntegrateSquare.h"
#include "coder_platform.h"
#include "integrateSquare.h"
#include "integrateSquare_initialize.h"
#include "integrateSquare_terminate.h"

/* Function Definitions */
/*
 * Arguments    : double x
 *                double y
 * Return Type  : double
 */
double callIntegrateSquare(double x, double y)
{
  double out;
  coderIsPC();
  integrateSquare_initialize();
  out = integrateSquare(x, y);
  integrateSquare_terminate();
  return out;
}

/*
 * File trailer for callIntegrateSquare.c
 *
 * [EOF]
 */

複素数入力を取るカスタム C コードを呼び出す MATLAB 関数があるとします。MATLAB 関数からの複素数入力を C コードにマッピングできるように C コードの入力パラメーターを定義しなければなりません。

生成されたコードでは、複素数は reim の 2 つのフィールドをもつ struct として定義されます。これらのフィールドは、それぞれ複素数の実数部と虚数部です。この struct は、現在のパスの codegen\lib\functionName フォルダーにあるヘッダー ファイル rtwtypes.h で定義されます。struct は次のように定義されます。

typedef struct {
    real32_T re; /*Real Component*/
    real32_T im; /*Imaginary Component*/
} creal_T;

詳細については、生成コードの型への MATLAB 型のマッピング (MATLAB Coder)を参照してください。

統合する C コードには rtwtypes.h ヘッダー ファイルを含めなければなりません。C コード例 foo.c を次に示します。

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

double foo(creal_T x) {
    double z = 0.0;
    z = x.re*x.re + x.im*x.im;
    return (z);
}

struct の名前は creal_T です。ヘッダー ファイル foo.h も次のように定義しなければなりません。

#include "rtwtypes.h"
double foo(creal_T x);

MATLAB コードは、複素数入力をもつ関数 coder.ceval を使用して foo.c を実行します。

function y = complexCeval  %#codegen
y = 0.0;
coder.updateBuildInfo("addSourceFiles","foo.c");
coder.cinclude("foo.h");
y = coder.ceval("foo", 10+20i);
end
coder.ceval コマンドは複素数入力を取ります。コード ジェネレーターは、複素数を struct creal_T の変数 x とそのフィールド re および im にマッピングします。

次のコマンドを実行して関数 complexCeval のコードを生成します。

codegen -config:lib -report complexCeval

入力引数

すべて折りたたむ

生成コードで実行される C/C++ 関数の名前。string スカラーまたは文字ベクトルとして指定します。functionName はコード生成時に定数でなければなりません。

例: x = coder.ceval("myFunction")

例: coder.ceval("myFunction")

データ型: char | string

呼び出される C/C++ 関数の引数。文字ベクトル、配列、配列の要素、構造体、構造体フィールド、またはオブジェクト プロパティのコンマ区切りリストとして、関数に必要な順序で指定します。string スカラーおよび string 配列はサポートされません。

既定では、C/C++ が引数の値渡しをサポートするときはいつでも、coder.ceval は呼び出された C/C++ 関数に引数を値渡しします。coder.ceval に引数を参照渡しするよう強制するには、coder.ref (MATLAB Coder)coder.rref (MATLAB Coder)、および coder.wref (MATLAB Coder) 構成を使用します。引数が配列である場合など、C/C++ が引数の値渡しをサポートしない状況では、coder.ceval は引数を参照渡しします。coder.refcoder.rref、または coder.wref を使用しないと、C/C++ 関数の引数のコピーが生成コードに現れ、配列に対して MATLAB セマンティクスを強制する可能性があります。

例: x = coder.ceval("tolower",myChar)

例: coder.ceval("myFunction",coder.ref(x))

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | struct
複素数のサポート: あり

coder.ceval によって評価される C/C++ 関数呼び出しのオプション。オプション値またはオプション値のコンマ区切りリストとして指定します。関数 coder.ceval には複数のオプションを指定することができ、オプションは任意の順序で表記できます。すべてのオプション ("headerfile" を含む) は、コード生成時に定数でなければなりません。以下の表に、coder.ceval で使用できるオプションを示します。

オプション説明
"-global"coder.ceval によって呼び出される C/C++ 関数が、1 つ以上のグローバル変数を使用することを指定します。-global オプションを指定すると、呼び出される C/C++ 関数でのグローバル変数の使用を妨げる可能性のある特定のコード生成の最適化が抑制されます。
"-gpudevicefcn"coder.ceval によって呼び出される C/C++ 関数が GPU デバイス上にあることを指定します。このオプションを指定すると、カーネル内から CUDA® GPU 関数 __device__ を呼び出すことができます。このオプションには GPU Coder™ ライセンスが必要です。
"-headerfile","headerfile"

coder.ceval によって呼び出される C/C++ 関数が、ヘッダー ファイル headerfile で宣言されていることを指定します。コード ジェネレーターは、指定されたヘッダー ファイルの #include ステートメントを生成コードに追加します。関数 coder.cinclude (MATLAB Coder) を個別に呼び出す代わりに、coder.ceval"-headerfile" 引数を使用することができます。"-headerfile" オプションを使用する場合、ヘッダー ファイルは 1 つだけ指定できます。

C/C++ 標準ヘッダー ファイルを含めるには、ヘッダー ファイルの名前を山かっこ <> で囲みます。生成された #include ステートメントの形式は #include <headerfile> になります。標準ヘッダー ファイルは標準の場所またはインクルード パス上になければなりません。

coder.ceval("-headerfile","<math.h>","atan",45)

非標準ヘッダー ファイルを含めるには、山かっこを省略します。生成された #include ステートメントの形式は #include "headerfile" になります。非標準ヘッダー ファイルは現在のフォルダーまたはインクルード パス上になければなりません。

coder.ceval("-headerfile","myHeader","myFun")

インクルード パスを指定するには、addIncludePaths (MATLAB Coder) を使用します。

"-layout:any"配列のレイアウトが一致しない場合でも、データ レイアウトを変更せずに、生成コードと呼び出された C/C++ 関数間で入出力データを渡します。
"-layout:rowMajor" または "-row"生成コードと呼び出された C/C++ 関数間で、入出力データを行優先のレイアウトで渡します。列優先のレイアウトを使用する MATLAB 関数または MATLAB Function ブロックから呼び出されると、コード ジェネレーターは入力を行優先のレイアウトに変換し、出力を列優先のレイアウトに変換します。
"-layout:columnMajor" または "-col"生成コードと呼び出された C/C++ 関数間で、入出力データを列優先のレイアウトで渡します。行優先のレイアウトを使用する MATLAB 関数または MATLAB Function ブロックから呼び出されると、コード ジェネレーターは入力を列優先のレイアウトに変換し、出力を行優先のレイアウトに変換します。この動作は既定です。

例: coder.ceval("-headerfile","myHeader.h","-layout:rowMajor","-global","myFunction",coder.rref(in),coder.wref(out));

制限

  • coder.extrinsic (MATLAB Coder) を使用して外部関数として宣言した関数では、coder.ceval を使用することはできません。

  • プロパティに get メソッド、set メソッド、または検証関数がある場合、またはプロパティがプロパティ値を制約または変更する属性をもつ System object™ プロパティである場合、そのプロパティを外部関数に参照で渡すことはできません。一部のプロパティでサポートされない参照渡しを参照してください。

  • 可変サイズの行列は、行優先のコード生成ではエントリポイント パラメーターとしてサポートされていません。

  • MATLAB コードで初期化されている配列のサイズは、coder.ceval を使用して変更できません。

ヒント

  • ポインター、FILE 型のファイル I/O、C/C++ マクロなど、MATLAB コードに存在しない変数の型を受け入れるまたは返す C/C++ 関数の呼び出しに coder.ceval を使用するには、関数 coder.opaque を使用します。

  • coder.ceval を使用して呼び出される外部コードと生成コードは、同じプロセス内で実行され、メモリを共有します。生成コードで使用されるデータ構造体を含むメモリに外部コードが誤って書き込みを行うと、予期しない動作やクラッシュが生じる可能性があります。たとえば、外部コードが終点より後の配列にデータを書き込もうとすると、生成コードが予期しない動作をするか、クラッシュする可能性があります。

  • MATLAB は Windows® プラットフォームで UTF-8 をシステム エンコードとして使用します。その結果、生成された MEX 関数内から行われたシステム呼び出しは、UTF-8 でエンコードされた string を受け入れて返します。一方、MATLAB Coder™ で生成されたコードは、Windows ロケールで指定されたエンコードを使用してテキスト データを符号化します。このため、MATLAB のエントリポイント関数が coder.ceval (MATLAB Coder) を使用して異なるシステム エンコードを想定する外部 C/C++ 関数を呼び出すと、生成された MEX 関数から文字化けが発生する可能性があります。これが発生した場合は、外部 C/C++ 関数を更新する必要があります。

  • coder.ceval を使用して呼び出される C/C++ 関数に MATLAB 文字ベクトルを渡すには、各文字ベクトルの終端を明示的に null 文字 (0) とする必要があります。詳細については、MATLAB 文字列および文字の行ベクトルからの C/C++ 文字列の生成 (MATLAB Coder)を参照してください。

拡張機能

すべて展開する

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2011a で導入

すべて展開する