我是Ada编程语言的新手,我正在进行并发编程,但我遇到了一个实现的问题.这可能是一个非常虚拟的问题.代码是:
type status is array(1..6) of boolean; --boolean values for each track
track_available :status:=(others=>true); --true if track is available
protected track_handler is
entry track_req(n:in track_part_type); --n is track number
entry track_rel(n:in track_part_type); --n is track number
end track_handler;
protected body track_handler is
--implement entries
entry track_req(n: in track_part_type) when track_available(n) is --here where the error occurs
begin
req(n);
end track_req;
entry track_rel(n: in track_part_type) when track_available(n) is
begin
rel(n);
end track_rel;
end track_handler;
procedure req(nr : track_part_type) is
begin
--null; …Run Code Online (Sandbox Code Playgroud) 假设我有以下结构:
struct sampleData
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
在使用时,我想将sampleData类型的变量初始化为已知状态.
sampleData sample = { 1, 2 }
Run Code Online (Sandbox Code Playgroud)
后来,我决定我需要在我的sampleDatastruct中存储更多数据,如下所示:
struct sampleData
{
int x;
int y;
int z;
};
Run Code Online (Sandbox Code Playgroud)
我的理解是,从我的预z数据结构遗留下来的两个字段初始化仍然是一个有效的语句,并将被编译.使用默认值填充缺少的字段.
这种理解是否正确?我最近一直在Ada工作,它也允许聚合初始化,但是它会将类似的问题标记为编译错误.假设我对上面的C++代码的假设是正确的,是否有一种语言结构可以将缺少的初始化值识别为错误?
完全作为Ada类型系统学习练习,我试图制作3种类型(或者更确切地说,类型和2种子类型):
Month_Type,所有月份的列举Short_Month_Type,一个Month_Type只有30天的月份的子类型February_Month_Type,一个只有二月的子类型似乎子类型必须使用range机制,对吗?(还有其他类型的子类型吗?)为了让它与连续的范围一起工作,我必须Month_Type按以下顺序放置我的枚举:
type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);
Run Code Online (Sandbox Code Playgroud)
显然这不是几个月的自然顺序,我可以看到人们/我想要做什么Month_Type'First或者想要获得一月的东西.
所以,这个愚蠢的例子中有两个一般问题:
谢谢!
我已经定义了
subtype String10 is String(1..10);
Run Code Online (Sandbox Code Playgroud)
我试图获得键盘输入,而无需在输入之前手动输入空格.我尝试了get_line()但是由于某些原因它在输出get put()命令之前实际上不会等待输入,而且我也认为它会在那之前留下字符串中的内容并且不用空格填充它.
我知道并使用了Bounded_String和Unbounded_String,但我想知道是否有办法使这项工作.
我试过为它做一个函数:
--getString10--
procedure getString10(s : string10) is
c : character;
k : integer;
begin
for i in integer range 1..10 loop
get(c);
if Ada.Text_IO.End_Of_Line = false then
s(i) := c;
else
k := i;
exit;
end if;
end loop;
for i in integer range k..10 loop
s(i) := ' ';
end loop;
end getString10;
Run Code Online (Sandbox Code Playgroud)
但是,在这里,我知道这s(i)不起作用,我不认为
"if Ada.Text_IO.End_Of_Line = false then"
Run Code Online (Sandbox Code Playgroud)
做我希望它会做什么.它只是一个占位符,而我正在寻找实际的方法.
我一直在搜索几个小时,但是Ada文档不像其他语言那样可用或清晰.我找到了很多关于获取字符串的内容,但不是我正在寻找的内容.
通过阅读文档我已经理解,Ada实时模块与操作系统完全隔离.没有底层操作系统和资源管理器就可以实现并发.Ada处理任务调度,时间管理,任务状态转换,列表管理,任务优先级,锁定策略,调度策略,ISR,任务间通信等.
如果是这样,那么Ada实时模块是一种实时操作系统?
请原谅这个比较宽泛的问题。我想知道如何创建针对裸机x86的Ada工具链。我在osdev.org上看过Lucretia的Ada Bare Bones教程,该教程提供了一些有关为裸机开发构建合适的运行时的有用信息。这方面非常简单,但是我不确定如何为该平台构建交叉编译器,或者是否有必要。
我是否可以通过使用正确类型的RTS进行编译来创建“独立”二进制文件这一假设是否正确?如果我要创建/使用适当的独立式RTS,是否适合使用针对x86的现成的AdaCore或FSF GNAT?任何帮助理解这一点将不胜感激。
另一个帖子有这个引用
- Erlang VM BEAM和HiPE主要用C语言编写.
- 链接的驱动程序主要用C语言编写.(它们插入VM并与外界通信.)
我读过一些看法,认为Ada的强类型,模块化,运行时检查,并行处理等等都比C更好.
使用Ada编译的Erlang会比用C语言制作的Erlang更好还是更差?
只是一个假设的Q.
我想打印一个浮点数,我正在使用该包FLOAT_IO.
有没有办法控制点之后和之前的位数?
从Ada(95,2005)到C,是否有任何源到源转换器(转换器)?他们有多满(他们可以将Ada的每个功能转换为gnu c99 + pthreads + POSIX)吗?
是否可以在关键应用程序中使用这种ada-to-c转换器?
PS:C++的译员(最多2003年,扩展名为gnu)也受到欢迎.
PPS:当说"gnu c99"时,它仅表示支持C99 +大多数gnu扩展,但不代表GCC.
我需要将Ada程序中的2个数据传递给某些C++代码进行处理.
我能够使用Long_Float(C++中的double)和Integer(C++中的int,显然不是64位)在Ada中创建一个使用我的C++方法的过程.我使用了以下代码(代码不在我身上,因此语法可能稍微偏离):
procedure send_data (this : in hidden_ptr; data : in Long_Float; time : in Integer);
pragma import (CPP, send_data, "MyClass::sendData");
Run Code Online (Sandbox Code Playgroud)
现在,这是有效的,我正在尝试将时间扩展到完整的64位,并且理想情况下希望在C++端有一个无符号长整数.我没有在Ada中看到任何与之匹配的类型,因此我创建了自己的类型:
type U64 is mod 2 ** 64;
Run Code Online (Sandbox Code Playgroud)
当我的send_data方法使用该类型时,我得到一个错误,说没有可能的方法将该类型映射到C++类型(沿着这些行,同样没有代码或确切的错误短语在我身上).
有没有办法将Ada中的用户定义类型传递给C++?也许在Ada中有另一种类型我可以用作无符号的64位值吗?有没有办法将我的U64类型的地址作为参数传递给C++方法,如果这更容易?我正在使用绿山adamulti编译器v3.5(非常新的ada,不知道该信息是否有帮助).举例非常感谢!