• 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文件,第二段是调用的代码,打印两个参数的和

    1. Pro test_pro, A,B
    2. Print,A+B
    3. end
    1. >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
    2. % Compiled module: TEST_PRO.
    3. >>A = 1;
    4. >>B = 8
    5. >>test_pro,A,B
    6. 9
    7. >>

    1.2 进阶-输入参数可变

            实际使用的时候,常常使用的过程的入参个数都是可变的,最常见的就是Print过程,其后面可以接若干个输入参数,因此将讲解如何实现入参数可变。

            例子:下面第一段代码是过程Procedure文件,第二段是调用的代码,打印所有输入参数的和

    1. PRO Test_pro, A,B,C
    2. IF N_elements(C) EQ 0 THEN BEGIN
    3. Print, '未输入C,A+B=',A+B
    4. Return
    5. ENDIF
    6. Print, 'A+B+C=',A+B+C
    7. END
    1. >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
    2. % Compiled module: TEST_PRO.
    3. >>Test_pro,A,B,C
    4. A+B+C=hlz isOk
    5. >>Test_pro,A,B
    6. 未输入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文件,第二段是调用的代码,打印所有输入参数的和

    1. Function test_pro, A,B
    2. C = A+B
    3. Print,C
    4. Return,0
    5. end
    1. >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
    2. % Compiled module: TEST_PRO.
    3. >>A = 4
    4. >>B = 5
    5. >>test_pro(A,B)
    6. 9
    7. 0

            注:结果中第一个9是运行打印出来的,第二个数0,是因为 Return,0生成的。若需要输出参数则可以将代码Return,0改为Return,C即可。

    1. Function test_pro, A,B
    2. C = A+B
    3. Print,C
    4. Return,C
    5. end
    1. >>.RESET_SESSION
    2. >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
    3. % Compiled module: TEST_PRO.
    4. >>A = 4
    5. >>B = 5
    6. >>C = Test_pro(A,B)
    7. 9

    2.2 进阶-输入参数可变

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

           例子:下面第一段代码是过程Function文件,第二段是调用的代码,打印所有输入参数的和。

    1. Function Test_pro, A,B,C
    2. IF N_elements(C) EQ 0 THEN BEGIN
    3. D = A+B
    4. Print, '未输入C,A+B=',D
    5. Return,D
    6. ENDIF
    7. D = A+B+C
    8. Print, 'A+B+C=',D
    9. Return,D
    10. END
    1. >>.compile -v 'D:\Code\IDL\html_Example\test_pro.pro'
    2. % Compiled module: TEST_PRO.
    3. >>A = '江西省'
    4. >>B = '上饶市'
    5. >>C = '曹溪镇'
    6. >>D = Test_pro(A,B)
    7. 未输入C,A+B=江西省上饶市
    8. >>D = Test_pro(A,B,C)
    9. A+B+C=江西省上饶市曹溪镇
    10. >>

    最后再讲一个小技巧,可以用函数 KEYWORD_SET()判断是否有关键字,如果其参数已定义且非零,则返回1(true),否则返回0(false)。

    不对之处,敬请斧正!

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

  • 相关阅读:
    浅谈红黑树
    在阿里6年晋升3次,终获P8岗位,全靠这份PDF(Android研发岗)
    Redis基础篇
    移动硬盘删除的文件如何恢复呢?
    基于springboot+vue的智慧幼儿园管理系统(前后端分离)
    你们公司每次迭代周期多久?加班多么?
    【Rust日报】2022-06-22 Rust 连续第 7 年成为最受喜爱的语言
    关于前端如何下载后端接口返回content-type为application/octet-stream的文件
    Java注解
    普中51单片机学习(六)
  • 原文地址:https://blog.csdn.net/weixin_41649786/article/details/126866833