我很长时间都在学习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"参数传递给过程时,是在堆栈上创建的副本,还是对所用原始字符串的引用?
我已经安装了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.任何有关解决此问题的建议都非常感谢!
我最近开始学习Ada,并且知道Ada和C对象文件可以链接在一起构建一个多语言程序或库,是否可以使用XS从Perl调用Ada代码?
我已经安装了GNAT 2012 for Bare Boards并调整了为STM32F4XX(发现板)发布的sfp运行时(ravenscar配置文件),以将其用于STM32F2XX微控制器.修改后的SFP运行时工作,它已经与应用程序,库和一些驱动程序集成:UART,SPI和DMA也用Ada编写,它工作正常.
唯一的问题是编译器已开始抱怨SRAM.更具体地说,".bss"部分被"x"个字节溢出.
为了公平比较,我们有一个类似的项目(应用程序,库和驱动程序)用C语言在相同的微控制器上运行,我们可以看到(内存映射)内存使用率几乎是内存的一半(STM32F2XX:128 Kb RAM) .所以我想知道ADA是否需要比C运行更多的内存是否正常?
提前感谢您的意见!:)
在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
都将非常有用!
我升级到了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源。
我尝试过的事情:
Naming
程序包设置,Spec_Suffix
并Implementation_Suffix
为C指定了相应的文件结尾。Source_Files
并将所有Ada和C文件放入其中。无论我做什么,GPRBuild在调用时都不会编译C文件(导致链接器错误)。即使明确指定了C文件,也没有错误或警告输出。
如何使GPRBuild再次编译C文件?
我们有一个由 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)但没有运气。
为什么是这样?有没有办法解决它?
有我的 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 文件以便每次都不编译所有其他文件?
我有一个正在运行的带有 FreeRTOS 的 ARM CortexA9 板,我需要添加一个用 ADA 编写的旧的和大型的库。我已经成功生成了库并在代码中实现了它,但是我遇到了一些问题;
首先,FreeRTOS 允许以下哪些 RTS 配置文件?
当我尝试在 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 ) 上所示?