LearningENVI&IDL分享 http://blog.sciencenet.cn/u/dongyanqing Learning ENVI&IDL

博文

ENVI二次开发时ENVI_GET_DATA等函数的编译报错问题

已有 17085 次阅读 2012-10-12 22:29 |个人分类:ENVI|系统分类:科研笔记| ENVI二次开发

  很多写IDL代码或ENVI二次开发代码的人会遇到过类似的问题。明明代码没错,拼写和关键字啥的没错,编译却过不去,一直报格式错误,如下,到底为啥呢?

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_OPTIDL编译器的默认编译规则进行稍微修改,COMPILE_OPT常用关键字有DEFINT32STRICTARRLOGICAL_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

 



https://blog.sciencenet.cn/blog-344887-621980.html

上一篇:IDL中的日期和时间函数
下一篇:《IDL程序设计—数据可视化与ENVI二次开发》正式出版
收藏 IP: 58.57.24.*| 热度|

2 海鹰 王志伟

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-10-16 09:56

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部