从命令行解释器调用函数时,如何将命令行参数传递给Octave函数?

时间:2017-12-29 12:51:13

标签: debugging octave

我有一个Octave(在CentOS 6.6上的4.0.0版本)代码,我通常像octave-cli mycode someargument一样运行。  我想从Octave命令行解释器调试此代码。这是一个最小的工作示例:

$ cat somefunc.m 
function somefunc
    printf("hello world\n");
    args = argv();
    printf("args = %s\n", args{1});
endfunction
somefunc();
printf("this is the end\n");

此代码运行如下:

$ octave-cli somefunc.m somearg
hello world
args = somearg
this is the end

我希望能够从命令行调试此代码,并传递somearg,以便argv()抓住它。例如。

$ octave-cli
octave:1> dbstop somefunc 4;
octave:2> somefunc somearg
stopped in /some/path/somefunc.m at line 4
4:     printf("args = %s\n", args{1});
hello world
debug> dbcont
error: somefunc: A(I): index out of bounds; value 1 out of bound 0
error: called from
    somefunc at line 4 column 5
octave:2> 

但我无法弄清楚如何让argv()读取命令行参数。我需要换一个丑陋的开关吗?类似的东西:

if(is_interactive_mode)
    args = "somearg";
else
    args = argv(); 
end

在Python中,我不会遇到这个问题,例如: python -m pdb ./somefunc.py somearg和C(使用Gdb)我会在starting gdb时传递参数,或者传递给命令run

问题:从octave命令行交互运行时,如何将命令行参数传递给程序?

1 个答案:

答案 0 :(得分:0)

最好的方法是使用两个分开的文件:

% somescript.m
args = argv();
printf("args = %s\n", args{1});
somefunc(args{1});
printf("this is the end\n");

%somefunc.m
function somefunc(func_arg)
    printf("hello world\n");
    printf("func_arg=%s\n",func_arg)
endfunction

然后,从您的OS命令行:

$ octave-cli somescript.m somearg
args = somearg
hello world
func_arg=somearg
this is the end

并从Octave命令行:

octave:2> somefunc("somearg")
hello world
func_arg=somearg

请注意,在您的示例中,由于函数名称与源文件名匹配,因此您将在源内部调用该函数,并且代码的最后一部分(即“ this is end”)将永远无法到达。 / p>