2013-02-06 18 views
0

ADA中河內程序的遞歸塔。「在過程調用中不能使用函數」編譯器錯誤

到目前爲止,我認爲我的大部分都是失敗的,我的問題在於我的解決功能。 我想我的算法很好,但我不知道如何實現它進入的功能,我看到使用這個的所有例子都是用在函數內部本身,如: Example

我的錯誤是:

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; 

回答

7

函數返回值,過程不,您已經將Solve定義爲函數。

Ada要求你用函數的返回值做一些事情,你在這裏沒有做的。 (您不能忽視返回的結果,如同在其他編程語言中所做的那樣)。

由於錯誤消息指出,您的語法是進行過程調用,即調用過程,但您提供了名稱的功能。

如果函數返回的值是有意義的,則根據其用途對其執行操作。如果它沒有提供任何有意義的功能,則將其消除並將Solve定義爲過程。

+0

因此,我應該更改in,int。而在char的只是ints/chars?一起擺脫返回聲明?在解決的聲明是。 – Molten

1

另外,您可能希望將顯示代碼重新分解爲嵌套的子程序。在下面的提綱中,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; 
0

除了馬克的關於呼叫意見解決的不是一個合適的Ada函數的引用,你有語法是一種規範,而不是能夠解決的一個調用的那個。您在Solve的機構中沒有進行初始調用:

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