C 文件未检测覆盖范围,错误的 expr 节点类型



我正在使用 MATLAB 中的 legacy_code 工具来生成一些 S 函数,然后我希望 S 函数由 simulink 覆盖率工具箱进行分析。

我在这里也问,因为也许这是一个 C 问题,与 MATLAB 无关。

我将标志设置为 true 以在使用 legacy_code 工具生成 S 函数时使用覆盖率工具箱。

def.Options.supportCoverage = true;

但是我在编译时收到以下错误,我在窗口中使用 MATLAB 的 MinGW 64 位编译器。

"lib_control.c",第 254 行:错误:错误的 expr 节点类型(b:\matlab\polyspace\src\shared\cxx_front_end_kernel\edg\src\cp_gen_be.c,第 14084 行( 警告:由于以前的错误,文件"lib_control.c"未检测覆盖范围 In codeinstrum.internal.LCInstrumenter/instrumentAllFiles In codeinstrum.internal.SFcnInstrumenter/instrument In slcovmexImpl 在 slcovmex 中(第 48 行( 在遗产代码中。LCT/编译 在遗产代码中。LCT.legacyCodeImpl legacy_code(第 101 行( generate_sfun(第 70 行(

在 C 代码中,我有以下类型的函数:

void controller( int n_var,
double my_input,
double my_output )
{
double my_var[n_var];    
for ( int i=0; i<n_var; i++ )
{
my_output = my_input + my_var[i];
}
}

编译器抱怨这一行:

double my_var[n_var];

我是否必须做一些事情来声明这样的变量,以便它们可以包含在覆盖率分析中?

此错误是来自 MATLAB 还是文件检测的 C 错误?

如果我在没有覆盖标志的情况下编译,则没有问题,并且生成 S 函数时没有警告。

似乎您的代码由于问题而无法正常工作。 首先尝试像这样声明my_var

double *my_var = malloc(n_var * sizeof(double));
memset(my_var, 0, n_var * sizeof(double));

这是根据函数参数分配内存的正确方法。 还有一个问题。

my_output = my_input + my_var[i];

所以这是正确的解决方案。

*my_output = *my_input + my_var[i];

您将更改作为堆栈寄存器变量的参数值 在C语言中,参数保存在堆栈寄存器中,以便在函数结束后释放。 所以它不会反映任何变化

为此,您需要将变量指针作为参数发送

void controller( int n_var,
double *my_input,
double *my_output ) {
*my_output = ....; // like this
}

在呼叫者方面,您可以这样做。

double a, b;
controller(10, &a, &b);

希望这对你有帮助

最新更新