标签: gnat

具有重复值的Ada枚举

我正在尝试将设备注册为枚举.从寄存器读取有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)

枚举是否可能具有重复值?

enums ada gnat

1
推荐指数
2
解决办法
341
查看次数

在Ada中使用空字符初始化字符串

我是Ada的新手,我需要初始化一个包含空字符的字符串,我该怎么办呢?到目前为止,我可以使用空格初始化字符串,如下所示:

user_str : String(1..50) := (others => ' ');
Run Code Online (Sandbox Code Playgroud)

ada gnat

1
推荐指数
1
解决办法
3130
查看次数

Ada - 使用GNAT.Sockets发送HTTP响应

我在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).

真的很感激一点帮助.提前致谢 :)

sockets http ada http-headers gnat

1
推荐指数
1
解决办法
411
查看次数

阿达汇编混乱

我想在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)

ada gnat

1
推荐指数
1
解决办法
111
查看次数

无法理解泛型如何工作

我有一个名为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 gnat

1
推荐指数
1
解决办法
67
查看次数

用于初始化动态分配的数组的Ada语法

在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.不知道那里发生了什么,但想在我开始追逐我的尾巴之前得到正确的语法.

ada gnat

1
推荐指数
2
解决办法
303
查看次数

GNAT如何制作第一个数组ada程序,没有为此项目定义的语言

我有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)

ada gnat

1
推荐指数
1
解决办法
599
查看次数

什么是"libgnarl"?

什么是libgnarl?我在各个地方找到了对它的引用,比如gcc源代码或gprbuild的详细输出.gprbuild专门报告决定是否libgnarl有必要,所以它显然是一个可选的库,但实际的库是什么?我找不到任何文件.这些源包含一堆看起来像属于标准库的包,但不是(喜欢Ada.Execution_Time.Timers),所以显然我缺少一些东西.

ada gnat

1
推荐指数
1
解决办法
322
查看次数

Ada/Gnat - 包级动态泛型实例化

我有一个通用包:

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中完成的事情.我可以制作一个链表类型,但我真的不愿意,因为它的大小/长度应该在它启动后保持不变.

generics packages ada instantiation gnat

1
推荐指数
1
解决办法
144
查看次数

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)

gcc ada segmentation-fault gnat

1
推荐指数
1
解决办法
83
查看次数