图片缩略图

MATLAB Goto语句

version 1.8.0.0 (9.21 KB) by 扎马Aldahiyat
独一无二的。
4.0
29日评级

16下载

更新2011年2月17日

视图版本历史

查看许可协议

不用说,这段代码主要是出于娱乐目的,因为使用goto()被认为是懒惰的编程,是一场调试噩梦。有了这些,我向你们介绍goto。M,类似于其他编程规程中的goto()或jump()命令。

语法:

转到(指针,文件)
所有的goto()命令都需要跟一个'return'!

指针可以是表示m文件中的行号的整数,寻址m文件中的标签的字符串,由要连续跳转到的行号组成的数组,或由要跳转到的标签字符串组成的单元格数组。使用inf作为输入会跳转到代码的末尾,而使用NaN会跳转到随机选择的行号(这要归功于Loren,因为它不是故意的)。

第二个输入file是可选的。它声明了我们想要跳转到的代码文件(默认是当前的m文件)。

zip文件夹中包含24个示例文件。检查它们内部这个函数的使用,以便了解如何在自己的例程中实现goto()。下面展示了一个示例。

示例23:

标签={‘添加’、‘init1’、‘添加’;‘添加’;‘显示’};

转到(标签)
返回

%标签init1
= 0;
转到(结束)
返回

%标签添加
A = A + 1;
转到(结束)
返回

%标签init2
= 0;
转到(结束)
返回

%的标签显示
对话框(num2str (a))

%标签结束

引用作为

扎马Aldahiyat(2021)。MATLAB Goto语句(//www.tatmou.com/matlabcentral/fileexchange/26949-matlab-goto-statement), MATLAB中央文件交换。检索

意见及评分(55)

穆罕默德elsaeidy

完美的

Abinav Shankar

当我尝试使用goto()时,我在goto()文件中得到以下错误。我是不是漏掉了什么?

使用goto时出错(第638行)
错误:至少缺少一个END:语句可能从这里开始。

腻过乔治奥

嗨,我想在下面的代码片段中使用goto语句:

第九= 1:Lx;iy = 1:供应;信德= 1:N;
%标签重复
vv =兰德(stream1 2 1);
z1 = 1.0 - -2.0 * (1);z2 = 1.0 * -2.0 (2);
z = z2 ^ z1 ^ 2 + 2;
如果z > 1;
vec(第九、iy信德,1)= 2.0 * z1 * sqrt (1.0 - z);
vec(第九、iy信德,2)= 2.0 * z2 * sqrt (1.0 - z);
vec(第九、iy信德,3)= 1.0 - -2.0 * z;
其他的
转到(重复)
返回
结束;

结束;结束;结束;

我得到以下错误:
索引超出数组边界。

goto错误(第276行)
如果(strcmp (funz{指针}(1:3),“如果”))…

知道为什么会这样吗?

谢谢

塞巴斯蒂安。

amr mousa

Mahesh犯错误

I get the error Undefined function or variable 'goto' in 2013(b)…解决方案是什么?

盖伯瑞尔议会

感谢Husam张贴这篇文章!你的例子在我的计算机(2017a和2013a)中工作得很好,但在我正在编写的代码中却不行。最初的代码是Fortran 77与许多GoTos,我已经转换到matlab产生一个多嵌套的代码,当我运行你的函数,我得到错误:
如果~(where-var ==length(num_range)....

对于如何解决这个问题,我们非常感激。谢谢!

科比·Bilou

谢谢,好工作

特别是示例1在脚本中的spécifique行

安普年代

当点击运行图标时,它显示一个错误信息,'语法错误:"filename"不能运行。现在输入输入参数,然后按回车键运行。您输入的值将被设置为默认输入时,您点击运行按钮在未来'。我不明白那是什么意思。我使用goto(指针)类型命令。MATLAB2015a

分钟Adhikari

这是很棒的

亚历杭德罗门多萨

tabw

它不会工作在R1010b Matlab。
我不知道为什么。我试过你的例子。但是matlab在运行goto()时崩溃了。

阿米特

@Iylia:完整的代码太长了,相关部分会是:
%标签num
...
...
如果条件
转到(“num”)
返回
结束
...

lylia

你到底写了什么?

阿米特

得到以下错误:
使用goto时出错(第637行)
错误:至少缺少一个END:语句可能从这里开始。

lylia

谢谢,非常感谢!我用的是Matlab R2013b,这个函数工作得很完美,它做了它应该做的事情。我花了一些时间来知道如何正确地使用它,但我猜,当我发现这个功能时,我欣喜若狂,我没有仔细阅读说明。我别无选择,只能使用goto函数。再次感谢你:D

Chockalingam Kasi

你好,扎马. .错误是我从来都不能在我的代码中运行代码。然而,我能够在许多其他应用程序中运行它而没有问题,主要是为了测试目的,但对于这个特定的应用程序,它没有功能。

扎马Aldahiyat

就像John说的,这个函数应该只在非常特殊的情况下使用,即你将围绕goto()函数编写整个代码,就像MoDu的论文,这是一个非常特殊的代码。或者,如果你只是想找点乐子,探索MATLAB之外的其他功能。也就是说,你甚至没有写错误,它说什么?

Chockalingam Kasi

嗨,约翰,

非常感谢!它的工作原理!我完全同意你的建议,但我只是困惑,我怎么会错过这么简单的解决方案,到处寻找更复杂的东西!!

不过. .再次感谢,干杯!

约翰D 'Errico

Chockalingham——你误用了本应避免使用的工具。相反,学会使用while。您的代码将得到改进。它会加速。它将变得更可读,更无bug。

Chockalingam Kasi

你好,

请您解释一下“goto”声明的以下应用。

我想比较随机值到一个数组,并生成一个新的数组和am使用'goto'函数在if/else语句。不知怎么的,这似乎对我不起作用。你能告诉我是否正确使用了goto吗?

附件是我代码的错误部分。

j = 1:1:24
对于t = 1:1:14
%标签点头
no_of_dev =圆(兰德* 500);
current_max_dev = rg_dev_avail (j: t);

如果“no_of_dev > current_max_dev .
goto('noD') %如果条件不满足,goto标签noD
返回
其他的
new_rg_dev_list (j: t) = no_of_dev;
结束
结束
结束

谢谢!

默罕默德

%标签开始
全局j new_pop Best_Solution Zeta_Best_Solution Best_Solution1 Zeta_Best_Solution1;
%每一代产生10个种群
全球Npop;
Npop = 100;
Npop流行= Iniziatitation_Population(10日);
n = 1;
如果Zeta_Best_Solution < = 0.64;
转到(“开始”)
结束
但是我得到了如下错误信息:
使用goto时出错(第638行)
错误:非法使用保留关键字"elseif"。

mainGA2错误(第85行)
转到(“开始”)

我该怎么办?请给我使用你的功能的建议

问候

亚伦

这段代码非常有用,因为我不想把非常长的m-file的2/3放到if语句中,但不幸的是,我遇到了一个问题,因为我有一个continue语句,我想使用goto进入代码部分。我注意到你在2010年提到过,你在考虑增加对continue和break语句的支持……金宝app有这样做的计划吗?

李笨蛋

我试过这个例子和它的作品。然而,当我把它应用到我自己的程序时,我遇到了一个问题,它出来了“??索引超出矩阵维度。“当我在335行中使用goto(137)时,就会发生这种情况。但是当我使用第294行(同一程序的另一部分)中的goto(314)时,它工作。这是否意味着goto函数对于大的间隙不适合使用?

杰里

嗨,我想你错过了以下代码的情况:

Temp =[1、2、3;
2、3、4;
3、4、5);

在这种情况下,goto文件报告错误,也许你应该添加一些判断“…,或完整的句子。

扎马Aldahiyat

迭戈,谢谢你的反馈,但你为什么不给文件相应评级呢?:-)

关于多行输入,你是对的,我已经为更重要的输入做过了(for, WHILE, IF, BREAK,等等),但从编程的角度来看,为以“…”区分的多行输入做这件事是相当简单的。我想这是一个更新的原因。

很高兴文件帮了忙,再来吧!

迭戈

怎么样,很好!

我需要一模一样的东西。在我的例子中,FOR循环将使我的脚本不优雅,因为代码中使用了单元格和文本标记。

使用GOTO函数,我构造了一个没有缩进或新的文本标记的for循环。

我可以对你的工作做的贡献是一个错误,当我的代码有不止一行的构造时,就像下面的例子:

A =[1,2,3,…]
4、5、6);

2 .选B
4 5 6];

在这些情况下,Matlab返回该行是一个无效的语句。我想它这样做是因为你的函数不处理这些语句。你的代码已经在FOR, WHILE, IF等语句中完成了,只剩下这些其他语句。

请原谅我的英语很烂,我来自巴西,不会说英语。

再一次感谢您!
--
迭戈·达席尔瓦·德梅代罗斯

扎马Aldahiyat

@nazish,
这就是一个合适的goto()的工作方式。

如果您希望循环继续迭代,只需使用goto(),而不需要在后面加上return()。

下次如果你有问题,请在给文件评分之前给我发电子邮件。

nazish

这个函数在for循环和if语句中不工作,在我看来,如果它执行一次函数,for循环不会执行下一次迭代:(,我尝试了很多次。

kiran辛格

只有一个

bishanka bhowmik

汗Sadaf

干得好!

FuzzyPanda_

在编写汇编代码之后,goto是任何编程语言都不能缺少的一条指令。谢谢你扎马。

MoDu

我的论文需要这个函数(真的,没有其他方法),到目前为止它工作得很好。

罗伯•坎贝尔

例1对我很管用……
虽然我必须承认我永远不会用它,但看到这个有点好笑。

扎马Aldahiyat

奥列格,你必须原谅我的怀疑,但在发布它之前,我尝试了这个例子,它对所有人都有效,你声称的错误只是没有逻辑意义。

下面是具体的代码片段:

...
如果比较字符串(funz{指针}(1:3),“如果”)

气孔导度= evalin(调用者,funz{指针}(3:结束);% <...

指针在if语句中被引用,而错误发生的唯一方式是如果if语句返回true,这是不可能发生的,如果'pointer'没有在MATLAB中定义的话。

您是否尝试调试并找出错误发生的原因?比如,在错误发生之前,MATLAB窗口显示了什么(任何数字?),错误发生在哪个递归中,您使用的是哪个版本的MATLAB,等等。

奥列格•科马罗夫

@Husam Aldahiyat
真遗憾你连想都没想过我是在以你为榜样,却不管用。

Straigthforward……

扎马Aldahiyat

@Bruno
实际上,我在编程/测试这个函数时得到了很多乐趣。看到积极的回应会增加乐趣。

@Matt邓纳姆
谢谢你的五块钱!希望这个功能对你有所帮助。

@claus
我很高兴你觉得很有趣。我猜这是有趣的想象MATLAB从一行跳转到另一行,LOL!=)

@Oleg科马罗夫
很遗憾,您不知道如何使用一个输入的直接函数。

@Rody Oldenhuis
谢谢你的评论和评价。我觉得即使是马虎凌乱也很管用®代码不需要goto,但如果它对您或其他人有帮助,那无疑是好消息!

@Malcolm麦克莱恩
你可以使用if true/if false, ctrl+r/ctrl+t,当然还有goto:-)

@Cris Luengo
谢谢你的夸奖。我想如果我投入更多的时间,我就能写出更好看的代码,但我很高兴有人费心检查我的代码。

感谢所有积极的回应,我将工作和提交一个更好的版本很快!

短剑Luengo

@Malcom:
你可以在这两个代码块周围加上一个"if 0"/"else"/"end"。第一次打0到1,然后回到0来摆弄打印输出。我经常这样做。

@Rody:
即使是草率的、快脏的、混乱的、一次性使用的代码,使用常规的流控制也比使用GOTO语句简单得多。我不反对GOTO语句,如果MATLAB自带一个,也不会有什么坏处,但它的用途非常有限,主要用于从错误中恢复。实际上,考虑到TRY/CATCH的工作情况,它甚至可能在那里没有用处……

尽管如此,这篇提交的文章写得很好,并展示了MATLAB功能的一些有趣用法。我从未想过会有这样的功能。

该导弹

有用的,谢谢

马尔科姆·麦克莱恩

Matlab应该有一个goto。

原因是您经常希望在scratch脚本中跳过代码。目前唯一的方法是注释掉,这也会产生问题。
例如,脚本的前100行执行冗长的函数,最后100行以良好的格式输出结果。在测试期间,您需要对打印输出进行调整,以使其更加美观。因此,您希望能够运行一次分析,将结果放到工作区中,然后快速运行几次格式化代码,直到正确为止。

Rody Oldenhuis

我能想到至少一个真正有用的应用:写草率,快速,肮脏,混乱,一次性使用,它只是工作®我知道这里的大多数人都经常这么做,承认吧!所以在我看来,与其间接否认这一点,并禁止所有帮助和促进这种草率编程的函数,还不如说是有点目光短浅。

当然你不会使用它在你的任何“真正的”工作,其它东西都看到:1)作者给予警告,为什么你不应该这样做,和2)如果你仍然这样做,你很快就会发现为什么转到()不是太大。

给这个提交打一颗星,因为你认为人们会在“严肃的”函数或“教坏习惯”中使用GOTO(),这只是没有认识到这个函数的真正用途(或可能的用途)。直接跳到纯粹的程序员的马背上,对GOTO()大喊fire and death是愚蠢的。

实际上这是一份很好的工作。我给它4星。

拉尔夫

奥列格•科马罗夫

从两个角度来看,这个提交是行不通的:
-在某种意义上是行不通的,它会给我一个错误
-教坏习惯

考虑示例1。

运行,得到:
???使用==> evalin出错
未定义的函数或变量指针。

Error in ==> goto at 69
气孔导度= evalin(调用者,funz{指针}(3:结束);

为什么它教坏习惯?

= 5;
A = A - 1;
disp (a)
如果> 0
转到(4)
返回
结束

因为下面的代码比前面的代码简单得多:
= 5;
而> 0
A = A - 1;
disp (a)
结束

如果你的目标是让你的代码变得缓慢和模糊,那么你可以利用这种提交,否则只需要学习基本的逻辑语句。

扎马Aldahiyat

卡米尔,这个手术绝对不是为了专业用途,只是为了好玩。谢谢你的反馈,更新正在进行中。

卡米尔Makiela

我给它3,因为这是我能找到的唯一可行的goto语句。然而,这个程序绝对不是专业的。我用Gewek的算法从截断的正态分布中绘制(从GAUSS中重写)来测试它。I比接受-拒绝绘图慢得多,即使它不应该(并且在GAUSS代码的情况下不是)。
但总是有新的东西!

顺便说一下:胡萨姆,你可能想修改一下代码。该函数不关闭文件,最终导致fidd溢出(在我的计算机上,它通常在100-120平局后破坏模拟)。我只是简单地在每次绘制开始前推fclose('all'),但最好是在goto函数中修复。

Rizwan阿里

利奥凯

利奥凯

做得好:D在这里测试,它实际上非常快!谢谢你!

洛伦佐

泊位

一个最好的Matlab函数发现!
非常有用和有趣
有时它可以在代码中节省很多空间。
谢谢你扎马! !

马特·邓纳姆

像布鲁诺这样的评论激怒了我。作者明确表示这只是为了“娱乐”。我将通过这个函数来寻找解决相关问题的思路。在编写元工具来分析代码等时,效率通常不是主要问题。

努尔

布鲁诺陈德良

即使是出于娱乐目的,我们也可以快速浏览一下使用EVALIN对原生Matlab进行野蛮仿真的大量代码。我打赌这是一个缓慢,不可靠和噩梦维护。

生命太短暂了。我会帮作者一个忙:给它打1颗星,这样他就不会在这上面浪费更多时间了。

扎马Aldahiyat

正如示例清楚地显示的那样,使用goto总是可以被绕过的,但是测试和查看它是非常有趣的。

同样,如果包含多个命令的行不包含保留的MATLAB单词,那么这些行应该没有问题。如果这篇文章没有被1/5的评级轰炸,那么我可以更新它,加入继续和中断声明的支持。金宝app

MATLAB版本兼容性
创建R2007b
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!