Octave GNU:未定义的变量' x' ,即使它被定义为功能输入

时间:2017-06-12 20:56:27

标签: octave gnu

只是想写一个简单的程序来找到n个数字的gcd。我不知道如何解决这个错误,我已经阅读了所有的八度音程功能文档,并试图找到这样的问题......刚开始用Octave btw编程。 这是代码:

function divisor = gcd(x, y)
  q=0;
  r=0;
  l=0;
  h=0;
  if(x>y)
    h=x;
    l=y;
 elseif(x<y) 
    h=y;
    l=x;
 else
    h=y;
    l=x;
 endif 
 while(r != 0)
    q=floor(h/l);
    r = h-l*q;
    q=h;
    r=l;
 endwhile
 divisor = q;
 printf("%d", q);
 return;
endfunction

错误:

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

谢谢:)

2 个答案:

答案 0 :(得分:5)

您的代码是函数定义。您的函数名为gcd

您必须将代码保存在名为gcd.m的文件中,然后创建新文件,以便您可以从中调用该函数。

在保存gcd.m的同一目录中,创建一个文件(例如:gcdtest.m)并将以下代码放入其中:

test = gcd(40, 50)

然后保存并运行此文件。如果输出没有按预期工作,重新启动Octave应该修复它。

我选择的数字只是一个例子。

说明:

如果您拥有的是功能定义文件(即gcd.m),当您点击&#34;保存并运行&#34;时,Octave本身会调用您的功能,但它并不聪明足够,并且不会使用任何参数。这就是为什么你得到一个未定义的变量&#34;错误。这与您在测试文件中只有test = gcd()的情况类似。

但是,如果您使用参数调用函数,它们将正确初始化变量xy,您的代码将起作用。

您也可以从Octave命令行中调用gcd(40, 50)进行测试。

以下是关于功能和功能文件的Octave文档的链接(我知道你说你读过它们,但新手可能没有):

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

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

现在,我注意到您的代码中存在一些问题:

    第16行的
  • while(r != 0) - 由于您在第3行中将r定义为0并且不指定新值,因此不会运行,甚至不会运行一次以后。

  • elseif(x<y)(第9行)和else(第12行)都完全相同。最好完全删除elseif条件,而只改为else

祝你学习顺利。

答案 1 :(得分:0)

对于那些在这里结束的人,Octave 假设任何以 function 关键字开头的代码都是所谓的“函数文件”,只能从“脚本文件”。如果您想防止这种荒谬的混淆,只需在代码上方添加任何内容即可。例如:

1;
function foo = bar(baz)
    % do some stuff
end

更多信息here