2017-06-12 145 views
1

只是試圖編寫一個簡單的程序來查找n個數字的gcd。我不知道如何解決這個錯誤,我已經閱讀了所有的八度功能文檔,並試圖找到這樣的問題......剛開始在八度btw編程。 下面的代碼:Octave GNU:未定義變量'x',即使它被定義爲函數輸入

function divisor = gcd (x, y) 
    q = 0; 
    r = 1; 
    l = 0; 
    h = 0; 

    if x > y 
    h = x; 
    l = y; 
    elseif x < y 
    h = y; 
    l = x; 
    endif 

    while r != 0 
    q = floor (h/l); 
    r = h - l * q; 
    h = l; 
    l = r; 
    endwhile 

    divisor = h; 
    return 
endfunction 

的錯誤:

error: 'x' undefined near line 6 column 6 
error: called from 
    gcd at line 6 column 3 

謝謝:)

+0

你是從其他腳本調用它還是試圖運行此文件,因爲它是? –

+0

請注意,如果/當參數列表時您不需要括號。另外,函數結尾不需要'return'語句。 –

+0

我試圖按原樣運行該文件。但由於Marc.2377,現在它已經修復了。 – lkat

回答

1

你的代碼是一個函數定義。你的功能叫做gcd

您必須將代碼保存在名爲gcd.m的文件中,然後創建一個新文件,以便您可以從中調用該功能。

在您保存gcd.m同一目錄下,創建一個文件(例如:gcdtest.m),並把下面的代碼在它:

test = gcd(40, 50) 

然後保存並運行此文件。如果輸出不能按預期工作,重新啓動Octave應該修復它。

我選擇的數字只是一個例子。


說明:

如果你已經是函數的定義文件(即gcd.m),當你點擊「保存並運行」,八音會自己打電話給你的功能,但它不是足夠聰明和韓元這樣做不使用任何參數。這就是爲什麼你會得到一個「未定義的變量」錯誤。這與您在測試文件中只有test = gcd()類似。

但是,如果您使用參數調用函數,它們將正確初始化變量xy,並且您的代碼將工作。

您也可以簡單地從Octave命令行調用gcd(40, 50)進行測試。

以下是鏈接到有關函數和函數文件倍頻文件(我知道你說你看他們,但新人可能沒有):

https://www.gnu.org/software/octave/doc/interpreter/Defining-Functions.html

https://www.gnu.org/software/octave/doc/interpreter/Function-Files.html


現在,我注意到您的代碼中有幾個問題:

  • while(r != 0)在第16行 - 由於您在第3行中將r定義爲0,因此以後不會運行,甚至不會運行一次,也不會爲其分配新值。

  • elseif(x<y)(第9行)和else(第12行)都完全相同。最好是完全刪除elseif條件,而只有else

祝您在學習中好運。

+0

只需添加您不必創建第二個m文件,就可以使用放入gcdtest.m的文本從命令行調用gcd。初學者往往不認識到差異。他的gcd.m文件是一個函數文件,gcdtest.m文件是一個腳本文件,腳本文件只是解釋器命令列表。 –

+0

非常感謝,所有修正。我也注意到另一個問題:而不是q = h; r = 1;它應該是h = q; l = r; - 在while循環中。 – lkat