什么是例程,子例程,标签,函数,标签,过程,类方法,静态方法,实例方法,对象方法

news2024/9/23 19:18:46

文章目录

  • 什么是例程,子例程,标签,函数,标签,过程,类方法,静态方法,实例方法,对象方法
    • 编程语言
    • 例程 - `Routine`
    • 子例程 - `Subroutine`
    • 函数 - `Function`
    • 标签 - `Label`
    • 过程 - `Procedure`
      • 过程与其他方法区别
    • 类方法 - `ClassMethod`
      • `Not ProcedureBlock`关键字原理
    • 实例方法

什么是例程,子例程,标签,函数,标签,过程,类方法,静态方法,实例方法,对象方法

相信有很多小伙伴在刚接触ObjectScript编程语言(M语言)的时候,对一些“方法”的概念感到困惑,不同的人称呼这些“方法”各有不同。这些“方法”在功能上大体调用的都差不多,但是还有一些细微的区别。称呼“方法”的方式有很多,让人感到非常困惑,到底这些“方法”的区别是什么。这篇文章就带领大家搞清楚这些“方法”的概念与定义。

了解了这些“方法”的概念之后,就可以搞清楚关键字Not ProduceBlock的原理与使用。如果不清楚Not ProduceBlock作用,稍不注意就可能在使用方法过程当中引起一些严重的故障,例如死循环导致临时Global无限增长把磁盘撑爆,导致正常业务宕机。

编程语言

这里先明确一个概念,我们使用的编程语言在ISC的官方定义为ObjectScript对象脚本语言,实际上ObjectScript是底层MMumps)语言拓展而来。可类比JavaAndroidC#.Net

MUMPS语言,简称:M技术,全称:Massachusetts General Hospital Utility Multi-Programming System,麻省总医院多用途程序设计系统;算起来也是一种古老的语言了,与FORTRANCOBOL属于同时代的语言。因为这门语言最主要是用于医疗数据库方面,所以其应用并不像SQL ServerOracle等那么广泛。

例程 - Routine

例程是可调用的用户编写的代码块,它是ObjectScript程序,传统的编写M程序都是用的例程,因为在古早年代面向对象编程还没有出现。

一般保存的.mac文件为例程,mac文件名称为例程名称。int文件也称例程。包含ObjectScript代码的文件均可称之为例程。

注:例程指的文件,而不是某个具体具体例程中的方法。执行例程指的是执行.mac文件。

执行例程时,使用DO命令,如下所示:

 do ^routinename
  • routinename - 为例程文件名称。

创建例程文件Routine.mac包含如下代码:

	w "执行例程文件",!

在这里插入图片描述

编写如下方法执行例程:

ClassMethod Routine()
{
	d ^Routine
}
USER>d ##class(M.Method).Routine()
执行例程文件

注:例程只能去执行,不能获取例程返回值。

可能会见到如下执行方式:

s var = $$^RoutineName

这种方式并不是真正执行了例程,而是执行了例程的第一个方法。

创建例程文件Routine1.mac包含如下代码:

注:首行代码必须为子例程标签方法名称,如果为其他调用时会发生<PARAMETER>+1^Routine错误。

Routine()
	ret "这是例程的第一个子例程方法!"
Routine1()
	ret "这是例程的第二个子例程方法!"

在这里插入图片描述

注:如果直接用变量接收 .mac 文件名称返回值,默认调用 .mac 文件第一个子例程方法,并且该方法不能为标签或直接用例程返回变量。**

ClassMethod Routine1()
{
	s var = $$^Routine1
	w var,!
}
USER>d ##class(M.Method).Routine1()
这是例程的第一个子例程方法!

子例程 - Subroutine

子例程是例程内的命名代码块。通常,子例程以 LABEL 开头,可以接受参数,以 QUIT 语句结束,虽然以QUIT 命令结束,但是注意是不返回值的。

通常我们常说的例程方法实际上指的就是子例程。

要调用子例程,请使用以下语法:

d Subroutine^Routine
  • Subroutine - 子例程名称
  • Routine - 例程名称

子例程的形式为:

Label(arg) scopekeyword // 作用域关键字
//code 代码
quit // 注意,QUIT没有参
  • Label - 标签名称, 例程方法名称。
  • arg - 参数,是可选的以逗号分隔的参数列表。如果没有参数,则括号是可选的。
  • scopekeyword - 作用域关键字,可选的作用域关键字是 Public(子例程的默认值)或 Private
  • code - 执行代码。
  • quit - 退出命令,但是没有返回值。

Routine.mac中添加SubRoutine无参数子例程方法:

SubRoutine()
	w "这是例程的第一个子例程方法!"
	q 

编写调用方法如下:

注:如果子例程没有参数可省略括号。

ClassMethod Routine2()
{
	d SubRoutine^Routine
}
USER>d ##class(M.Method).Routine2()
这是例程子例程方法!

Routine.mac中添加SubRoutineParams有参数子例程方法:

SubRoutineParams(str)
	w "这是例程子例程方法!" _ "参数:"_str,!
	q 

编写调用方法如下:

ClassMethod Routine3()
{
	d SubRoutine^Routine("yx")
}
ClassMethod Routine3()
{
	d SubRoutineParams^Routine("yx")
}

注:因为子例程没有返回值,所以调用子例程时一般只去执行方法,一般使用do命令或job命令。

函数 - Function

函数是例程中的命名代码块。通常,函数以 LABEL 开头,可以接受参数,以 QUIT 语句结束,并且有返回值。这里与子例程不同。

也可以返回值。要调用函数,有以下有效的语法形式:

Label(args) scopekeyword
    zcode
    QUIT optionalreturnvalue
  • Label - 标签名称, 例程方法名称。
  • arg - 参数,是可选的以逗号分隔的参数列表。如果没有参数,则括号是可选的。
  • scopekeyword - 作用域关键字,可选的作用域关键字是 Public(子例程的默认值)或 Private
  • code - 执行代码。
  • quit - 退出命令,有返回值。

要调用函数,请使用以下语法:

d Function^RoutineName(params) /* 忽略返回值 */
s x = $$Function^RoutineName(params)
  • Function - 函数名称
  • RoutineName - 例程名称
  • params - 参数
  • $$ - 如果需要获取返回值必须包含$$语法。

Routine.mac中添加Fuction无参数方法,FuctionParams有参数子例程方法:

Fuction()
	w "这是例程函数方法!",!
	q "这是例程函数方法!"
	
FuctionParams(str)
	w "这是例程函数方法!"_ "参数:"_str,!
	q "这是例程函数方法!"_ "参数:"_str

忽略返回值调用方式:

ClassMethod Routine4()
{
	d Fuction^Routine
	d FuctionParams^Routine("yx")
}
USER>d ##class(M.Method).Routine4()
这是例程函数方法!
这是例程函数方法!参数:yx

获取返回值调用方式:

ClassMethod Routine5()
{
	s ret = $$Fuction^Routine
	w ret,!
	
	s ret = $$FuctionParams^Routine("yx")
	w ret,!
}
USER>d ##class(M.Method).Routine5()
这是例程函数方法!
这是例程函数方法!
这是例程函数方法!参数:yx
这是例程函数方法!参数:yx

注:在子例程与函数中默认的方法作用域是Public,如果想改为私有作用域可设置关键字Private

Routine.mac中添加FuctionPrivate私有函数方法:

FuctionPrivate() Private
	w "这是私有方法不允许调用",!
	q "这是私有方法不允许调用"

调用该方法:

ClassMethod Routine6()
{
	d FuctionPrivate^Routine
}

可观察到:调用私有子例程或函数方法时提示<NOLINE>错误。

注:当方法添加关键字 PRIVATE 时,该例程以外的程序调用不到。会报错 <NOLINE> 错误。只能在当前 mac 中使用。

USER>d ##class(M.Method).Routine6()
 
 d FuctionPrivate^Routine }
 ^
<NOLINE>zRoutine6+1^M.Method.1
  • 在函数与子例程中,声明的局部变量默认是共有的,也就是说全局变量。这种情况很容易发生变量覆盖产生死循环。
FuctionPublicVar() 
	s x = 5 
	s y = 10
	w "FuctionPublicVar中 x + y:" _ (x + y),!
	d FuctionPublicVar1()
	q x + y
FuctionPublicVar1() 
	w "FuctionPublicVar1中 x + y:" _ (x + y),!
	q x + y
ClassMethod Routine12()
{
	d FuctionPublicVar^Routine
}
USER>d ##class(M.Method).Routine12()
FuctionPublicVar中 x + y:15
FuctionPublicVar1中 x + y:15

为了将局部变量作用域当前方法内部需要在函数或子例程方法第一行声明new命令开启新的堆栈来初始化变量。

标签 - Label

标签是例程内的命名代码块。不接受参数,无返回值。

要调用标签,请使用以下语法:

d Label^Routine 

Routine.mac中添加Lable标签方法:

Lable
	w "这是一个标签方法",!

调用该方法:

ClassMethod Routine7()
{
	d Lable^Routine
}
USER>d ##class(M.Method).Routine7()
这是一个标签方法

注:即使给标签加上了返回值,实际上也获取不到。

Routine.mac中添加LableValue有返回值的标签方法:

LableValue
	w "有返回值的标签方法",!
	q "有返回值的标签方法"

调用该方法:

ClassMethod Routine8()
{
	s ret = $$LableValue^Routine
	w ret,!
}

由于标签没有括号,所以提示参数错误,不能获取返回值。

USER>d ##class(M.Method).Routine8()
 
LableValue
          ^
<PARAMETER>LableValue^Routine

常见的使用标签的方式:

  • 在类方法里抽取重复的部分。
  • Query里收取数据放入临时Global中。

示例如下:

代码中output就是标签的用法。没有参数没有回值。一般调用方式为 d label实际上相当于goto命令的使用。

ClassMethod QueryPersonByAgeExecute(ByRef qHandle As %Binary, pAge As %String = "", count As %Integer = "10") As %Status
{
	s pid = $i(^CacheTemp) // 注释1
	s qHandle = $lb(0, pid, 0) // 注释2
	s index = 1 // 注释3
	
	/* 业务逻辑代码 注释4 */ 
	s id = ""
	for {
		s id = $o(^M.T.PersonD(id))
		q:(id = "")
		q:(id > count)
		s data = ^M.T.PersonD(id)
		s i = 1
		s name = $lg(data, $i(i))
		s age = $lg(data, $i(i))
		continue:(age < pAge)
		s no = $lg(data, $i(i))
		d output
	}	
	/* 业务逻辑代码 */

	q $$$OK
	
output
	s ^CacheTemp(pid, index) = $lb(id, age, name, no) // 注释6 
	s index = index + 1 // 注释7
}

另外还一点需要注意,定义的标签如果没有退出命令例如 quit , retrun命令 是可以顺序执行之后的标签,直到遇到退出命令。

Routine.mac中修改Lable标签方法:

Lable
	w "这是一个标签Lable方法",!
Lable1
	w "这是一个标签Lable1方法",!
Lable2
	w "这是一个标签Lable2方法",!
Lable3
	w "这是一个标签Lable3方法",!
LableValue
	w "有返回值的标签方法",!
	q "有返回值的标签方法"

再次调用方法:

USER>d ##class(M.Method).Routine7()
这是一个标签Lable方法
这是一个标签Lable1方法
这是一个标签Lable2方法
这是一个标签Lable3方法
有返回值的标签方法

过程 - Procedure

Procedures - 在网上翻译为: [计算机]过程; (为解决一个特殊问题而专门设计的)文字程序。也有的叫程序,这里我们称呼为过程更为严谨。

Procedures 过程是一种特殊的ObjectScript方法。过程是在例程中功能最为强大的自定义代码块,也是最为推荐的形式。

Procedure 过程语法形式:

label([param[=default]][,...]) [[pubvar[,...]]] [access] {
	code
}
  • label - 过程名称。

  • param - 变量。

  • default - 参数的可选默认值。

  • pubvar - 公共变量。

  • access - 可选关键字,用于声明过程是公共的还是私有的。有两个可用值: publicprivate

  • code - 用大括号括起来的代码。

Procedure过程也称为过程块ProcedureBlock

注:ProcedureBlock是创建类时默认的关键字,也就是意味着类方法实际就是ProcedureBlock

要调用过程,请使用以下语法:

d Procedure^RoutineName(params) /* 忽略返回值 */
s x = $$Procedure^RoutineName(params)
  • 默认情况下,过程是私有的,这意味着只能从同一例程中的其他地方调用。如果外部调用则会提示<NOLINE>错误。

Routine.mac中添加Procedure过程方法:

Procedure(x, y) {
	w "x + y = ", x + y,!
	q x + y
}
ClassMethod Routine10()
{
	s ret = $$Procedure^Routine(2, 8)
	w ret,!
}
USER>d ##class(M.Method).Routine10()
 
 s ret = $$Procedure^Routine(2, 8)
 ^
<NOLINE>zRoutine10+1^M.Method.1
  • 如果过程需要外部调用,可以创建公共的过程,在过程名称后使用 Public 关键字。可以从其他例程调用公共过程。
Procedure(x, y) Public {
	w "x + y = ", x + y,!
	q x + y
}
USER>d ##class(M.Method).Routine10()
x + y = 10
10
  • 过程的另一特点是声明公共变量。公共变量相当于全局变量,环境变量,可用于所有过程。即此过程调用的过程以及调用此过程的过程都可以使用全局变量。要定义公共变量,请将它们列在过程名称及其参数后面的方括号中。

Routine.mac中添加ProceduresPublicVarProceduresPublicVar1过程方法并声明公共变量ab,局部变量c,并调用ProceduresPublicVar1过程方法:

ProceduresPublicVar(e, f) [a, b] Public{
	s a = 10
	s b = 20
	s c = 30
	w "e + f = ",e + f,!
	d ProceduresPublicVar1(9,9)
}
ProceduresPublicVar1(g, h)[a, b] Public{
	w "a:", $d(a),!
	w "b:", $d(b),!
	w "c:", $d(c),!
	w g + h,!
	w a + b,!
}

调用方法观察到ProceduresPublicVar1中公共变量ab$d判断是存在的,局部变量c不存在。

ClassMethod Routine11()
{
	d ProceduresPublicVar^Routine(5, 10)
}
USER>d ##class(M.Method).Routine11()
e + f = 15
a:1
b:1
c:0
18
30

注意:过程比以前在子例程,函数中提供的编码更先进。过程参数在过程内的作用域中自动是局部的。不需要 NEW命令来确保它们不会覆盖其他值,因为它们是过程专用的,此外,公共变量的显式声明允许引用应用程序中的全局变量。

过程与其他方法区别

  • 子例程Subroutine默认是公共的,不能返回值。
  • 函数Function默认是公共的,局部变量默认是共有变量,会覆盖同名外部变量,并且必须具有返回值。
  • 例程RoutineObjectScript程序。可以包括一个或多个过程、子例程和函数,以及三者的任意组合。
  • 建议使用过程Procedure,因为可以简化控制变量范围作用域。但是,在现有代码中,可能还会看到函数和子例程,需要能够识别并区分。在新的编码中不应该在编写函数与子例程。

下表总结了例程、子例程、函数和过程之间的差异:

 RoutineSubroutineFunctionProcedure
可以接受参数noyesyesyes
可以返回值nonoyesyes
可以在例程之外调用(默认情况下)yesyesyesno
其中定义的变量在代码执行完成后可用yesyesyes取决于变量的性质

注:在日常用法中,通常称呼“子例程subroutine”可以表示过程procedure、函数function或子例程subroutine

类方法 - ClassMethod

类方法是我们在日常开发中最常用的方法类型,它是可以直接调用的方法,在其他语言当中称为静态方法。

在类中定义类方法,使用如下格式:

ClassMethod MethodName(Arguments) as Classname [ Keywords]
{
//method implementation
}
  • MethodName - 方法的名称,方法名最长 180 个字符。

  • Arguments - 参数以逗号分割。

  • Classname - 可选的类名,表示此方法返回的值的类型。如果方法不返回值,则省略 As Classname 部分。

  • Keywords - 代表关键字。

要调用类方法的格式为:

##class(Package.Class).Method(Args)
  • Package.Class - 完全限定类名。

  • Method - 方法名。

  • Args - 方法参数。

  • ##class - 调用前缀,不区分大小写。

如果调用的类在同一级包下,或使用 IMPORT 导入包。可以直接使用类名。

##class(Class).Method(Args)

在同一个类中的方法互相调用或调用父类继承的方法,使用以下表达式:

..Method(Args)

定义一个类方法:

ClassMethod ClassMethod(x As %Integer, y As %Integer) As %Integer
{
		q x + y
}

调用该类方法:

USER>w ##class(M.Method).ClassMethod(5,10)
15

Not ProcedureBlock关键字原理

此时我们查看类方法对应的int文件:

在这里插入图片描述

可以发现在cls定义的类方法实际上就是生成的int例程的过程Procedure。两者一一对应。也是为什么类方法默认的局部变量的作用域都是在自己的方法内部。

在定义一个类方法声明Not ProcedureBlock关键字:

ClassMethod ClassMethod1(x As %Integer, y As %Integer) As %Integer [ ProcedureBlock = 0 ]
{
		q x + y
}

此时我们查看类方法对应的int文件:

在这里插入图片描述

可以发现在cls定义的类方法加上Not ProcedureBlock关键字后,生成的int文件中的该方法不是Procedure过程了,变成了函数Function或子例程Subroutine。前面小节讲过函数或子例程中局部变量为全局变量。也就是为什么在Not ProcedureBlock的类方法中需要加new命令原因了。

实例方法

实例方法实际上就对象方法,顾名思义调用该方法需要对象,有了对象我们就可以面向对象编程了。理解面向对象对于编程十分重要。

在类中定义实例方法,使用如下格式:

Method MethodName(arguments) as Classname [ Keywords]
{
//method implementation
}

注:实例方法只与对象类相关、因为没有对象的实例就不能执行实例方法,所以实例方法只有在对象类中定义时才有用。

要调用实例方法的格式为:

do obj.MethodName()
set value = obj.MethodName(args)
  • obj - 声明的对象,使用%New()来构造对象,相当于构造方法。
  • MethodName - 方法名称
  • args - 方法参数

创建一个简单的实例方法并调用:

Method Method(x As %Integer, y As %Integer) As %Integer
{
	q x + y
}
USER>w ##class(M.Method).%New().Method(5,10)
15

这里需要注意一点对象实际上也是可以调用类方法的。

USER>w ##class(M.Method).%New().ClassMethod(5,10)
15

创造价值,分享学习,一起成长,相伴前行,欢迎大家提出意见,共同交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/936007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】详细介绍模版初阶—函数模版、类模板

文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模版实例化 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;&…

【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析

1 RecyclerView简介 RecyclerView是一款非常强大的widget&#xff0c;它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候&#xff0c;我发现对于复杂的列表界面有很多资源可以参考&#xff0c;但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…

《Zookeeper》源码分析(二十三)之 客户端的命令处理过程

目录 客户端的命令处理过程1. ZooKeeper.create()2. ClientCnxn.submitRequest()3. SendThread.run()4. ClientCnxnSocket.doTransport()5. SendThread.readResponse() 客户端的命令处理过程 以创建节点命令为例&#xff0c;整个过程流程如下&#xff1a; CliCommand命令在抽…

1.Redis 5 环境搭建

一、环境搭建 如果是Centos8&#xff0c;yum 仓库中默认的 Redis版本就是5&#xff0c;直接yum install即可。如果是Centos7&#xff0c;yum 仓库中默认的 Redis版本是3系列&#xff0c;比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…

理解HTTPS/TLS/SSL(一)基础概念+配置本地自签名证书

文章目录 没有HTTPS时的样子场景模拟WireShark的Capture Filter和Display Filter设置Capture Filter启动程序设置Display Filter过滤抓到的包 结论 关于为什么加密更简洁有力的回答对称加密和非对称加密和CA证书密钥交换对称加密非对称加密CA机构和证书如何解决客户端和CA机构之…

centos安装oracle11g

版本&#xff1a;Oracle 11.2.0.4 创建用户 root执行以下命令 #创建database用户组 groupadd database #创建oracle用户并放入database组中 useradd oracle -g database #设置oracle密码 passwd oracle密码我设置的是database2023 安装oracle安装程序依赖程序包 root用户执…

在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速

WSL2使用NVIDIA Docker进行全栈开发和深度学习 1. 前置条件 1.1. 安装系统 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 跳过 1.2. 处理好网络环境 安装过程中需要访问国际网络&#xff0c;自行处理好。建议开启 tu…

驾驶员监控系统DMS系统功能规范

概述 文档范围 该文档阐述了DMS系统的功能场景、系统组成、接口需求等。 目的 该功能规范为DMS系统及周边件的开发提供参考。 缩写与定义 英文缩写 英文全称 中文描述 DMS: Driver Monitoring System 驾驶员监控系统 MPU: Micro Processor Unit 微处理器单元 IECU: …

windows安装mysql8.0.34的压缩包

文章目录 目录 文章目录 前言 一、下载安装包zip格式 二、使用步骤 总结 前言 一、下载安装包zip格式 MySQL :: Begin Your Download 二、使用步骤 解压缩之后在解压之后的目录里创建data和my.ini my.ini内容 # 设置mysql客户端连接服务端时默认使用的端口 port3306#默认…

<C++> STL_list

1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。list与…

YOLO目标检测——火灾和非火灾数据集下载分享

火灾和非火灾数据集应用场景&#xff1a;火灾预测和预警、火灾风险评估、火灾事故研究、智能消防系统等等 数据集点击下载&#xff1a;YOLO火灾和非火灾数据集1000图片.rar

uni-app里使用webscoket

实现思路和vue中是一样的。如果想看思路可以看这篇文章&#xff1a;websocket 直接上可以运行的代码&#xff1a; 一、后端nodeJS代码&#xff1a; 1、新建项目文件夹 2、初始化项目&#xff1a; npm init -y 3、项目里安装ws npm i ws --save 4、nodeJS代码&#xff1…

新仿百度文库网站源码 免费文库网站源码 文档分享平台源码 实现文档上传下载及在线预览

仿百度文库是一个以PHPMySQL进行开发的免费文库网站源码。主要特点如下&#xff1a; 界面仿照百度文库&#xff0c;使用户在使用时更加熟悉和舒适。支持文档的上传、下载和在线预览功能&#xff0c;方便用户分享和获取各种文档资料。用户可以对自己需要的文档进行悬赏&#xf…

单片机基础知识 06 (中断-2)

一. 定时器中断概念 51单片机的内部有两个16位可编程的定时器/计数器&#xff0c;即定时器T0和定时器T1。 52单片机内部多一个T2定时器/计数器。 定时器/计数器的实质是加1计数器&#xff08;16位&#xff09;&#xff0c;由高8位和低8位两个寄存器组成。 TMOD是定时器/计数器…

算法通过村第四关-栈白银笔记|手写栈操作

文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现&#xff08;手写栈&#xff09;2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示&#xff1a;我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…

2023年6月GESP C++ 四级试卷解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 1.高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点】编程环境(一级) 【解析】本题…

MVSNet 代码注释版 下载 (pytorch版)(注释非常详细,较源码结构有调整,使用起来更方便)

MVSNet 代码注释版 下载 &#xff08;注释非常详细&#xff0c;代码结构有所调整&#xff0c;使用起来更方便&#xff09; 本代码不仅进行了详细注释&#xff0c;还对源码做了相应调整&#xff0c;可以更方便用户使用&#xff0c; 结构上&#xff0c;更加清晰&#xff1b; 代…

docker,nvidia-docker安装

卸载先前的docker Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;请卸载它们&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc使用 Docker 仓库进行安装 设置仓库 更新 apt 包索引 sudo…

【vue2-helper插件】提供Mixins和组件库相关的类型提示、智能补全、跳转等功能~

Vue2-helper - 为你的 Vue2 开发增添智慧 ✨ &#x1f680; 辅助Vue2开发中的Mixins、组件库、Vue-router的智能补全、语义高亮、跳转支持、Hover 提示等&#xff0c;提升Vue2开发体验。 功能特色 ✨ ✅ 配置式缓存设计&#xff1a;秒级切换体验&#xff0c;让开发如丝般顺滑…

算法通关村——解析堆在数组和链表的应用

1. 堆 1.1 什么是堆&#xff1f; 堆是将一组数据以完全二叉树的形式存储在数组里面。一般有大根堆和小根堆。 小根堆&#xff1a;任意节点的值小于等于它的左右孩子&#xff0c;最小值在堆顶。 大根堆&#xff1a;任意节点的值大于等于它的左右还是&#xff0c;最大值在堆顶。…