我正在尝试在Ada
中实现一个受保护对象,该对象具有对其拥有的过程的引用。这是我的代码:
procedure sm is
type StateHandler is access procedure;
protected Motor is
private
procedure proc;
x : StateHandler := proc'Access;
end Motor;
protected body Motor is
procedure proc is
begin
Put_Line("HELLO WORLD");
end proc;
end Motor;
begin
Put_Line("ASD");
end sm;
我也试过Motor.proc'Access
。
当我尝试编译此代码时,我会收到以下错误:
sm.adb:18:29: subprogram "proc" has wrong convention
sm.adb:18:29: does not match "StateHandler" declared at line 11
sm.adb:18:29: probable missing pragma Convention for "StateHandler"
gnatmake: "sm.adb" compilation error
Makefile:3: recipe for target 'ADA' failed
make: *** [ADA] Error 4
我已经尝试了很多方法来解决它,但我无法解决。
答案 0 :(得分:6)
有趣的人!
“pragma convention”控制诸如过程的调用约定之类的内容,因此如果您与另一种语言接口,则可以在声明pragma Convention (C, proc);
之后添加proc
。这告诉编译器设置堆栈帧和参数来调用用C编写的过程(void函数)。有意义的是受保护的过程将具有与普通过程不同的调用约定,并通过非受保护的过程访问受保护的过程(可以这么说)访问类型可能会有问题......但就我而言,这就是问题。
我认为你需要阅读this page of the Annotated ARM ...“例如,将受保护程序的约定设置为Ada可能是错误的。但是,我们不是枚举所有这些情况,而是将其留给实现决定什么是明智的。“
不同的CPU对防护,锁和原子操作有不同的要求,因此这允许Ada实现允许相同的约定(并绕过此问题)用于有意义的目标。
该页面链接到AARM chapter 6.3.1,我们在其中看到“默认调用约定受保护的子程序受保护,以及访问子程序类型,其定义中保留字受保护。”与惯例Ada或Intrinsic(或C或Fortran)相反。非常透彻的作者在这里报道“访问程序”问题。
宾果游戏......
type StateHandler is access protected procedure;
这限制了StateHandler指向具有受保护过程的正确调用约定的过程,例如本例中的'proc'。
错误消息不是特别有用,除非您已经在其他上下文中处理了pragma convention
,这给了我足够的面包屑。