标签: gnat

阿达用字符串切片

我很长时间都在学习Ada的C++程序员.如果以下任何一种形式不好,请随时指出.我正在努力学习Ada做事的方法,但旧习惯很难打破(我想念Boost!)

我正在尝试加载包含整数,空格和字符串的文件.可能有更好的方法来做到这一点,但我认为我应该将该行加载到一个字符串缓冲区,我知道它不会超过80个字符.我在适当的地方声明了如下的缓冲区变量:

 Line_Buffer : String(1..80);
Run Code Online (Sandbox Code Playgroud)

打开文件后,我遍历每一行并在空格字符处拆分缓冲区:

 while not Ada.Text_IO.End_Of_File(File_Handle) loop
   Ada.Text_IO.Get_Line(File_Handle, Item=>Line_Buffer, Last=>Last);
   -- Break line at space to get match id and entry
   for String_Index in Line_Buffer'Range loop
     if Line_Buffer(String_Index) = ' ' then
       Add_Entry(Root_Link=>Root_Node,
        ID_String=> Line_Buffer(1..String_Index-1),
        Entry_String=> Line_Buffer(String_Index+1..Last-1)
        );
     end if;
   end loop;
 end loop;
Run Code Online (Sandbox Code Playgroud)

Add_Entry中发生的事情并不重要,但其规范如下所示:

 procedure Add_Entry(
   Root_Link : in out Link;
   ID_String : in String;
   Entry_String : in String);
Run Code Online (Sandbox Code Playgroud)

我想使用无界字符串而不是有界字符串,因为我不想担心必须在这里和那里指定大小.这编译并正常工作,但在Add_Entry中,当我尝试遍历Entry_String中的每个字符时,而不是从1开始的索引,它们从原始字符串中的偏移量开始.例如,如果Line_Buffer为"14 silicon",如果我循环如下,则索引从4到10.

for Index in Entry_String'Range loop
  Ada.Text_IO.Put("Index: " & Integer'Image(Index));
  Ada.Text_IO.New_Line;  
end loop;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来进行这种解析,以便传递给Add_Entry的字符串具有以1开头的边界?另外,当我将切片字符串作为"in"参数传递给过程时,是在堆栈上创建的副本,还是对所用原始字符串的引用?

ada gnat

3
推荐指数
2
解决办法
4084
查看次数

Ada GPS IDE似乎无法找到GtkAda

我已经安装了GNAT Programming Studio(GPS)和GtkAda.它们似乎都运行良好,但是当我尝试在模板的New Project下构建Simple Window项目时,我收到一堆错误,说"找不到文件gtk.ads".这似乎是一个目录/依赖类问题--GPS不知道在哪里寻找GtkAda.我正在运行Windows 7,并在C:\ GNAT\2011安装了GPS,并在C:\ GtkAda安装了GtkAda.我尝试将GtkAda添加到我的PATH中; 目前我的PATH用户变量包含C:\ GNAT\2011\bin,而我的Path System变量包含C:\ GtkAda\bin.任何有关解决此问题的建议都非常感谢!

ide dependencies path ada gnat

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

如何在使用XS的Perl程序中使用Ada模块?

我最近开始学习Ada,并且知道Ada和C对象文件可以链接在一起构建一个多语言程序或库,是否可以使用XS从Perl调用Ada代码?

perl gcc ada xs gnat

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

评估GNAT 2012中裸机的内存使用情况

我已经安装了GNAT 2012 for Bare Boards并调整了为STM32F4XX(发现板)发布的sfp运行时(ravenscar配置文件),以将其用于STM32F2XX微控制器.修改后的SFP运行时工作,它已经与应用程序,库和一些驱动程序集成:UART,SPI和DMA也用Ada编写,它工作正常.

唯一的问题是编译器已开始抱怨SRAM.更具体地说,".bss"部分被"x"个字节溢出.

为了公平比较,我们有一个类似的项目(应用程序,库和驱动程序)用C语言在相同的微控制器上运行,我们可以看到(内存映射)内存使用率几乎是内存的一半(STM32F2XX:128 Kb RAM) .所以我想知道ADA是否需要比C运行更多的内存是否正常?

提前感谢您的意见!:)

memory ada bare-metal gnat

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

比较标记类型

在Java中,人们会使用它instanceof来检查对象是否与另一个对象属于同一类型(或类范围类型).例如,如果我们有类Peach和一个对象peach,它将通过以下内容:

if (peach instanceof Peach)
    System.out.println("peach is of type Peach!");
Run Code Online (Sandbox Code Playgroud)

...将上述语句执行到终端.

从我记忆中来看,在Ada中,有一些东西是这样的is in,因为某些对象在某个类的范围内.但是,出于这个问题的目的,我似乎无法找到有关该主题的信息.上次我使用它is in,我无法让它工作.因此,我决定在这里提出问题.

关于如何以类似于Java的方式完成标记类型的比较的任何指针instanceof都将非常有用!

ada gnat

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

GPRBuild无法编译C文件

我升级到了GNAT社区2018(GNAT GPL 2017一切正常。)我有这个项目文件:

with "opengl";

library project OpenGL.Soil is
   for Library_Name use "SoilAda";

   for Languages use ("ada", "c");

   for Source_Dirs use ("src/soil");

   -- snip compiler config
end OpenGL.Soil;
Run Code Online (Sandbox Code Playgroud)

现在src/soil,中有两个.ads.adb文件以及.h.c文件。以前,该项目文件编译了所有文件,并将它们链接在一起就可以了。从GNAT Community 2018开始,此文件仅编译Ada源,而不编译C源。

我尝试过的事情:

  • 确保GNAT社区随附的GCC仍支持编译C。是的。
  • 明确定义了Naming程序包设置,Spec_SuffixImplementation_Suffix为C指定了相应的文件结尾。
  • 明确指定Source_Files并将所有Ada和C文件放入其中。

无论我做什么,GPRBuild在调用时都不会编译C文件(导致链接器错误)。即使明确指定了C文件,也没有错误或警告输出。

如何使GPRBuild再次编译C文件?

c ada gnat gprbuild

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

为什么在 JVM 下运行时,我的 Ada 共享库会出现“存储错误”

我们有一个由 GnatPro 19.2 编译的 Ada 共享库,我们通过 JNA 调用来调用它。

我们的应用程序在 windows 下运行良好。在 Linux 下移植时,应用程序随机崩溃并出现 Ada 异常:

storage error or erroneous memory access.
Run Code Online (Sandbox Code Playgroud)

使用 gdb 调试(附加进程)并没有多大帮助。我们得到各种 SIGSEGV,我们继续,一段时间后我们得到存储错误,没有可用的调用堆栈。

我们的共享库可以与 python 本机调用一起使用,没有任何问题。问题可能出在 Java 方面。

尝试切换 JVM(openjdk 或官方 jdk)但没有运气。

为什么是这样?有没有办法解决它?

java linux ada segmentation-fault gnat

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

gpr 文件,不包括源中的所有目录

有我的 project.gpr 文件:

project Test is
    Project_Source_Dirs := ("Dir1")
      & ("src")
      & ("../../lib_all");
    for Object_Dir is "lib";
    for Main use ("Main_file.adb");
    for Languages use ("Ada");

    for Source_Dirs use Project_Source_Dirs & project'Object_Dir;
    -- [...]
end Test;
Run Code Online (Sandbox Code Playgroud)

有我的“../../lib_all”文件夹:

lib_all
|- file1.adb
|- file1.ads
|- file2.adb
|- file2.ads
|- file3.adb
|- file3.ads
|- file4.adb
|- file4.ads
Run Code Online (Sandbox Code Playgroud)

我只想使用 file3,如何修改我的 .gpr 文件以便每次都不编译所有其他文件?

ada gnat

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

FreeRTOS + GNAT Ada 编译库

我有一个正在运行的带有 FreeRTOS 的 ARM CortexA9 板,我需要添加一个用 ADA 编写的旧的和大型的库。我已经成功生成了库并在代码中实现了它,但是我遇到了一些问题;

首先,FreeRTOS 允许以下哪些 RTS 配置文件?

  • zfp
  • Ravenscar_sfp
  • Ravenscar_full

ada freertos gnat

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

GNAT 社区版中没有 GNATtest?

当我尝试在 GNAT 2020 社区版(Windows 10 64 位)中生成单元测试时,出现缺少 gnattest 工具的错误:could not locate gnattest. 同样发生在 Ubuntu 20.04(在 WSL 中)和包 gnat-10: could not locate x86_64-linux-gnu-gnattest-10

GNATtest 不是 GNAT 2020 社区版的一部分,如 AdaCores 网站 ( https://www.adacore.com/gnatpro/comparison ) 上所示?

ada gnat

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

标签 统计

ada ×10

gnat ×10

bare-metal ×1

c ×1

dependencies ×1

freertos ×1

gcc ×1

gprbuild ×1

ide ×1

java ×1

linux ×1

memory ×1

path ×1

perl ×1

segmentation-fault ×1

xs ×1