在Ada中使用`limited with`来避免循环依赖

时间:2013-07-25 22:23:04

标签: ada

我正试图让几个task能够互相打电话,但我对这个limited with事情似乎不太好..

我有一个规范sctrain-trains.ads

limited with SCTrain.Stations;
with SCTrain.Travellers, SCTrain.Tracks, Ada.Strings.Unbounded;
use SCTrain.Travellers, SCTrain.Tracks, Ada.Strings.Unbounded;

package SCTrain.Trains is
   type my_station_access_t is access all Stations.Station;

   task type Train is
      entry Start(leaving: my_station_access_t; arriving: my_station_access_t);
   end Train;

end SCTrain.Trains;

及其.adb

with SCTrain.Stations;
use SCTrain.Stations;

package body SCTrain.Trains is

   task body Train is
      destination: my_station_access_t;
   begin
      accept Start(leaving: my_station_access_t; arriving: my_station_access_t) do
         destination := arriving;
      end Start;
      destination.Gogo(1);
   end Train;

end SCTrain.Trains;

我在文件中发现我一直在阅读with身体中的“循环”包将允许顺利执行,但显然我仍然有invalid prefix in selected component "destination",因为dereference must not be of an incomplete type (RM 3.10.1) ,即使包体中没有withuse,这些错误仍然存​​在。 我确定我错过了一些东西,可能是非常基本的东西,我真的很想知道那是什么。我试图解决的问题是火车需要来自火车站的信号才能离开,并且之后仍然能够告知其到达时间。

我正在使用最新的GNAT-GPL。

非常感谢。

编辑:添加Station的代码

limited with SCTrain.Trains;
with Ada.Calendar, Ada.Strings.Unbounded, Ada.Text_IO;
use Ada.Calendar, Ada.Strings.Unbounded, Ada.Text_IO;

package SCTrain.Stations is

   task type Station is
      entry Gogo(name_d : Integer := 0);
   end Station;

end SCTrain.Stations;

和身体:

with SCTrain.Trains;
use SCTrain.Trains;

package body SCTrain.Stations is
   task body Station is
      name  : Integer;
   begin
      accept Gogo (name_d : Integer := 0) do
         name := name_d;
         Put_Line("Station " & Integer'Image(name) & " is alive");
      end Gogo;
   end Station;

end SCTrain.Stations;

2 个答案:

答案 0 :(得分:2)

仅在一个方向使用limited with,在另一个方向使用普通with

答案 1 :(得分:0)

destination的声明替换为

destination: access Stations.Station;

或用

替换有问题的行
destination.all.Gogo(1);

我不知道这是编译错误还是正确行为;它看起来很可疑!

后来:我在comp.lang.ada上发布了一个更为简洁的例子,其中一位常驻专家同意这是一个bug;我会把它报告给AdaCore。