小编Tam*_*inn的帖子

gprbuild 可以配置为输出 gnatprep 预处理源吗?

我有一个 gpr 项目,它使用 gnatprep 来预处理源文件。但现在我有一个工具需要已经预处理的源文件。我知道我可以找到每个源文件并通过 gnatprep 运行它:

find . -type f -iname '*.ad[sb]' -exec gnatprep -DSymbol=value {} {}.prep \;
Run Code Online (Sandbox Code Playgroud)

但我想利用项目文件来找到正确的源文件并传递它们。我的项目文件还定义了要使用的各种符号值,我必须将其添加到上面的命令中。是否可以通过 .gpr 文件中的某些参数?例如

   for Object_Dir use 'obj';
   for Preprocessed_Sources_Dir use 'wow_that_was_easy';
Run Code Online (Sandbox Code Playgroud)

ada gprbuild

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

我如何强制类型保持只能是一组固定的非连续值?

当我将 3 作为有效的 Scale 值提供给它时​​,我期望这个程序会引发错误,但没有这样的运气:

with Ada.Text_IO; use Ada.Text_IO;

procedure predicate is
   type Scale is new Integer
      with Dynamic_Predicate => Scale in 1 | 2 | 4 | 8;
   GivesWarning : Scale := 3; -- gives warning
begin
   Put_Line ("Hello World");
   loop
      Put_Line ("Gimme a value");
      declare
         AnyValue : Integer := Integer'Value (Get_Line);
         S : Scale := Scale (AnyValue); -- no check done!
      begin
         Put_Line ("okay, that works" & S'Image);
      end;
   end loop;
end predicate;
Run Code Online (Sandbox Code Playgroud)

我发现了这个相关的问题,但要求是使用枚举。解决方案是从枚举 -> 值定义一个数组。 …

ada static-predicate dynamic-predicate

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

为什么前缀呼叫对访问类型不起作用?

我的程序包中有一些方法可以对访问常量进行操作,以访问标记的记录。为了调用这些函数,我必须指定程序包名称。我宁愿只放置变量名[dot]函数名,但这会产生错误:no selector "foo" for type "Color"。这是为什么?

这是最小的复制器:

procedure Main is

  type Color is tagged
    record
      Hue : Integer;
      Saturation : Integer;
      Value : Integer;
    end record;

  type AccessColor is access constant Color;

  procedure foo (C : in AccessColor) is
  begin
    null;
  end foo;

  AccessS : AccessColor;

begin
  foo (AccessS);
  --AccessS.foo; -- does not work. Why?
end Main;
Run Code Online (Sandbox Code Playgroud)

请注意,在我的实际代码中,完全指定函数是不方便的,因为与上面的示例不同,foo是在单独的程序包中的某个位置定义的:

Some.Package.Name.Depp.foo(AccessS);
Run Code Online (Sandbox Code Playgroud)

即使AccessS已经指定在哪里可以找到函数,所以我应该能够做到:

AccessS.foo;
Run Code Online (Sandbox Code Playgroud)

ada

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

您将如何编写在任何类型的元素的doubly_linked_lists上运行的Ada泛型函数?

如果可能的话,我将如何编写可在任何类型的元素的doubly_linked_lists上运行的Ada泛型函数?下面的函数规范通过限制Array_Type成为给定element_type的数组来说明我想要的东西。

generic
   type element_type is private;
   type Array_Type is array (Positive range <>) of element_type;
procedure Shuffle_Array (List : in out Array_Type);
Run Code Online (Sandbox Code Playgroud)

在给定一个element_type和严格对应的array_type的情况下,可以从中实例化一个过程,而数组的边界仍然留给特定的实例来改变。

procedure IntArrayFoo is new Foo(element_type => Integer, array_type => Integer_Array);
Run Code Online (Sandbox Code Playgroud)

So in the case of arrays, you can neatly genericize precisely that which may differ in instantiations. However, trying to do the analoguous with Ada.Containers.Doubly_Linked_List(T).List leads to problems.

Attempt 1 - generic procedure instantiating the doubly_linked_list package

with Ada.Containers.Doubly_Linked_Lists;

package shufit is
   generic
      type element_type is private; …
Run Code Online (Sandbox Code Playgroud)

generics ada

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

在 Ada 中如何退出主程序并出现错误代码?

看起来很简单,但这不能编译:

procedure Main is
begin
   exit 1;
end Main;
Run Code Online (Sandbox Code Playgroud)

当使用 gprbuild 编译时,会产生:

Compile
   [Ada]          main.adb
main.adb:3:04: cannot exit from program unit or accept statement
main.adb:3:08: missing ";"
gprbuild: *** compilation phase failed
Run Code Online (Sandbox Code Playgroud)

Ada 中的 exit 关键字显然与其他编程语言中的功能不同。那么如何退出 ada 主程序并出现错误代码呢?

ada

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

Ada 程序文本的实际字符集在哪里定义?

我正在尝试制作一个树守护者解析器,以便 IDE(在本例中为 Vim)可以解析 Ada 程序文本并进行更高级的操作,例如提取子程序和重命名变量。但定义字符集似乎存在一些问题。

\n

Ada 2012 参考手册中,我发现了一系列模糊的类别描述,其形式为“任何一般类别为 X 的字符”,这意味着,例如,除了下划线之外,所有这些( \xe2\x80\xbf \xe2\x81\x80 \xe2\x81\x94 \xef\xb8\xb3 \xef\xb8\xb4 \xef\xb9\x8d \xef\xb9\x8e \xef\xb9\x8f \xef\xbc\xbf) 是也允许在标识符中使用,这似乎很荒谬,并且 GNAT 会以“非法字符”拒绝。该列表的开头是这样的声明:

\n

“未指定实现 Ada 程序文本的视觉表示所使用的实际图形符号集。”

\n

这是否真的意味着无法知道应该接受哪些字符?

\n

上的两页中,这些示例被明确指定为有效标识符,但 GNAT 2021 拒绝了它们:

\n
procedure Main is\n   \xce\xa0\xce\xbb\xce\xac\xcf\x84\xcf\x89\xce\xbd  : constant := 12;     -- Plato\n   \xd0\xa7\xd0\xb0\xd0\xb9\xd0\xba\xd0\xbe\xd0\xb2\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 : constant := 12;  -- Tchaikovsky\n   \xce\xb8, \xcf\x86 : constant := 12;        -- Angles\nbegin\n   null;\nend Main;\n
Run Code Online (Sandbox Code Playgroud)\n
$ gprbuild\nusing project file foo.gpr\nCompile\n   [Ada]          main.adb\nmain.adb:2:04: error: declaration expected\nmain.adb:2:05: …
Run Code Online (Sandbox Code Playgroud)

ada non-ascii-characters

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

Ada中的多行字符串文字

如何在Ada中创建一个包含换行符的字符串,其定义也包含这些换行符?

我尝试在行尾使用0..2反斜杠,但是没有一个可以编译:

   usage_info : String := "\
This should be the first line
and both the definition and the output
should contain newlines.";
Run Code Online (Sandbox Code Playgroud)

在PHP中,这将是:

<<<BLOCK
1
2
3
BLOCK;
Run Code Online (Sandbox Code Playgroud)

在C ++中,这将是:

const std::string s = "\
1
2
3";
Run Code Online (Sandbox Code Playgroud)

在C#中,它将是:

const string s =
@"1
2
3";
Run Code Online (Sandbox Code Playgroud)

string ada multiline literals

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

Ada 有标准的堆栈实现吗?

我满怀希望地输入with Ada.Containers.以查看自动完成列表,但没有看到Stack或列出任何类似的内容。Ada 标准库真的没有堆栈实现吗?

在 Rosetta Code 上,我发现了这个堆栈实现,它非常缺乏,因为它为每个添加的单个节点运行到分配器。

我觉得一定有一些我必须错过的“其他 Ada 标准库”,因为我不断遇到明显缺失的基本库功能。

ada

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

如何在不对第一个索引进行硬编码的情况下,仅使用一个元素初始化数组?

我试图将一个Unbounded_String数组传递给一个函数,我不关心索引的范围,因为函数将遍历每个元素.

(element1,element2)语法自动从范围中的第一个索引值开始,然后为给定的第二个值递增,这适用于多个值.但是,对于单个值,不能使用此值,因为括号被认为是多余的.

此代码显示了我所做的每个尝试的错误消息.(1)工作,但(2),传递单元素数组的优选语法不.(3)作品,作为这个类似问题的答案.然而,这将该范围的第一个索引硬编码到呼叫方; 如果String_Array实现发生更改,则必须更改所有调用站点,即使它们不关心所使用的索引值.

with Ada.Strings.Unbounded;  use Ada.Strings.Unbounded;

procedure Main is

  function "+"(S: String) return Ada.Strings.Unbounded.Unbounded_String
    renames Ada.Strings.Unbounded.To_Unbounded_String;

  type String_Array is array (Positive range <>) of Unbounded_String;

  procedure Foo(input : in String_Array) is
  begin
    null;
  end Foo;

begin
  Foo((+"one", +"two"));                                    --(1)
  --Foo((+"only"));                                         --(2) positional aggregate cannot have one component
  Foo((1 => +"only"));                                      --(3)
  --Foo((String_Array'First => +"only"));                   --(4) prefix for "First" attribute must be constrained array
  --Foo((String_Array'Range => +"only"));                   --(5) prefix for "Range" attribute must be constrained array
  --Foo((String_Array'Range'First …
Run Code Online (Sandbox Code Playgroud)

arrays ada

0
推荐指数
2
解决办法
258
查看次数