我正试图让几个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)
,即使包体中没有with
和use
,这些错误仍然存在。
我确定我错过了一些东西,可能是非常基本的东西,我真的很想知道那是什么。我试图解决的问题是火车需要来自火车站的信号才能离开,并且之后仍然能够告知其到达时间。
我正在使用最新的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;
答案 0 :(得分:2)
仅在一个方向使用limited with
,在另一个方向使用普通with
。
答案 1 :(得分:0)
将destination
的声明替换为
destination: access Stations.Station;
或用
替换有问题的行destination.all.Gogo(1);
我不知道这是编译错误还是正确行为;它看起来很可疑!
后来:我在comp.lang.ada上发布了一个更为简洁的例子,其中一位常驻专家同意这是一个bug;我会把它报告给AdaCore。