本博客将介绍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)。
不对之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索!