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

Octave 八度GNU:未定义的变量';x',即使它';定义为函数输入,octave,gnu,Octave,Gnu,只是想写一个简单的程序来求n个数的gcd。我不知道如何修复这个错误,我已经阅读了所有的八度函数文档,并试图找到像这样的问题。。。刚刚开始在八度的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 !

只是想写一个简单的程序来求n个数的gcd。我不知道如何修复这个错误,我已经阅读了所有的八度函数文档,并试图找到像这样的问题。。。刚刚开始在八度的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

谢谢:)

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

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

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

test = gcd(40, 50)
然后保存并运行此文件。如果输出不能按预期工作,重新启动Octave应该可以修复它

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


说明:

如果您只有函数定义文件(即,
gcd.m
),当您点击“保存并运行”时,Octave本身将调用您的函数,但它不够聪明,因此不会使用任何参数。这就是为什么会出现“未定义变量”错误。这类似于您的测试文件中只有
test=gcd()

但是,如果使用参数调用函数,它们将正确初始化变量
x
y
,代码将正常工作

您也可以从倍频程命令行简单地调用
gcd(40,50)
,以进行测试

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


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

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


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

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

    更多信息。

    您是从其他脚本调用它,还是尝试按原样运行此文件?请注意,if/while语句周围不需要括号。此外,函数末尾不需要使用
    return
    语句。我曾尝试按原样运行此文件。但由于Marc.2377,它现在已修复。我注意到您已编辑了您r问题:根据给出的答案更正代码;不应该这样做,否则新来者将无法找出错误所在。它现在已被还原。只需添加您不必创建第二个m文件,您可以使用放入gcdtest.m中的文本从命令行调用gcd。初学者通常不会识别错误区别。gcd.m文件是一个函数文件,gcdtest.m文件是一个脚本文件,脚本文件只是解释器命令的列表。非常感谢,所有问题都已解决。我还注意到另一个问题:在while循环中,它应该是h=q;l=r;-而不是q=h;l=r;。我通常将函数命名为与文件名相同的函数,然后从中调用我的函数在这里面。我认为它就像void main()。@LukeDupin你可能已经知道这一点,但只是觉得值得一提。期待看到更多的人在上面。
    1;
    function foo = bar(baz)
        % do some stuff
    end