如果从coder的角度理解盗梦空间的逻辑其实并不复杂,只是一个子函数的循环调用问题.有一部分信息通过public变量传送给下级的sub函数,而另外的信息在子函数中出现的变量如果没有正确的return给父函数并且没有释放这个变量就会造成“存储渗漏”直到程序的结束,而在递归函数中如果一旦出现死循环的话导致无法结束的话就会把程序的运行时间拖至无限大,所以主角在迷失域使用自杀的方式回到现实世界,而在程序里面我们通常使用exit命令强行结束程序。

程序设计的辅助函数

extern的用法

  • ##### 可以扩展外部变量的作用域

如果在程序中某个地方定义了一个外部变量,
那么使用extern就可以扩展它的作用域。

举个栗子

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 
 6 int main()
 7 {
 8     extern int t;  //将外部变量t的作用域拓展到从此处开始
 9     fun();
10     cout << "t=" << t << endl;
11     return 0;
12 }
13 
14 int t;
15 void fun()
16 {
17     t = 100;
18 }

 输出为

图片 1

如果没有extern那句,主函数在执行到  cout << “t=” << t << endl 
这句时,就不知道 t 是啥玩意。

但是要说明一点, 即使没有extern那句, fun() 函数也能顺利执行。

栗子:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 
 6 int main()
 7 {
 8 //    extern int t;
 9     fun();
10     return 0;
11 }
12 
13 int t = 3;
14 void fun()
15 {
16     t += 100;
17     cout << "hhh" << t << endl;
18 }

 

 输出为

图片 2

这是因为int t = 3 这句的作用域已经包含了fun()函数了。

 

  • ### 将外部变量的作用域拓展到其它文件

当你想在一个工程里用多个文件来写整个大程序,那么你在一个文件里定义了一个全局变量(外部变量),
不作声明的话,另一个文件是找不到这个变量的,
不像写在一个文件里那么简单。

这时就可以用extern来搞事了。其实这一点完全可以类比上一个作用,也就是说明extern不仅可以在一个文件里扩展作用域,在整个工程里都是可以的。

栗子:

 //main.c文件
 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 
 6 int t;
 7 int main()
 8 {
 9     t = 1;
10     fun();
11     cout << "t=" << t << endl;
12 }

//另一个.c文件
1 #include <iostream>
2 
3 using namespace std;
4 
5 extern int t;
6 void fun()
7 {
8     t += 100;
9 }

输出

图片 3

 

有必要说明一下,extern声明的必须得是外部变量,即定义在函数外面的变量,
要是你把第一个点的程序里面int t 写在子函数内部,
就会报错。第二点的也不能写在子函数里面。

 /***************************分割线***********************/

MATLAB学习笔记——函数式文件

以前写程序是,基本不管static和extern,一个工程文件也只有一个c文件。今天尝试用多个文件来写,自然就涉及到这两个关键词的使用,自己查了些资料,并且做了些实验,总结如下。

其他:  

  1.matlab语言提供了函数nargin来控制输入变量的个数,即可以实现不定参数输入的操作。

   图片 4

  2.matlab语言还提供了另一个针对输入变量的函数varargin。该函数可以实现不定数目输入变量的函数的程序设计。此时,对函数的一切输入变量均将存储在以varargin命名的单元型数组中。

  图片 5

>> [a,b,c]=test2([90,89,60],[79,89,66],[99,98,100])

a =
   89.3333
b =
   32.6667
c =
   33.3333

 

说明:

  • 函数式文件主要用于解决计算中的参数传递和函数调用的问题
  • 函数式的标志是它的第一行为function语句
  • 函数式文件可以有返回值,也可以没有。
  • 函数式文件执行之后,只保留最后结果,不保留任何中间过程,所定义的变量也仅在函数内部起作用,并随着调用的结束而被清除。即除无特殊声明外,其变量均为局部变量

 注意:存储函数式文件时文件名要与主函数名相同。

static的用法

  • ### 阻止extern来扩展作用域

比如上面第一点中如果在int
t
的前面加上static,那么extern不起作用了,就会报错。第二点也是这样。通常一个大工程会分给好多人一起写,如果一个人确定自己这个文件里的这个变量不会被其它文件使用,又不想被其它文件误用,
就加个static,起到隔离的作用。

  • ### 使某个局部变量在函数调用结束后保留原值

我们知道在一个函数里定义的变量,会在函数调用结束后被抹去,就像做梦一样,什么都没了。但是如果在函数里的某个变量前加一个static,
它的值就不会消失,好比你下次做梦还能接着上次的做。。。

举个栗子

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 
 6 int main()
 7 {
 8     fun();
 9     fun();
10     fun();
11 }
12 
13 void fun()
14 {
15     static int t = 1;
16     t++;
17     cout << t << endl;
18 }

输出

图片 6

如果没有static,就会输出3个2。

也就是说static int t = 1;
这句话只会执行一遍,即初始化t 只有一遍。之后再到这里,它会直接跳过。

 

但是有人会说,这个不就和写一个大全局变量的用法重复了吗。确实,如果你在main函数前面直接定义一个全局变量int
t; 实现效果是一样的

代码为

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 int t = 1;
 6 int main()
 7 {
 8     fun();
 9     fun();
10     fun();
11 }
12 
13 void fun()
14 {
15     t++;
16     cout<< t << endl;
17 }

输出一样。

 

但是,两种做法其实并不一样,要是用static来写,那么只是把t
的生存期变长了,作用域并不会改变。也就是说,t
这个变量虽然在函数调用结束后,其值并不会消失,但是并不能在函数外面使用它。

它只能在函数里产生作用,在函数外面根本不知道有这个东西,甚至也可以定义一个t
的变量,而且并不会产生冲突。好比说,你梦里面干的事只能在你梦里干,就算你每次做梦都接着上次的做,然而现实生活中别人是不知道你做了啥梦。

栗子

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void fun();
 5 
 6 int main()
 7 {
 8     int t = 100;
 9     fun();
10     cout << t << endl;
11     fun();
12     t++;
13     fun();
14     cout << t << endl;
15 }
16 
17 void fun()
18 {
19     static int t = 1;
20     t++;
21     cout<< t << endl;
22 }

输出为

图片 7

此时就像正常没有static 来处理t 一样,二者不会产生冲突。很神奇。

 

在自己瞎搞的过程中,我还发现一个现象。当你把刚刚那个代码中main 函数里的
int t = 100; 拿到main 函数外面,当成全局变量, 输出是一样的。

不仅如此,你把它写成全局变量后,即使再把子函数里的static去掉,
输出还是一样的。

这就说明了,一个大全局变量遇到子函数里定义的长得一样的小变量,大全局变量并不会影响小变量,读者可以自己试试。

我想可以这样理解这种情况,当你定义了一个大全局变量后,全局都可以使用,但是要是你在子函数中(不是main函数)也定义了一个相同的变量,无论你是否用static,子函数就按子函数定义的来搞,子函数结束,并不会影响你的大全局变量。

 

语法:

  图片 8

说明:

  1.函数定义行定义了函数的输出和输入变量的个数和顺序。

  2.H1行和帮助文本可以使用help命令或者lookfor命令调出。

子函数与局部函数:

  主函数可以使用子函数来扩充其功能。在函数文件中题头定义的函数为主函数,而在函数体内定义的其他函数均被视为子函数。子函数只能为主函数或同一主函数下的其他的子函数所调用。

  图片 9

局部函数与子函数的区别:

style=”background-color: initial”>  局部函数可以被其父目录下的所有函数所调用,而子函数则只能被其所在M文件的主函数所调用;在函数编辑的结构上,局部函数与一般的函数文件的编辑相同,而子函数则只能在主函数文件中编辑。

用户交互函数

  键盘输入函数包括函数input及keyboard。
  1.函数input用于提示用户输入指定参数的值,调用格式:
    var=input(‘提示性语句’)

  输入以回车键结束。

  2.另一种输入函数为keybroad,该函数出现在M文件中时,将终止程序的运行,此时用户可以查看运算过程中各变量的值必要时也可进行适当的干涉及编辑。同时该函数在matlab语言中均可应用,直到键入return并回车,这时程序返回中断处,继续执行其余代码。

中断函数pause:

matlab也提供了一种中断函数pause,其调用格式:
  pause(n)
  该命令的作用是中断程序运行并等待n秒。如果不带参数,则程序无限期中断,直到用户在键盘上键入任意键。

 

引入函数式文件

相关文章

网站地图xml地图