Arrays Promela:将数组传递给新proctype
我需要在Promela中将一个数组从父进程传递到子进程,但它不允许我这样做。另外,我在使这个数组成为全局数组时有一些限制,所以也不能这样做。如何做到这一点 例如:Arrays Promela:将数组传递给新proctype,arrays,promela,spin,Arrays,Promela,Spin,我需要在Promela中将一个数组从父进程传递到子进程,但它不允许我这样做。另外,我在使这个数组成为全局数组时有一些限制,所以也不能这样做。如何做到这一点 例如: proctypeb(int-hg) { .. } proctype A() { int-hg[n]; 运行B(hg); } 的文档说明: 说明运行运算符将 以前声明的proctype,以及可能为空的实际 参数,这些参数必须与正式文件的数量和类型匹配 该类型的参数。[……] 运行操作员必须将实际参数值传递给新流程, 如果proctype
proctypeb(int-hg)
{
..
}
proctype A()
{
int-hg[n];
运行B(hg);
}
的文档说明:
说明运行运算符将
以前声明的proctype,以及可能为空的实际
参数,这些参数必须与正式文件的数量和类型匹配
该类型的参数。[……]
运行操作员必须将实际参数值传递给新流程,
如果proctype声明指定了一个非空的形式参数
名单只能使用消息通道和基本数据类型的实例
无法作为参数传递。无法传递变量数组。
[重点是我的]
您应该考虑使用<强>全局< /强>变量。
在下面的示例中,我们将数组与进程可能需要的任何其他参数一起封装在一个内,并声明此类记录的全局向量。然后,我们交换包含其他进程参数的记录的索引,而不是直接传递
参数数组
#定义m 10
#定义n10
typedef记录{
int-hg[n];
// ...
//其他参数
// ...
};
记录数据[m];
活动proctype A()
{
int-idx=1;
数据[idx].hg[0]=12;
// ...
运行B(idx);
}
程序类型B(int idx)
{
断言(数据[idx].hg[0]==12);
数据[idx].hg[0]=17;
// ...
}
这将允许您生成验证器:
~$ spin -search -bfs test.pml
...
State-vector 424 byte, depth reached 6, errors: 0
...
~$ spin -search -bfs test.pml
spin: test.pml:18, Error: hidden array in parameter data
或者,并且只有在不需要生成验证器的情况下,才可以简单地传递记录实例例如
#定义n 10
typedef记录{
int-hg[n];
// ...
//其他参数
// ...
};
活动proctype A()
{
记录我的记录;
my_record.hg[0]=12;
// ...
运行B(我的记录);
}
程序类型B(记录数据)
{
断言(data.hg[0]==12);
数据hg[0]=17;
// ...
}
但是,此仅在模拟模式下工作,特别是它将不允许您生成验证器:
~$ spin -search -bfs test.pml
...
State-vector 424 byte, depth reached 6, errors: 0
...
~$ spin -search -bfs test.pml
spin: test.pml:18, Error: hidden array in parameter data
事实上,文件中明确提到
typedef对象也可以用作run语句中的参数,但在本例中,它可能不包含任何数组
[重点是我的]
谢谢你的帮助,但还有一个问题。如果我们在typedef中使用数组,然后使用“spin my_file.pml”运行我们的文件,它运行时不会出现任何错误,并根据需要给出结果。但是,当使用“spin-a my_file.pml”运行我们的文件以生成pan文件(用于验证)时,它抛出一个错误:参数@Carol中的隐藏数组谢谢您的报告,我更新了答案。