【问题标题】:(CAPL) how i assign array length by using parameter(CAPL)我如何使用参数分配数组长度
【发布时间】:2020-12-29 07:32:38
【问题描述】:
void func(int a){
    byte arr[a];
}

此代码不起作用。如何使用参数分配数组长度?

【问题讨论】:

  • 根据我的经验,在函数内部声明任何类型的变量都会在 CAPL 中遇到麻烦。如果您想要更积极的反馈,edit 您的问题可以解释 为什么 它不起作用。它是否返回错误?它是否以您不希望它起作用的方式起作用?

标签: vector capl


【解决方案1】:

在 CAPL 中,您有很多选择,但首先您必须考虑您可能想退后一步,问问自己是否真的在运行时需要可变数组大小。测量性能是您应该关注的,将合适的数组大小声明为设计可能是一种更安全的方法。

参数大小的全局数组可能是这样的:

variables
{
    int arraySize = 256;
    byte arr[arraySize];
}

来自文档,

在 CAPL 中允许声明数组(数组、向量、矩阵)。它们的使用和初始化方式类似于 C 语言。

在 C 中,数组大小是恒定的:

Array 是一种由具有特定元素类型的连续分配的非空对象序列组成的类型。这些对象的数量(数组大小)在数组生命周期内永远不会改变。 [source]

这就是您的代码不起作用的原因:您无法创建基于运行时大小的数组。同样,来自同一来源

变长数组

如果表达式不是整数常量 表达式,声明符用于可变大小的数组。

每次控制流通过声明,表达式 被评估(并且它必须始终评估为大于 零),并分配数组(相应地,VLA 的生命周期 当声明超出范围时结束)。每个 VLA 的大小 实例在其生命周期内不会改变,但在另一个传递中 相同的代码,它可能被分配不同的大小。

这就是为什么您应该能够像我向您展示的那样定义参数数组。即使代码中的arraySize 应该改变,arr 将有 256 个元素用于执行您的 CAPL 脚本。

void func(int a){
    byte arr[a];
}

会抛出错误,因为int a被确定为非恒定时间,因此违反了上述要求。您可以做的是将较大数组的memcpy 部分放到选择的位置,例如较小的数组,或者使用您在 CAPL 脚本中经常看到的许多“缓冲区”数组。

当我把它带回家时,它的要点是:使用更大尺寸的数组,并准确说明将信息放入其中的位置。请注意,您必须准确,因为数组中的每个元素都包含某种数据,在初始化时大部分数据都是无意义的,并且没有针对这种数字噪声的保护措施。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2013-05-16
    • 2013-01-28
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多