我正在尝试将设备注册为枚举.从寄存器读取有2个值 - > 0表示完成,1表示待定.同样,写入寄存器有2个值 - > 0没有动作,1个复位.所以,我写了下面的代码
type Soft_Reset is (Done, Pending, No_Action, Reset);
for Soft_Reset use
(Done => 0,
Pending => 1,
No_Action => 0,
Reset => 1);
Run Code Online (Sandbox Code Playgroud)
但这会引发错误
gcc-4.6 -c -g -gnatg -ggdb -I- -gnatA /home/sid/tmp/device.adb
device.ads:93:20: enumeration value for "No_Action" not ordered
gnatmake: "/home/sid/tmp/device.adb" compilation error
Run Code Online (Sandbox Code Playgroud)
枚举是否可能具有重复值?
我是Ada的新手,我需要初始化一个包含空字符的字符串,我该怎么办呢?到目前为止,我可以使用空格初始化字符串,如下所示:
user_str : String(1..50) := (others => ' ');
Run Code Online (Sandbox Code Playgroud) 我在ADA中通过套接字发送标题时出现问题.这是代码:
Address.Addr := Addresses(Get_Host_By_Name(Host_Name), 1);
Address.Port := 80;
Create_Socket(Server);
Set_Socket_Option(Server, Socket_Level, (Reuse_Address, True));
Bind_Socket(Server, Address);
Listen_Socket(Server);
Accept_Socket(Server, Socket, Address);
Channel := Stream(Socket);
Receive_Socket(Socket, Data, Offset);
for I in 1 .. Offset loop
Append(Request, Character'Val(Data(I)));
end loop;
String'Output(Channel,
"HTTP/1.1 200 OK" & CRLF &
"Date: Fri, 09 Jan 2015 01:08:54 GMT" & CRLF & CRLF &
"something"
);
Run Code Online (Sandbox Code Playgroud)
我用作客户端Firefox浏览器.当我通过套接字读取GET请求时,这一切都很棒.当我尝试发送响应时,问题出现了.在引用代码的最后一行之后,我的浏览器只获得HTTP/0.9 200 OK(通过Live HTTP头检查)并且根本没有显示任何内容(这对我来说有点奇怪,因为我只是发送HTTP/1.1 200 OK).
真的很感激一点帮助.提前致谢 :)
我想在Ada把我的头围绕在OOP上.为了做到这一点,我需要了解如何使用gnatmake命名,编译和链接包文件.
这个网站(http://www.infres.enst.fr/~pautet/Ada95/chap22.htm)有很好的例子,但我不明白如何编译程序的各个部分.
我在看e_c22_p2.ada和e_c22_p3.ada.从这些文件中我创建了一个名为Conveyance1.ads的文件,并在其中添加了e_c22_p2的内容,以及一个名为Vehicle1.adb的文件,并在其中添加了e_c22_p3.ada的内容.我使用了gnatmake Vehicle1.adb,但是有编译错误.
e_c22_p2.ada包含:
-- Chapter 22 - Program 2
package Conveyance1 is
-- This is a very simple transportation type.
type TRANSPORT is
record
Wheels : INTEGER;
Weight : FLOAT;
end record;
procedure Set_Values(Vehicle_In : in out TRANSPORT;
Wheels_In : INTEGER;
Weight_In : FLOAT);
function Get_Wheels(Vehicle_In : TRANSPORT) return INTEGER;
function Get_Weight(Vehicle_In : TRANSPORT) return FLOAT;
-- This CAR type extends the functionality of the TRANSPORT type.
type CAR is new TRANSPORT;
function Tire_Loading(Vehicle_In : CAR) …Run Code Online (Sandbox Code Playgroud) 我有一个名为Linked_List(.ads)的包,下面是代码:
Generic
type T is private;
package Linked_List is
type List is tagged record
Data : T;
end record;
end Linked_List;
Run Code Online (Sandbox Code Playgroud)
这里是包中包含main函数(main.adb)的代码
with Ada.Text_IO; use Ada.Text_IO;
with Linked_List;
procedure Main is
type ListOfIntegers is new Linked_List(T => Integer);
begin
null;
end Main;
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
4:30 subtype mark required in this context
found "Linked_List" declared at linked_list.ads:3
found "Linked_List" declared at linked_list.ads:3
4:41 incorrect constrain for this kind of type
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
在Ada中初始化动态分配的数组的正确语法是什么?我试过这个:
type Short_Array is array (Natural range <>) of Short;
Items : access Short_Array;
Items := new Short_Array(1..UpperBound)'(others => 0);
Run Code Online (Sandbox Code Playgroud)
这导致编译器错误 - "二元运算符预期".还有这个:
type Short_Array is array (Natural range <>) of Short;
Items : access Short_Array;
Items := new Short_Array(1..UpperBound);
Items.all := (others => 0);
Run Code Online (Sandbox Code Playgroud)
这似乎令人惊讶地提升了一个SEGFAULT.不知道那里发生了什么,但想在我开始追逐我的尾巴之前得到正确的语法.
我有Windows 10 64bit,我安装了GNAT编程工作室(没有像java jdk那样设置).我想在GPS GNAT编程工作室制作我的第一个Ada程序.
基于此示例,以下是Arrayproject.adb:
with Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;
use Ada.Text_IO;
procedure Arrayproject is
type MyArray is array (1 .. 16) of Integer;
procedure put(s: MyArray) is
begin
for i in s'range loop
Put (s(i), Width =>4);
end loop;
new_line;
end put;
s: MyArray := (11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);
d: MyArray := s;
begin
put_Line ("Chunks of source Array");
put(s);
put_Line …Run Code Online (Sandbox Code Playgroud) 什么是libgnarl?我在各个地方找到了对它的引用,比如gcc源代码或gprbuild的详细输出.gprbuild专门报告决定是否libgnarl有必要,所以它显然是一个可选的库,但实际的库是什么?我找不到任何文件.这些源包含一堆看起来像属于标准库的包,但不是(喜欢Ada.Execution_Time.Timers),所以显然我缺少一些东西.
我有一个通用包:
generic
Size : Positive;
package Foo is
type Unbounded_Sized_Array is Array(1..Size) of Unbounded_String;
type My_Type is
record
My_Array : Unbounded_Sized_Array;
--other stuff
end record;
end Foo;
Run Code Online (Sandbox Code Playgroud)
我需要在另一个包中的包级别声明它:
package Bar is
package Dynamic_Foo is new Foo(Count);
--other stuff
end Bar;
Run Code Online (Sandbox Code Playgroud)
问题是我不知道Count是什么,直到我执行一些代码(它是给定目录中的文件数)并且我不确定如何推迟Dynamic_Foo的实例化直到完成之后.或者即使这是可以在Ada中完成的事情.我可以制作一个链表类型,但我真的不愿意,因为它的大小/长度应该在它启动后保持不变.
我不确定这是我的gcc(4.8.5)或gprbuild(2.2.0)版本中的错误,但是当我尝试编译项目时,有一个特定的函数,其主体导致编译器崩溃STORAGE_ERROR.当我构建时,-cargs -v我看到这gnatl -quiet ...是崩溃前最近输出的命令.
所讨论的函数从属于特定类型层次结构的标签产生信息性字符串.它看起来像:
function Tag_To_String (From : Ada.Tags.Tag) return String is (
if From = A'Tag then "This is tag A"
elsif From = B'Tag then "This is tag B"
-- ...
elsif From = Z'Tag then "This is tag Z"
else "");
Run Code Online (Sandbox Code Playgroud)
如果我将该主体更改为:我可以成功编译它:
function Tag_To_String (From : Ada.Tags.Tag) return String is ("");
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
gcc -c -gnat12 sourcefile.adb
raised STORAGE_ERROR : stack overflow or erroneous memory access
gprbuild: *** compilation phase failed …Run Code Online (Sandbox Code Playgroud)