Main Content

coder.screener

确定函数是否适合代码生成

说明

示例

coder.screener(fcn) 分析 MATLAB® 入口函数 fcn 将不支持的函数和语言功能标识为代码生成合规性问题。代码生成合规性问题显示在就绪报告中。

如果 fcn 直接或间接调用不是 MathWorks® 函数的其他函数(MATLAB 内置函数和工具箱函数),coder.screener 将分析这些函数。它不分析 MathWorks 函数。

coder.screener 可能无法检测到所有代码生成问题。在某些情况下,coder.screener 可能会报告伪错误。

为了避免未检测到的代码生成问题和伪错误,在生成代码之前,请通过执行以下附加检查来验证您的 MATLAB 代码是否适合代码生成:

  • 在使用 coder.screener 之前,请修复代码分析器标识的问题。

  • 在使用 coder.screener 后,在生成 C/C++ 代码之前,通过生成和验证 MEX 函数,验证您的 MATLAB 代码是否适合代码生成。

coder.screener 函数生成的报告不涉及代码生成器视为外部函数的函数。这些函数的示例有 plotdispfigure。请参阅使用 MATLAB 引擎在 MATLAB Function 模块中执行函数调用

coder.screener(fcn,'-gpu') 分析 MATLAB 入口函数 fcn,以识别 GPU 代码生成不支持的函数和语言功能。

示例

coder.screener(fcn_1,...,fcn_n) 分析多个 MATLAB 入口函数。

示例

info = coder.screener(___) 返回 coder.ScreenerInfo 对象。此对象的属性包含代码生成就绪分析结果。使用 info 以编程方式访问代码生成就绪结果。有关属性列表,请参阅 coder.ScreenerInfo Properties (MATLAB Coder)

示例

全部折叠

coder.screener 函数会标识对代码生成不支持的函数的调用。它会检查入口函数 foo1foo1 调用的函数 foo2

编写 foo2 函数并将其保存在 foo2.m 文件中。

function [tf1,tf2] = foo2(source,target)
G = digraph(source,target);
tf1 = hascycles(G);
tf2 = isdag(G);
end

编写调用 foo2 的函数 foo1。将 foo1 保存在 foo1.m 文件中。

function [tf1,tf2] = foo1(source,target)
assert(numel(source)==numel(target))
[tf1,tf2] = foo2(source,target);
end

分析 foo1

coder.screener('foo1')

代码生成就绪报告显示不支持的 MATLAB 函数调用的摘要。报告的问题选项卡指示 foo2.m 包含一个对 isdag 函数的调用和一个对 hascycles 的调用,而代码生成不支持这些函数。

Screenshot of the code generation readiness tool with sample code and analysis results.

函数 foo2 调用两个不支持的 MATLAB 函数。要生成 MEX 函数,请修改代码以使用 coder.extrinsic (MATLAB Coder) 指令执行对 hascyclesisdag 外部函数的调用,然后重新运行代码生成就绪工具。

function [tf1,tf2] = foo2(source,target)
coder.extrinsic('hascycles','isdag');
G = digraph(source,target);
tf1 = hascycles(G);
tf2 = isdag(G);
end

对入口函数 foo1 重新运行 coder.screener

coder.screener('foo1')

报告不再指示代码生成不支持 hascyclesisdag 函数。为 foo1 生成 MEX 函数时,代码生成器会将这两个函数调度给 MATLAB 来执行。

您可以带可选输出参量调用 coder.screener 函数。如果您使用此语法,coder.screener 函数将返回 coder.ScreenerInfo 对象,其中包含您的 MATLAB 代码库的代码生成就绪分析结果。请参阅 coder.ScreenerInfo Properties (MATLAB Coder)

此示例使用在前面的示例中定义的文件 foo1.mfoo2.m。调用 coder.screener 函数:

info = coder.screener('foo1.m')
info = 

  ScreenerInfo with properties:

               Files: [2×1 coder.CodeFile]
            Messages: [2×1 coder.Message]
    UnsupportedCalls: [2×1 coder.CallSite]

    View Screener Report

要访问第一个不受支持调用的相关信息,请对 UnsupportedCalls 属性进行索引。

firstCall = info.UnsupportedCalls(1)
firstCall = 

  CallSite with properties:

    CalleeName: 'hascycles'
          File: [1×1 coder.CodeFile]
    StartIndex: 78
      EndIndex: 86

不受支持的调用为 hascycles,查看包含该调用的文件文本。

firstCall.File.Text
ans =

    'function [tf1,tf2] = foo2(source,target)
     G = digraph(source,target);
     tf1 = hascycles(G);
     tf2 = isdag(G);
     end
     '

要将整个代码生成就绪报告导出为 MATLAB 字符串,请使用 textReport 函数。

reportString = textReport(info)
reportString =

    'Code Generation Readiness (Text Report)
     =======================================
     
     2 Code generation readiness issues
     2 Unsupported functions
     2 Files analyzed
     
     Configuration
     =============
     
     Language: C/C++ (MATLAB Coder)
     
     Code Generation Issues
     ======================
     
     Unsupported function: digraph (2)
         - foo2.m (Line 3)
         - foo2.m (Line 4)
     
     '

coder.screener 函数标识代码生成不支持的 MATLAB 数据类型。

编写包含 MATLAB 日历持续时间数组数据类型的函数 myfun1

function out = myfun1(A)
out = calyears(A);
end

分析 myfun1

coder.screener('myfun1');

代码生成就绪报告表明代码生成不支持 calyears 数据类型。在生成代码之前,修复报告的问题。

输入参数

全部折叠

用于分析的 MATLAB 入口函数的名称。指定为字符向量或字符串标量。

示例: coder.screener('myfun');

数据类型: char | string

用于分析的 MATLAB 入口函数名称的以逗号分隔的列表。指定为字符向量或字符串标量。

示例: coder.screener('myfun1','myfun2');

数据类型: char | string

版本历史记录

在 R2012b 中推出