我在Linux上进行Ada开发的贸易研究.你有任何好的编译器/操作系统建议吗?
到目前为止,我已经从运行在CentOS 5.4上的AdaCore获得GNAT,并且我在Rational Apex和Aonix ObjectAda中有许可请求.
这是移植工作.原始代码库是OSF1 4.0d上的Apex 3.0.
还有什么我应该考虑的吗?理想情况下,它将是一个受支持的环境.
C ++是否提供类似于Ada的subtype类型来缩小类型?
例如:
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
subtype Working_Day is Weekday range Monday .. Friday;
我来自C++背景,但我目前在Ada工作.在C++世界中,我在编写每个类时对其进行单元测试......这似乎不是我们的代码库在工作中的时尚.
我想开始为我创建的Ada软件包实现单元测试,是否有任何好的框架可以做到这一点?
我知道GC在Ada开发的时代并不受欢迎,对于嵌入式编程的主要用例,它仍然不是一个好的选择.
但是考虑到Ada是一种通用编程语言,为什么不是部分和可选的(仅跟踪显式标记的内存对象)垃圾收集器在后来的语言版本和编译器实现中引入.
我根本想不到开发一个没有垃圾收集器的普通桌面应用程序了.
当Ada应用程序被关闭/终止时,我想要一些'清理'调用.
例如,如果我在java中,我会做这样的事情来达到在关机时调用的效果:
Runtime.getRuntime().addShutdownHook(new Thread(){
       public void run(){
            method();
       }
});
在Ada中有类似的东西或其他方式来实现这一目标吗?
我无法编译这个程序,因为它似乎不会在Put_Line方法中打印整数变量和字符串.我已经在线查看了源代码,当它们这样做时它可以工作,所以我哪里出错了.谢谢你的帮助.
with Ada.Text_IO;                       use Ada.Text_IO;
with Ada.Integer_Text_IO;           use Ada.Integer_Text_IO;
procedure MultiplicationTable is
    procedure Print_Multiplication_Table(Number :in Integer; Multiple :in Integer) is
        Result : Integer;   
    begin
        for Count in 1 ..Multiple
        loop
            Result := Number * Count;
            Put_Line(Number & " x " & Count & " = " & Result);
        end loop; 
    end Print_Multiplication_Table;
    Number  :   Integer;
    Multiple    :   Integer;
begin
    Put("Display the multiplication of number: ");
    Get(Number);
    Put("Display Multiplication until number: ");
    Get(Multiple);
    Print_Multiplication_Table(Number,Multiple);
end MultiplicationTable;`
使用GNAT Ada和Gnu C++,我将Ada代码与c ++包装器连接起来,我想在运行这个(愚蠢的)代码时正确捕获Ada异常:
with ada.text_io;
package body ada_throw is
   procedure ada_throw is
   begin
      ada.text_io.put_line ("hello");
      raise program_error;
   end ada_throw;       
end ada_throw;
相关规范代码是:
package ada_throw is
   procedure ada_throw;
   pragma export (convention => C, entity => ada_throw, external_name => "ada_throw");
end ada_throw;
在C++方面这样做:
#include <iostream>
extern "C"
{
  void ada_throw();
  void adainit();
}
int main()
{
  adainit();
  ada_throw();
  std::cout << "end of program" << std::endl;
  return 0;
}
我明白了:
hello
raised PROGRAM_ERROR : ada_throw.adb:8 explicit raise
所以异常机制的工作,我没有得到我的C++程序的最后打印和返回代码为非零.
现在我想抓住异常.如果我使用catch(...) …
Ada 除了布尔运算符外and then,还具有if条件中使用的语句的出色功能。这允许在访问对象之前检查例如该对象是否不为null,如下所示:and
if Object /= null and then Object.Value > 5 then
   -- do something with the value
end if;
有没有一种方法可以使用嵌套在C ++ w / o中表达类似的行为if?
我正在尝试使用AVR微控制器和avr-ada构建gcc,并且我遇到了一个障碍,因为我的常规编译器对AVR所需的版本过于挑剔.我收到以下警告,这反过来导致gcc或make报告错误:
gcc -c -g -O2 -gnatpg -gnata -nostdinc -I- -I. -Iada 
  -I../../gcc/ada ../../gcc/ada/exp_ch5.adb -o ada/exp_ch5.o
exp_ch5.adb:177:16: warning: function "Has_Address_Clause" is not referenced
make[2]: *** [ada/exp_ch5.o] Error 1
make[1]: *** [all-gcc] Error 2
make: *** [all] Error 2
有没有办法指示gcc或使警告不失败?