在 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 代码的形式发布,这也无关紧要,因为保存文件是预编译好的。