Ada链接器不让我打电话给我的程序

时间:2015-01-21 14:50:42

标签: ada

这是我的代码:

  procedure String_To_Int(str: String) is
      str_length : Integer := str'Size / 8;  
      ASCII_Values_Array: array (Integer range 1 .. str_length) of Integer;  
  begin
      Text_Io.Put_Line(str & " has a length of " & natural'image(str_length));
      for x in 1 .. str_length loop
        ASCII_Values_Array(x) := Character'Pos(str(x));
        Text_Io.Put_Line(natural'image(ASCII_Values_Array(x)));
      end loop;
  end String_To_Int;

我想用它来调用它:

  String_To_Int(str => "abcdefghijklmnopqrstuvwxyz");

但编译器告诉我:

Saw '(', expected:  , :

我不知道我如何调用我的程序有什么问题。我已经查看了许多其他过程调用的例子,这看起来完全一样。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

有些事你没有告诉我们。

     ./test_sti;
    abcdefghijklmnopqrstuvwxyz has a length of  26
     97
     98
     99
    ...
     121
     122

现在你没有说你实际在做什么,但这就是我所做的。

我在另一个过程中调用了String_To_Int,文件为test_sti.adb。

with String_To_Int;

procedure test_sti is
begin
   String_To_Int(str => "abcdefghijklmnopqrstuvwxyz");
end;

请注意,String_To_Int是一个单独的过程,在它自己的文件中,因此with子句告诉编译器查找它。我可以在本地声明它,即在“是”和“开始”之间并保存下面的文件,但分离可能是更好的设计。

现在任何“with”ed都会有规范和正文 - 在这种情况下,规范string_to_int.ads:

  procedure String_To_Int(str: String);

和body string_to_int.adb:

with Ada.Text_IO;
use Ada;

  procedure String_To_Int(str: String) is
      str_length : Integer := str'Size / 8;  
      ASCII_Values_Array: array (Integer range 1 .. str_length) of Integer;  
  begin
      Text_Io.Put_Line(str & " has a length of " & natural'image(str_length));
      for x in 1 .. str_length loop
        ASCII_Values_Array(x) := Character'Pos(str(x));
        Text_Io.Put_Line(natural'image(ASCII_Values_Array(x)));
      end loop;
  end String_To_Int;

并构建该批次,只需

gnatmake test_sti.adb

并且编译器会计算出它自己的依赖项,不需要Makefile。

对于一个程序而言,拥有一个单独的“编译单元”实际上有点奇怪(但完全合法)。更常见的是,它将在本地声明,或者它将成为包的一部分 - 如Ada.Text_IO之类的实用程序集合,或者如果您熟悉Java或C ++则类似于类。

顺便提一下,String_To_Int是一个非常奇怪的过程:而不是将其变量声明为

  str_length : Integer := str'Size / 8;  
  ASCII_Values_Array: array (Integer range 1 .. str_length) of Integer;  

更一致地使用属性更清晰:

  str_length : constant natural := str'Length;  
  ASCII_Values_Array: array (str'range) of Integer;

并将循环条件表示为

for x in str'range loop