跳转至

在 IDL 中使用包含文件的好处

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/the-benefits-of-using-include-files-in-idl

10930 评价本文:

尚无评分

在 IDL 中使用包含文件的好处

匿名 2015年4月30日 星期四

在 IDL 代码中,你可以使用 @ 符号后跟文件名来包含另一个文件的内容。语法请参阅在例程中使用包含文件

当使用此方法时,编译器会字面上地将包含文件的整个内容插入到该位置。这有很多用途,包括错误处理和日志记录、调试、版本跟踪以及设置预定义变量。你甚至可以使用此技术一次性更改多个例程的 COMPILE_OPT 选项。

请记住,包含文件的内容不需要包含完整的过程或函数,它可以短至单行。以下是一些示例:

错误处理和日志记录

包含文件最常见的用途之一是错误处理;文件包含一个捕获块,用于处理错误并从中恢复。也许错误也会被记录到一个文件中。这是一个名为 my_error_handler.pro 的文件示例,可以放在任何例程的开头。

Catch, error
if error ne 0 then begin
  Catch, /CANCEL
  log_file = 'C:\algorithm_results\errors.txt'
  traceback = Scope_Traceback(/STRUCTURE)
  OpenW, unit, log_file, /GET_LUN
  Printf, unit, 'Error caught in ' + traceback[-1].ROUTINE + ', scope level ' + StrTrim(traceback[-1].LEVEL, 2)
  Printf, unit, !ERROR_STATE.msg
  Free_Lun, unit
  Message, /RESET
  result = Execute('Return', 1, 1)
  if ~result then begin
    result = Execute('Return, 0', 1, 1)
  endif
endif

这些 execute 调用的目的是让这个文件既可以包含在过程中,也可以包含在函数中,而无需担心基于是否需要返回值而产生的编译错误。

调试

包含文件对于添加调试语句很有用。例如,如果你想在 IDL 进入例程时打印出函数名,你可以将此内容放入一个包含文件中,并将其包含在所有例程的开头:

traceback = Scope_Traceback(/STRUCTURE)
pro_or_func = traceback[-1].IS_FUNCTION ? 'function' : 'procedure'
Print, 'Entering ' + pro_or_func + ': ' + traceback[-1].ROUTINE

这样做的好处是,当你完成调试时,你不需要编辑你编写的每个例程来移除调试语句;相反,你可以简单地将包含文件更新为一个空白文件,这样最终代码中就不会编译进任何调试内容。

版本跟踪

如果你发布多个版本的代码,并且有时代码需要知道所使用的版本,包含文件提供了存储版本的绝佳方式。这样,你只需要在一个地方更新版本。

这是一个名为 my_code_version.pro 的包含文件,它定义了一个版本:

version = 1.0
version_str = '1.0'

以下是使用它的代码示例:

@my_code_version
if version eq 1 then begin
  ; Code
endif else if version eq 1.1 then begin
  ; Different code
endif else if version eq 2 then begin
  ; Completely different code
endif else begin
  Message, 'Version ' +  version_str + ' is not supported.'
endelse

预定义变量

包含文件是设置预定义变量(例如常量)的好方法,这些变量可能用于许多不同的例程。这可能比使用公共块更可取。

请记住,你可能不需要为你所有想要的常量都这样做,因为 IDL 通过 !CONST 变量提供了许多物理常量。

设置 COMPILE_OPT

我也曾利用包含文件来设置多个例程中的 COMPILE_OPT 选项,使其可以更改。例如,在编写、调试和测试代码时,我通常喜欢看到首次调用例程时编译了哪些例程的打印输出。然而,当我写完代码并开始用它处理真实数据时,这些打印输出可能会有些烦人。因此,我希望能够在我所有的 compile opt 语句中添加“hidden”。实现这一点的简单方法是编写一个包含 COMPILE_OPT 语句的单行包含文件,然后可以更改该文件。我希望使用此功能的例程可以使用包含文件,而不是直接使用 COMPILE_OPT。

注意

关于包含文件的一个小小的注意事项是,代码编译可能会稍微花费更长的时间,因为 IDL 需要在路径中查找包含文件。然而,只要我不过度包含太多单独的文件,我从不担心这个问题,因为差异非常小。此外,如果最终代码以保存文件(.sav)而不是 pro 代码的形式发布,这也无关紧要,因为保存文件是预编译好的。

跨越180度经线的重投影 地图坐标系基础