Octave 八度音阶3对4的脚本兼容性;其中';s可执行倍频程程序的真实文档
第1部分:在脚本文件“joe.m”之后的八度音阶3.4.3(在centos 6.6上)中(但对于3.x减去- 产生输出:Octave 八度音阶3对4的脚本兼容性;其中';s可执行倍频程程序的真实文档,octave,Octave,第1部分:在脚本文件“joe.m”之后的八度音阶3.4.3(在centos 6.6上)中(但对于3.x减去- 产生输出: calling jim program_name: 'joe.m' 但在octave 4.2.1中,它给出了一个警告,并显示为自动调用(!?)jim,并且不运行顶级即时代码(!?),没有输出行“调用jim”: 第2部分:如果我将同一文件重命名为“jim.m”,那么在octave 3.4.4中,输出为: calling jim program_name: 'jim.m' 在
calling jim
program_name: 'joe.m'
但在octave 4.2.1中,它给出了一个警告,并显示为自动调用(!?)jim,并且不运行顶级即时代码(!?),没有输出行“调用jim”:
第2部分:如果我将同一文件重命名为“jim.m”,那么在octave 3.4.4中,输出为:
calling jim
program_name: 'jim.m'
在倍频程4.2.1中,现在避免了警告,但仍然缺少“呼叫jim”行
第3部分:定义了零函数后,顶级代码将在两个版本中执行
这些行为(以及从版本3到版本4的行为变化)在哪里记录或控制?以下内容中未提及此类内容:
如何编写与3.x版和4.x版兼容的倍频程文件,或者如何使用额外选项调用4.x以兼容3.x版?即使定义了函数,如何在4.x中执行顶级代码
在4.x中,如果没有相同的文档,如何确定(没有尝试和错误)将自动调用什么函数(以及使用什么参数)?这个例子还不够详细,因为只有一个函数:如果有多个函数(joe和jim),相对于文件名是否匹配,顺序是否重要
编辑:我加入shebang(自包含脚本)是为了避免“问错问题”或过早地优化问题以达到我自己的“尝试解决方案”,但不管有没有它,行为都是一样的。我需要脚本:不使用八度音程的绝对路径,并接受额外的单独选项(我无法在4.2.1中将
--no-gui
合并到-qf
)。欢迎您进行简化。有不同的.m文件类型,包括(根据Octave 4.2.1):
$octave File
记录在倍频程的一个源文件(oct parse.yy)中:
执行脚本文件的内容。为了与Matlab兼容,还可以通过调用它定义的函数来执行函数文件,该函数不带任何参数且nargout=0
这里,因为您的文件以关键字function开头,所以它被视为函数文件,因此无论您是否调用jim
,函数jim
都会自动调用。因此,您可以从文件末尾删除表达式jim
,并看到该函数被自动调用。在版本3.4.3中,我认为它被假定为一个脚本文件
要解决此问题,您需要在文件开头添加一个表达式(函数关键字除外),以将其转换为脚本文件:
#!/bin/bash
# for-bash:
#{
exec octave -q --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
1;
function jim ()
printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim
如果shebang行与问题无关,请将其删除。我花了一段时间来分析它。让人们关注重要的事情。请参阅(特别是最简单的部分!)。谢谢。我做了一个编辑来解释。也许我最好把这首歌分成一个后记,这是一个很大的帮助。3.x和4.x兼容性仍未解决。我得到了补充警告(4.x似乎是一个警告的雷区),函数名与文件名在匹配时(脚本文件)和不匹配时(函数文件)都会发出警告。如果要禁用警告,可以将以下命令放入:
警告('off','Octave:function name clash')
。您可以找到所有警告的列表。我认为3.x的行为是一个bug,以后会被修复。如果您需要3.x,您可以同时安装4.x和3.x,并使用您想要的。我发现,当脚本文件具有相同名称的函数时,禁用警告的唯一方法是warning('off','all')如果使用-qf
,则无法及时执行此操作。强制我重命名octave 3中的函数(或脚本文件),以便在octave 4中使用它们。
$octave File
#!/bin/bash
# for-bash:
#{
exec octave -q --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
1;
function jim ()
printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim