Невозможно использовать функцию в ошибке компилятора вызова процедуры

Программа рекурсивных башен Ханоя в ADA.

Пока я думаю, что у меня большая часть этого, моя проблема заключается в моей функции решения. Я думаю, что у меня есть алгоритм в порядке, но я не уверен, как реализовать его в функции, все примеры, которые я вижу, используют функцию внутри себя, например: Пример

Мои ошибки:

hanoi.adb:23:09: cannot use function "solve" in a procedure call
hanoi.adb:27:09: cannot use function "solve" in a procedure call
hanoi.adb:59:15: missing ")"

Вот мой код до сих пор.

with ada.text_io, ada.command_line;
use ada.text_io, ada.command_line;


procedure hanoi is

Argument_Error : EXCEPTION;
max_disks, min_disks : integer := 3;
moves : integer := 0;


verbose_bool : boolean;

function solve (N: in integer; from, to, using: in character) return integer is
begin


if N = 1 then
    if verbose_bool = true then
    put("Move disk " & integer'image(N) & " from " & character'image(from) & " to " & character'image(to));
    end if;
else
    solve(N - 1, 'A', 'B', 'C');
    if verbose_bool = true then
    put("Move disk " & integer'image(N) & " from " & character'image(from) & " to " & character'image(to));
    end if;
    solve(N - 1, 'B', 'C', 'A');
end if;
    moves := (2 ** min_disks) - 1;
    return moves;

end solve;

begin

while min_disks /= max_disks loop

IF Argument_Count > 1 THEN
      if Argument_Count = 1 then
      min_disks := integer'value("Argument(1)");
      elsif Argument_Count = 2 then
      min_disks := integer'value("Argument(1)");
      max_disks := integer'value("Argument(2)");
      elsif Argument_Count = 3 then
      min_disks := integer'value("Argument(1)");
      max_disks := integer'value("Argument(2)");
      if argument(3) = "v" or argument(3) = "V" then
      verbose_bool := true; -- if argument is V or v it is true
      end if;
      END IF;
END IF;

IF Argument_Count > 3 THEN
      RAISE argument_error;
END IF;


if (max_disks > 0) then
      solve (N: integer; from, to, using : character);
END IF;

min_disks := min_disks + 1;

end loop;
EXCEPTION
   WHEN Name_Error =>
      Put_Line("Please re-enter your arguments, check to see if you entered integers and characters. Max of 3 arguments.");
   WHEN OTHERS =>
      Put_Line("Please try to not break the program again, thank you.");

end hanoi;

person Molten    schedule 06.02.2013    source источник


Ответы (3)


Функции возвращают значения, а процедуры — нет, и вы определили Solve как функцию.

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

Как указано в сообщении об ошибке, ваш синтаксис такой же, как при вызове процедуры, т. е. при вызове процедуры, но вы указали имя функции.

Если значение, возвращаемое функцией, имеет смысл, то действуйте с ним в соответствии с его назначением. Если он не обеспечивает какой-либо значимой функциональности, исключите его и определите Solve как процедуру.

person Marc C    schedule 06.02.2013
comment
Так что я должен изменить in, int. А в char просто ints/chars? избавиться от оператора return вместе? В декларации решает, что есть. - person Molten; 07.02.2013

Кроме того, вы можете реорганизовать код отображения во вложенную подпрограмму. В приведенной ниже схеме procedure Print может получить доступ к параметрам procedure Solve.

procedure Solve (N: in Integer; From, To, Using: in Character) is

   procedure Print is
   begin
      if Verbose then
      ...
      end if;
   end Print;

begin
   if N = 1 then
      Print;
   else
      Solve (N - 1, 'A', 'B', 'C');
      Print;
      Solve (N - 1, 'B', 'C', 'A');
   end if;
end Solve;
person trashgod    schedule 06.02.2013

В дополнение к комментарию Марка о том, что вызов Solve не является надлежащей ссылкой на функцию Ada, синтаксис, который у вас есть, является синтаксисом спецификации, а не вызовом Solve. У вас было это правильно в теле Solve, но не при первоначальном вызове:

  if (max_disks > 0) then
        solve (N: integer; from, to, using : character);
  END IF;
person Community    schedule 06.02.2013