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

Octave GNU: Undefined variable 'x' , even though it's defined as function input

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

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

谢谢 :)

您的代码是一个函数定义。您的函数称为 gcd

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

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

test = gcd(40, 50)

然后保存并 运行 这个文件。如果输出没有按预期工作,重新启动 Octave 应该可以解决它。

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


解释:

如果你只有函数定义文件(即 gcd.m),当你点击 "Save and run" 时,Octave 会自己调用你的函数,但它不够聪明,不会使用任何这样做的参数。这就是您收到 "undefined variable" 错误的原因。这类似于您的测试文件中只有 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


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

  • while(r != 0) 在第 16 行 - 这不会 运行,甚至一次都不会,因为您在第 3 行将 r 定义为 0 而不是稍后为其分配一个新值。

  • elseif(x<y)(第 9 行)和 else(第 12 行)都做完全相同的事情。最好完全删除 elseif 条件,只用 else 代替。

祝你学业顺利

对于那些在此处结束的人,Octave 假定任何以 function 关键字开头的代码都是所谓的“函数文件”,只能从一个“脚本文件”。如果您想避免这种荒谬的混淆,只需在您的代码之上添加任何内容。例如:

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

更多信息here