运行 .adb 程序时"cannot generate code for file random.ads"



我在 Ada 中运行程序时遇到了一些麻烦。我有以下三个项目文件(我使用GPS):

类型.广告

package types is
subtype T_valeurind is Integer range 2..14;
type T_couleur is (s, h, c, d);
type t_carte is record
valeur : T_valeurind;
couleur : T_couleur;
end record;
type T_jeu is array (1..7) of t_carte;
function trans(val: Character) return T_valeurind;
end types;

Trans.adb

with types;
use types;
WITH Text_Io , Ada.Integer_Text_Io;
USE Text_Io , Ada.Integer_Text_Io;

function trans(val : Character) 
return T_valeurind is
ret: Integer;
begin 
case val is
when '3' => ret:=3;
when '4' => ret:=4;
when '5' => ret:=5;
when '6' => ret:=6;
when '7' => ret:=7;
when '8' => ret:=8;
when '9' => ret:=9;
when 'T' => ret:=10;
when 'J' => ret:=11;
when 'Q' => ret:=12;
when 'K' => ret:=13;
when 'A' => ret:=14;
when others => null;
end case;
return ret;
end trans;

Test.adb

WITH Text_Io , Ada.Integer_Text_Io;
USE Text_Io , Ada.Integer_Text_Io;
with types;
use types;

procedure test is
begin
put(T_valeurind'Image(trans('c')));
end test;

我只是尝试执行test.adb只是为了检查我的函数"trans"是否运行良好。当我在GPS中构建文件时,一切正常。但是当我想运行它们时,我有以下消息,并且没有执行:

无法为文件类型生成代码。ads(包规范)

GPRbuild:*** 编译阶段失败

[2018-12-02 02:01:39] 进程退出,状态为 4,100% (2/2),运行时间:01.65s

但令人不安的是,当我第一次尝试运行代码时,它奏效了。在没有改变任何东西的情况下,它停止了工作。 我不知道该怎么办。我已经看到这条消息只是告诉我.ads文件不可编译,但是我尝试编译和运行的是一个.adb文件,所以我没有得到它。 你知道为什么它不起作用吗?

提前谢谢大家!

首先,这些不是项目文件,项目文件的类型为.gpr;它们是项目中的 Ada 源文件。

您的types.ads承诺function trans,这意味着它需要一个types.adb的包体,

package body types is
function trans(val : Character) 
return T_valeurind is
ret: Integer;
begin 
case val is
when '3' => ret:=3;
when '4' => ret:=4;
when '5' => ret:=5;
when '6' => ret:=6;
when '7' => ret:=7;
when '8' => ret:=8;
when '9' => ret:=9;
when 'T' => ret:=10;
when 'J' => ret:=11;
when 'Q' => ret:=12;
when 'K' => ret:=13;
when 'A' => ret:=14;
when others => null;
end case;
return ret;
end trans;
end types;

(嗯。如果您传入无效字符,您将返回未初始化的数据,并且就像没有得到Constraint_Error一样;T_valeurind包括值 2,你不应该覆盖它吗?

您的trans.adb会改为指定库级函数。

当我在GPS中构建文件时,一切正常。但是当我想运行它们时,我有以下消息,并且没有执行:

如果软件包规范 (types.ads) 需要一个正文 (types.adb) 而您没有提供它,编译器将在您尝试编译它时生成您报告的消息。如果您尝试仅编译test.adb则可以。如果你尝试构建test.adb它将尝试编译包Types并且会失败,无论你是尝试构建还是构建和运行。

我不知道这是第一次怎么做到的!

看起来您忘记将function Trans包含在测试程序的上下文中。 如果它不在上下文中,则无法使用它。

尝试添加:

with Trans;

procedure Test的上下文子句。

首先,使用强大的 Ada 枚举功能(以及一些糟糕的输入处理策略,如异常)可以避免您的整个问题。您的trans程序将毫无用处。

如果您对枚举值的顺序关系感兴趣,还可以使用 Ada 的'First*(第一个枚举文本)、'Last(最后一个枚举文本)、'Pos(枚举内的位置)、'Succ(下一个枚举文本)、'Pred(上一个枚举文本)。

如果对变量执行内存映射,则可以使用'Valid来检查变量是否具有有效值,并省去约束错误的异常捕获需求。

请参阅以下示例:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions; use Ada.Exceptions;
procedure Hello is
-- miwing chars and literal values in enum
-- note that jack is 'J' and not the single source code character J
type My_Awesome_Enum is ('1', '2', '3', 'J', Q, K, Ace);
for My_Awesome_Enum use
('1' => -1,
'2' => 2,
'3' => 3,
-- ...
'J' => 11,
Q => 12,
K => 13,
Ace => 14);
temp : Integer;
prev : My_Awesome_Enum;
succ : My_Awesome_Enum;
temp2 : My_Awesome_Enum;
begin
-- ------------------------------------------
-- Ada enum power
declare
begin
for value in My_Awesome_Enum loop
temp := My_Awesome_Enum'Enum_Rep(value);
Put_Line("Enum litteral value: " & value'Image & " - memory representation: " & Integer'Image(temp));
if value /= My_Awesome_Enum'First then
prev := My_Awesome_Enum'Pred(value);
Put_Line("Previous: " & prev'Image);
else
Put_Line("No previous");
end if;
if value /= My_Awesome_Enum'Last then
succ := My_Awesome_Enum'Succ(value);
Put_Line("Next: " & succ'Image);
else
Put_Line("No next");
end if;
Put_Line("");
end loop;
end;
-- ------------------------------------------
-- conversion from some input source
Put_Line("");
declare
strInput : String := "Unknown user value";
begin
Put_Line("Handling of user input: " & strInput);
temp2 := My_Awesome_Enum'Value (strInput);
exception
when E: others =>
Put_Line("Exception catched: " & Exception_Information (E));
Put_Line("Setting value to Ace instead");
temp2 := Ace;
end;
Put_Line("tmp2 value: " & temp2'Image & " - memory representation: " & Integer'Image(My_Awesome_Enum'Enum_Rep(temp2)));
-- ------------------------------------------
-- mmemory mapping
Put_Line("");
declare
my_int : Integer := -3;
mapped_Enum : My_Awesome_Enum;
for mapped_Enum'Address use my_int'Address;
last_enum : My_Awesome_Enum := (My_Awesome_Enum'Last);
stop_condition : Integer := (last_enum'Enum_Rep) + 2;
begin
while (my_int < stop_condition) loop
if mapped_Enum'Valid then
Put_Line("Enum with value: " & my_int'Image & " is valid.");
else
Put_Line("Memory mapping would result in invalid enum for value: " & my_int'Image);
end if;
my_int := my_int + 1;
end loop;
end;
end Hello;

这给出了以下输出(https://www.tutorialspoint.com/compile_ada_online.php,使用 GNATMAKE v7.1.1):

建:

$gnatmake -o hello *.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -o hello

执行:

Enum litteral value: '1' - memory representation: -1
No previous
Next: '2'
Enum litteral value: '2' - memory representation:  2
Previous: '1'
Next: '3'
Enum litteral value: '3' - memory representation:  3
Previous: '2'
Next: 'J'
Enum litteral value: 'J' - memory representation:  11
Previous: '3'
Next: Q
Enum litteral value: Q - memory representation:  12
Previous: J
Next: K
Enum litteral value: K - memory representation:  13
Previous: Q
Next: ACE
Enum litteral value: ACE - memory representation:  14
Previous: K
No next
Handling of user input: Unknown user value
Exception catched: raised CONSTRAINT_ERROR : bad input for 'Value: "Unknown user value"
Setting value to Ace instead
tmp2 value: ACE - memory representation:  14
Memory mapping would result in invalid enum for value: -3
Memory mapping would result in invalid enum for value: -2
Enum with value: -1 is valid.
Memory mapping would result in invalid enum for value:  0
Memory mapping would result in invalid enum for value:  1
Enum with value:  2 is valid.
Enum with value:  3 is valid.
Memory mapping would result in invalid enum for value:  4
Memory mapping would result in invalid enum for value:  5
Memory mapping would result in invalid enum for value:  6
Memory mapping would result in invalid enum for value:  7
Memory mapping would result in invalid enum for value:  8
Memory mapping would result in invalid enum for value:  9
Memory mapping would result in invalid enum for value:  10
Enum with value:  11 is valid.
Enum with value:  12 is valid.
Enum with value:  13 is valid.
Enum with value:  14 is valid.
Memory mapping would result in invalid enum for value:  15

相关内容

最新更新