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

lka*_*kat 4 gnu octave

只是想写一个简单的程序来找到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
Run Code Online (Sandbox Code Playgroud)

错误:

error: 'x' undefined near line 6 column 6
error: called from
     gcd at line 6 column 3
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Mar*_*377 5

您的代码是函数定义.你的函数被调用gcd.

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

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

test = gcd(40, 50)
Run Code Online (Sandbox Code Playgroud)

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

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


说明:

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

但是,如果使用参数调用函数,它们将正确初始化变量x,y并且您的代码将起作用.

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

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

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行 - 这将不会运行,甚至不会运行一次,因为您r在第3行中定义为0并且稍后不为其分配新值.

  • elseif(x<y)(第9行)和else(第12行)都完全相同.最好elseif完全删除条件,而只是else取而代之.

祝你学习顺利.