|||
pro test_envi_Syntax_error ENVI_OPEN_FILE, dialog_pickfile(), r_fid=fid ENVI_FILE_QUERY, fid, dims=dims data = ENVI_GET_DATA(fid=fid, dims=dims, pos=0) data = envi_get_slice(fid=fid, line=20, pos=[1,3], $ xs=20, xe=40) values = envi_get_header_value(fid, 'My Scale Factors', /float) map_info = envi_get_map_info(fid=fid) Result = ENVI_GET_DISPLAY_NUMBERS(/color) proj = ENVI_GET_PROJECTION(FID = fid) map_info = ENVI_MAP_INFO_CREATE(/UTM, ZONE=23, /SOUT, $ DATUM = datum, UNITS = units, MC = mc, PS = ps) end |
data = ENVI_GET_DATA(fid=fid, dims=dims, pos=0)
% Syntax error.
…
类似的编译报错ENVI函数主要有:
ENVI_BANDMAX_SELECT_BANDS ENVI_CALCULATE_LOS ENVI_COMPUTE_SUN_ANGLES ENVI_CREATE_ROI ENVI_DEFAULT_STRETCH_CREATE ENVI_EVF_DEFINE_CLOSE ENVI_EVF_DEFINE_INIT ENVI_EVF_OPEN ENVI_EVF_READ_RECORD ENVI_FILE_TYPE ENVI_GET_CONFIGURATION_VALUES ENVI_GET_DATA ENVI_GET_DISPLAY_NUMBERS ENVI_GET_FILE_IDS ENVI_GET_HEADER_VALUE ENVI_GET_IMAGE ENVI_GET_MAP_INFO ENVI_GET_PATH ENVI_GET_PROJECTION ENVI_GET_ROI ENVI_GET_ROI_DATA ENVI_GET_ROI_DIMS_PTR ENVI_GET_ROI_IDS ENVI_GET_SLICE ENVI_GET_TILE ENVI_INIT_TILE ENVI_IS_DIMAP ENVI_IS_LASLIDAR ENVI_MAP_INFO_CREATE ENVI_PICKFILE ENVI_PROJ_CREATE ENVI_QUERY_NITF ENVI_QUERY_VERSION ENVI_SENSOR_TYPE ENVI_SET_INHERITANCE |
报错原因与机理分析:
1、 IDL中的()格式
IDL中,特别是早期的IDL5.0之前,()广泛的应用在数组的下标上,例如下面的两种数组使用写法运行结果是一样的:
IDL>;定义10个元素的数组 IDL> arr = indgen(10) IDL>;获取数组中的第三至第五个元素 IDL> print,arr[2:4] 2 3 4 IDL>;获取数组中的第三至第五个元素 IDL> print,arr(2:4) 2 3 4 |
由于函数的调用也是通过函数名()的方式,故现在编写代码时不推荐用()的数组方式。
2、 IDL编译规则
可以使用COMPILE_OPT对IDL编译器的默认编译规则进行稍微修改,COMPILE_OPT常用关键字有DEFINT32、STRICTARR和LOGICAL_PREDICATE等。
COMPILE_OPT DEFINT32 –把默认IDL的整型数据16位修改为32位;
COMPILE_OPT STRICTARR –默认数组元素的选取用中括号,不能够用小括号,避免出现与函数调用混淆。
COMPILE_OPT LOGICAL_PREDICATE,逻辑控制中的判断规则,如果设置了该规则则所有非0均为“真”,0为“假”,可参考IDL中的控制条件。
常用COMPILE_OPT IDL2,该语句的功能相当于同时使用COMPILE_OPT DEFINT32和 STRICTARR,即编译规则中添加“IDL整型数据为32位”和“数组下标引用必须用中括号”。
3、 编译方式
IDL在进行代码编译时首先查找系统路径或已经打开的工程或源码文件中是否存在函数定义,或是存在FORWARD_FUNCTION函数指定(之前版本中常用的方式)。而前面我们写出的二次开发函数代码,编译时即找不到envi_get_data函数的源码定义,也找不到forward_function指定,故编译时格式报错。
补救措施
1、 先启动ENVI
如启动envi+idl时,系统已经加载了ENVI函数,即已经对那些函数进行了编译,故程序中编译时不再提示格式错误。
2、 添加forward_funtion指定
示例代码如下
FORWARD_FUNCTION ENVI_GET_DATA,envi_get_slice,envi_get_header_value, $ envi_get_header_value,envi_get_map_info,$ ENVI_GET_DISPLAY_NUMBERS, $ ENVI_GET_PROJECTION,ENVI_MAP_INFO_CREATE
PRO TEST_ENVI_SYNTAX_ERROR ENVI_OPEN_FILE, dialog_pickfile(), r_fid=fid ENVI_FILE_QUERY, fid, dims=dims data = ENVI_GET_DATA(fid=fid, dims=dims, pos=0) data = ENVI_GET_SLICE(fid=fid, line=20, pos=[1,3], $ xs=20, xe=40) values = ENVI_GET_HEADER_VALUE(fid, 'My Scale Factors', /float) map_info = ENVI_GET_MAP_INFO(fid=fid) Result = ENVI_GET_DISPLAY_NUMBERS(/color) proj = ENVI_GET_PROJECTION(FID = fid) map_info = ENVI_MAP_INFO_CREATE(/UTM, ZONE=23, /SOUT, $ DATUM = datum, UNITS = units, MC = mc, PS = ps) END |
3、 修改编译规则
添加compile_opt idl2,强制让IDL认为()格式就是函数。
PRO TEST_ENVI_SYNTAX_ERROR compile_opt idl2 ENVI_OPEN_FILE, dialog_pickfile(), r_fid=fid ENVI_FILE_QUERY, fid, dims=dims data = ENVI_GET_DATA(fid=fid, dims=dims, pos=0) data = ENVI_GET_SLICE(fid=fid, line=20, pos=[1,3], $ xs=20, xe=40) values = ENVI_GET_HEADER_VALUE(fid, 'My Scale Factors', /float) map_info = ENVI_GET_MAP_INFO(fid=fid) Result = ENVI_GET_DISPLAY_NUMBERS(/color) proj = ENVI_GET_PROJECTION(FID = fid) map_info = ENVI_MAP_INFO_CREATE(/UTM, ZONE=23, /SOUT, $ DATUM = datum, UNITS = units, MC = mc, PS = ps) END |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-16 09:56
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社