这是我的代码:
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: , :
我不知道我如何调用我的程序有什么问题。我已经查看了许多其他过程调用的例子,这看起来完全一样。任何帮助表示赞赏!
答案 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