IDL学习:语法基础-过程和函数

        本博客将介绍IDL语言中的文件模式,即执行文件中包含一个或多个功能模块代码的文件(后缀为“.pro”文件),这些功能模块只能是过程(Procedure)或函数(Function)。IDL中和matlab一样,处理命令行运行命令,也可以通过文件的方式来运行代码,不同的是IDL文件编写的代码需要编译或则调用来运行。

        注:matlab语言无需编译且没有过程Procedure概念,其实也就相当于IDL语言过程文件去掉首尾行。  

        过程与函数不同之处在于,过程是没有输出参数的函数是至多有一个输出参数(若需要输出多个参数,需以结构体、哈希表等形式进行输出参数)。

1. 过程

1.1 创建过程文件

        过程是包含若干个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
>>

1.2 进阶-输入参数可变

        实际使用的时候,常常使用的过程的入参个数都是可变的,最常见的就是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过程,后面不能接任何变量!!!

2. 函数

2.1 创建过程文件

        函数是包含若干个IDL代码构成的且能够进行编译的集合,过程具有严格的格式要求,必须以“Function”开始,且以“End”结尾,最多有一个输出参数,运行时必须至少有一个相关联的Pro文件进行编译。语法如下:

Function Function _Name, argument1, ..., argumentn

   . . .

END

调用代码:

Function _Nameargument1, ..., argumentn)

Value = Function _Nameargument1, ..., 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

2.2 进阶-输入参数可变

       实际使用的时候,常常使用的函数的入参个数都是可变的,因此将讲解如何实现入参数可变。

       例子:下面第一段代码是过程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)。

不对之处,敬请斧正!

路漫漫其修远兮,吾将上下而求索!

你可能感兴趣的:(IDL,学习,IDL)