Ada中受保护对象内的访问类型

时间:2017-03-24 22:30:24

标签: ada

我正在尝试在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

我已经尝试了很多方法来解决它,但我无法解决。

1 个答案:

答案 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,这给了我足够的面包屑。