"не может сгенерировать код для файла random.ads" при запуске программы .adb - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблемы с запуском программы на Аде.У меня есть три следующих файла проекта (я использую GPS):

Types.ads

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, все работает просто отлично.Но когда я хочу запустить их, у меня появляется следующее сообщение без выполнения:

не может сгенерировать код для файлов types.ads (спецификация пакета)

gprbuild: ***фаза компиляции не удалась

[2018-12-02 02:01:39] процесс завершен со статусом 4, 100% (2/2), истекшее время: 01,65 с

ноЧто беспокоит, так это то, что когда я впервые попробовал запустить код, он работал.Ничего не меняя, перестало работать.Я не знаю что делатьЯ видел, что это сообщение просто говорит мне, что файл .ads не компилируется, но я пытаюсь скомпилировать и запустить файл .adb, поэтому я его не понимаю ... У вас есть идея, почему он не 't работа?

Спасибо всем заранее!

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Во-первых, это не файлы проекта, которые имеют тип .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 и потерпит неудачу, независимо от того, пытаетесь ли вы собрать или запустить и запустить.

У меня естьПонятия не имею, как это могло сработать в первый раз!

0 голосов
/ 02 декабря 2018

Во-первых, всей вашей проблемы можно было бы избежать, используя мощные возможности перечислений Ada (и некоторые неверные стратегии обработки входных данных, например исключения).Ваша trans процедура была бы бесполезна.

Если вас интересует отношение порядка ваших значений перечисления, вы также можете использовать 'First* Ады (первый литерал перечисления),'Last (последний литерал перечисления), 'Pos (позиция внутри перечисления), 'Succ (следующий литерал перечисления), 'Pred (предыдущий литерал enum).

Если вы выполняете отображение памяти для ваших переменных, вы можете использовать '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
0 голосов
/ 02 декабря 2018

Похоже, вы забыли включить function Trans в контекст тестовой программы.И если это не в контексте, вы не можете использовать его.

Попробуйте добавить:

with Trans;

К контекстному предложению procedure Test.

...