メインコンテンツ

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"))
/*
 * File: callCosh.c
 *
 * MATLAB Coder version            : 26.1
 * C/C++ source code generated on  : 19-Apr-2026 03:44:03
 */

/* 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"))
/*
 * File: useCFileIO.c
 *
 * MATLAB Coder version            : 26.1
 * C/C++ source code generated on  : 19-Apr-2026 03:43:55
 */

/* 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"))
/*
 * File: addTwo.c
 *
 * MATLAB Coder version            : 26.1
 * C/C++ source code generated on  : 19-Apr-2026 03:44: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"))
//
// File: callGetValue.cpp
//
// MATLAB Coder version            : 26.1
// C/C++ source code generated on  : 19-Apr-2026 03:44:26
//

// 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]
//

カスタム C ライブラリまたはカスタム C++ ライブラリで定義されている C または C++ 関数を呼び出します。

カスタム C 関数の確認とオブジェクト ファイルの生成

フォルダー MyCCode で C 関数 timesTwo を確認します。この関数は、その入力引数に 2 を乗算します。mex 関数を使用して、timesTwo 関数のプラットフォーム固有のオブジェクト ファイルを作業ディレクトリに生成します。

type MyCCode/timesTwo.c
#include "timesTwo.h"

int timesTwo(int number) {
    return number * 2;
}
mex -c MyCCode/timesTwo.c
Building with 'gcc'.
MEX completed successfully.

カスタム C 関数を呼び出す MATLAB 関数の確認

MATLAB 関数 callTimesTwo を確認します。この関数は、coder.ceval を使用してカスタム C 関数 timesTwo() を呼び出します。

callTimesTwo 関数は、coder.updateBuildInfo (MATLAB Coder) を使用してインクルード パスに MyCCode フォルダーを追加します。coder.updateBuildInfo 関数の呼び出しにおいて、この関数は START_DIR マクロを使用して現在の作業フォルダーを参照します。このマクロは、コード生成用の MATLAB コードでのみ使用できます。オブジェクト ファイルはプラットフォーム固有の拡張子をもつため、この関数はispcを使用して、ご使用のプラットフォームに適したオブジェクト ファイルが含まれることを確認します。

type callTimesTwo.m
function out = callTimesTwo(x) %#codegen
arguments
    x (1,1) double
end
if coder.target("MATLAB")
    disp("Executing in MATLAB");
    out = 2*x;
else
    disp("Calling custom C function");
    out = 0;
    coder.updateBuildInfo("addIncludePaths","$(START_DIR)/MyCCode");
    if ispc
        coder.updateBuildInfo("addLinkObjects","timesTwo.obj", ...
            "$(START_DIR)/MyCCode","",true,true);
    else
        coder.updateBuildInfo("addLinkObjects","timesTwo.o", ...
            "$(START_DIR)","",true,true);
    end    
    out = coder.ceval("-headerfile","timesTwo.h","timesTwo",x);
end
end

MEX 関数の生成とテスト

callTimesTwo の MEX 関数を生成します。MATLAB と MEX 関数の結果が一致していることを確認するには、同じ入力引数を使用して callTimesTwocallTimesTwo_mex を実行します。

codegen callTimesTwo
Code generation successful.
callTimesTwo(2)
Executing in MATLAB
ans = 
4
callTimesTwo_mex(2)
Calling custom C function
ans = 
4

C コードの生成と検査

callTimesTwo のスタンドアロン C ライブラリを生成し、生成コードによって timesTwo C 関数が呼び出されることを確認します。

codegen -config:lib callTimesTwo
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","callTimesTwo","callTimesTwo.c"))
/*
 * File: callTimesTwo.c
 *
 * MATLAB Coder version            : 26.1
 * C/C++ source code generated on  : 19-Apr-2026 03:44:12
 */

/* Include Files */
#include "callTimesTwo.h"
#include "timesTwo.h"

/* Function Definitions */
/*
 * Arguments    : double x
 * Return Type  : double
 */
double callTimesTwo(double x)
{
  return timesTwo(x);
}

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

C および C++ プリプロセッサ マクロ (#define を使用して作成したものなど) では、コンパイル時の定数が指定されます。coder.opaque (MATLAB Coder)を使用して、カスタム C コードまたはカスタム C++ コードで定義したマクロを coder.ceval に渡すことができます。

C 関数の作成とマクロの定義

ステータス コードを入力引数として受け取り、システムのステータスを出力する ReportStatus という名前の C 関数を作成します。ステータス コードは、コンパイル時の定数です。ヘッダー ファイル StatusMacros.h でこれらのステータス コードを定義します。C 関数をファイル ReportStatus.c で定義し、ファイル ReportStatus.h で宣言します。

type StatusMacros.h
#define STATUS_OK       0
#define STATUS_ERROR    1
type ReportStatus.h
void ReportStatus(int statusCode);
type ReportStatus.c
#include <stdio.h>
#include "StatusMacros.h"

void ReportStatus(int statusCode){
    switch (statusCode) {
        case STATUS_OK:
            printf("Status: OK\n");
            break;
        case STATUS_ERROR:
            printf("Status: Error\n");
            break;
        default:
            printf("Status: Unknown\n");
            break;
    }
}

C マクロを使用する MATLAB 関数の作成

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

type assessStatus.m
function assessStatus(x)
if coder.target("MATLAB")
    disp("Unable to generate status in MATLAB");
else
    coder.cinclude("StatusMacros.h");
    if x > 0
        coder.ceval("-headerfile","ReportStatus.h","ReportStatus",coder.opaque("int","STATUS_OK"));
    else
        coder.ceval("-headerfile","ReportStatus.h","ReportStatus",coder.opaque("int","STATUS_ERROR"));
    end
    coder.updateBuildInfo("addSourceFiles","ReportStatus.c")
end

C コードの生成と検査

-config:lib オプションを指定した codegen コマンドを使用して、assessStatus のスタンドアロン C ライブラリを生成します。-args オプションを使用して、入力引数が double 型のスカラーであることを指定します。生成された C コードが ReportStatus 関数を呼び出し、事前定義されたマクロを入力引数として渡します。

codegen -config:lib assessStatus -args {0}
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
file = fullfile("codegen","lib","assessStatus","assessStatus.c");
coder.example.extractLines(file,"void assessStatus","/*",1,0)
void assessStatus(double x)
{
  if (x > 0.0) {
    ReportStatus(STATUS_OK);
  } else {
    ReportStatus(STATUS_ERROR);
  }
}

複素数入力を取るカスタム 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)を参照してください。

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

  • 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 で導入

すべて展開する