本博客将介绍IDL语言中的文件模式,即执行文件中包含一个或多个功能模块代码的文件(后缀为“.pro”文件),这些功能模块只能是过程(Procedure)或函数(Function)。IDL中和matlab一样,处理命令行运行命令,也可以通过文件的方式来运行代码,不同的是IDL文件编写的代码需要编译或则调用来运行。
注:matlab语言无需编译且没有过程Procedure概念,其实也就相当于IDL语言过程文件去掉首尾行。
过程与函数不同之处在于,过程是没有输出参数的,函数是至多有一个输出参数(若需要输出多个参数,需以结构体、哈希表等形式进行输出参数)。
过程是包含若干个IDL代码构成的且能够进行编译的集合,过程具有严格的格式要求,必须以“Pro”开始,且以“End”结尾,不能有输出参数,运行时必须至少有一个相关联的Pro文件进行编译。语法如下:
PRO Procedure_Name, argument1, ..., argumentn
. . .
END
调用代码:
Procedure_Name, argument1, ..., argumentn
Procedure_Name表示过程名(文件名必须和过程名一致);argumentn表示参数;
例子:下面是一个简单的过程文件代码,第一段是过程Procedure文件,第二段是调用的代码,打印两个参数的和
- Pro test_pro, A,B
- Print,A+B
-
- end
- >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
- % Compiled module: TEST_PRO.
- >>A = 1;
- >>B = 8
- >>test_pro,A,B
- 9
- >>
实际使用的时候,常常使用的过程的入参个数都是可变的,最常见的就是Print过程,其后面可以接若干个输入参数,因此将讲解如何实现入参数可变。
例子:下面第一段代码是过程Procedure文件,第二段是调用的代码,打印所有输入参数的和
- PRO Test_pro, A,B,C
- IF N_elements(C) EQ 0 THEN BEGIN
- Print, '未输入C,A+B=',A+B
- Return
- ENDIF
- Print, 'A+B+C=',A+B+C
- END
- >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
- % Compiled module: TEST_PRO.
- >>Test_pro,A,B,C
- A+B+C=hlz isOk
- >>Test_pro,A,B
- 未输入C,A+B=hlz is
从运行结果可知,Test_pro,A,B和Test_pro,A,B,C都成功实现计算。其关键之处在于使用N_elements()函数和If语句来判断是否有输入,从而根据实际输入来分别计算。
注:再次强调,过程是无输出的,若要提前结束运行,只需加一个Return过程,后面不能接任何变量!!!
函数是包含若干个IDL代码构成的且能够进行编译的集合,过程具有严格的格式要求,必须以“Function”开始,且以“End”结尾,最多有一个输出参数,运行时必须至少有一个相关联的Pro文件进行编译。语法如下:
Function Function _Name, argument1, ..., argumentn
. . .
END
调用代码:
Function _Name(argument1, ..., argumentn)
或
Value = Function _Name(argument1, ..., argumentn)
Function_Name表示函数名(文件名必须和函数名一致);argumentn表示参数;
例子:下面第一段代码是过程Function文件,第二段是调用的代码,打印所有输入参数的和
- Function test_pro, A,B
- C = A+B
- Print,C
- Return,0
- end
- >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
- % Compiled module: TEST_PRO.
- >>A = 4
- >>B = 5
- >>test_pro(A,B)
- 9
- 0
注:结果中第一个9是运行打印出来的,第二个数0,是因为 Return,0生成的。若需要输出参数则可以将代码Return,0改为Return,C即可。
- Function test_pro, A,B
- C = A+B
- Print,C
- Return,C
- end
- >>.RESET_SESSION
- >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
- % Compiled module: TEST_PRO.
- >>A = 4
- >>B = 5
- >>C = Test_pro(A,B)
- 9
实际使用的时候,常常使用的函数的入参个数都是可变的,因此将讲解如何实现入参数可变。
例子:下面第一段代码是过程Function文件,第二段是调用的代码,打印所有输入参数的和。
- Function Test_pro, A,B,C
- IF N_elements(C) EQ 0 THEN BEGIN
- D = A+B
- Print, '未输入C,A+B=',D
- Return,D
- ENDIF
- D = A+B+C
- Print, 'A+B+C=',D
- Return,D
- END
- >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
- % Compiled module: TEST_PRO.
- >>A = '江西省'
- >>B = '上饶市'
- >>C = '曹溪镇'
- >>D = Test_pro(A,B)
- 未输入C,A+B=江西省上饶市
- >>D = Test_pro(A,B,C)
- A+B+C=江西省上饶市曹溪镇
- >>
最后再讲一个小技巧,可以用函数 KEYWORD_SET()判断是否有关键字,如果其参数已定义且非零,则返回1(true),否则返回0(false)。
不对之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索!