IDL common block

本文介绍了IDL语言中COMMON块的概念及使用方法。详细解释了如何定义和引用COMMON块内的变量,并通过示例展示了不同程序单元间如何共享这些变量。

Note on Common Block Variable Names

Variables in IDL COMMON blocks do not actually have names. Rather, IDL represents COMMON blocks internally as an array of variables, and these variables are referenced by their positional index. Hence, the first variable is at position 0, the second at position 1, and so forth. When you specify a COMMON block declaration in an IDL routine, you specify names to be used for these variables within the scope of that routine.


Common Block Definition Statements

The common block definition statement creates a common block with the designated name and places the variables whose names follow into that block. Variables defined in a common block can be referenced by any program unit that declares that common block. The general form of the COMMON block definition statement is as follows:

COMMON Block_Name, Variable1, Variable2, ..., Variablen

The number of variables appearing in the common block cannot change after the common block has been defined. The first program unit (main program, function, or procedure) to define the common block sets the number of included variables; other program units can reference the common block with any number of variables up to the number originally specified. Different program units can give the variables different names, as shown in the example below.



Example

The two procedures in the following example show how variables defined in common blocks are shared.

PRO ADD, A
   COMMON SHARE1, X, Y, Z, Q, R
   A = X + Y + Z + Q + R
   PRINT, X, Y, Z, Q, R, A 
   RETURN 
END
 
PRO SUB, T
   COMMON SHARE1, A, B, C, D
   T = A - B - C - D
   PRINT, A, B, C, D, T
   RETURN
END 

The variables X, Y, Z, and Q in the procedure ADD are the same as the variables A, B, C, and D, respectively, in procedure SUB. The variable R in ADD is not used in SUB. If the procedure SUB were to be compiled before the procedure ADD, an error would occur when the COMMON definition in ADD was compiled. This is because SUB has already declared the size of the COMMON block, SHARE1, which cannot be extended.


在ENVIIDL代码:以下代码:PRO remote_sensing_gui ; 主程序入口 ; 声明全局变量存储图像数据和控件ID COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info main_base = WIDGET_BASE(/COLUMN, TITLE=‘遥感软件开发大作业’, XSIZE=1200, YSIZE=800) ; 第一行:个人信息区(行布局) info_row = WIDGET_BASE(main_base, /ROW, SPACING=20, MARGIN=20) ; 左侧个人信息面板(列布局) personal_panel = WIDGET_BASE(info_row, /COLUMN, XSIZE=300) WIDGET_LABEL, personal_panel, VALUE=‘个人信息’, FONT=‘{微软雅黑,16,BOLD}’ WIDGET_LABEL, personal_panel, VALUE=‘姓名:王彦哲’, FONT=‘{宋体,14}’ WIDGET_LABEL, personal_panel, VALUE=‘学号:20222703132’, FONT=‘{宋体,14}’ WIDGET_LABEL, personal_panel, VALUE=‘班级:遥感科学与技术22班’, FONT=‘{宋体,14}’ WIDGET_LABEL, personal_panel, VALUE=‘兴趣爱好:遥感影像处理、无人机测绘、摄影’, FONT=‘{宋体,14}’ ; 右侧个人肖像区 portrait_area = WIDGET_BASE(info_row, XSIZE=200, YSIZE=200) WIDGET_LABEL, portrait_area, VALUE=‘个人肖像’, FONT=‘{微软雅黑,14,BOLD}’ personal_img = WIDGET_IMAGE(portrait_area, XSIZE=200, YSIZE=200, /RETURN_ID) ; 第二行:图像显示区(行布局) display_row = WIDGET_BASE(main_base, /ROW, SPACING=10, MARGIN=10) ; 左侧遥感影像区(列布局) rs_panel = WIDGET_BASE(display_row, /COLUMN, XSIZE=600) WIDGET_LABEL, rs_panel, VALUE=‘专业遥感影像’, FONT=‘{微软雅黑,14,BOLD}’ rs_display = WIDGET_IMAGE(rs_panel, XSIZE=600, YSIZE=400, /RETURN_ID) rs_info = WIDGET_LABEL(rs_panel, VALUE=‘影像说明:请加载遥感影像’, FONT=‘{宋体,12}’) ; 右侧家乡美景区(列布局) scenery_panel = WIDGET_BASE(display_row, /COLUMN, XSIZE=400) WIDGET_LABEL, scenery_panel, VALUE=‘家乡美景’, FONT=‘{微软雅黑,14,BOLD}’ scenery_img = WIDGET_IMAGE(scenery_panel, XSIZE=400, YSIZE=400, /RETURN_ID) ; 第三行:功能按钮区(行布局) button_row = WIDGET_BASE(main_base, /ROW, SPACING=20, MARGIN=20) load_portrait_btn = WIDGET_BUTTON(button_row, VALUE=‘加载个人肖像’, UVALUE=‘portrait’) load_scenery_btn = WIDGET_BUTTON(button_row, VALUE=‘加载家乡美景’, UVALUE=‘scenery’) load_rs_btn = WIDGET_BUTTON(button_row, VALUE=‘加载遥感影像’, UVALUE=‘remote’) mode_combo = WIDGET_COMBOBOX(button_row, ITEMS=[‘原始影像’, ‘假彩色合成’, ‘NDVI计算’], SELECTED=0) ; 注册事件处理过程 XWINDOW, EVENT_HANDLER=‘LOAD_HANDLER’, /BUTTON, ID=load_portrait_btn XWINDOW, EVENT_HANDLER=‘LOAD_HANDLER’, /BUTTON, ID=load_scenery_btn XWINDOW, EVENT_HANDLER=‘LOAD_HANDLER’, /BUTTON, ID=load_rs_btn XWINDOW, EVENT_HANDLER=‘MODE_CHANGE_HANDLER’, /COMBOBOX, ID=mode_combo ; 显示界面 WIDGET_CONTROL, main_base, /REALIZE XMANAGER, ‘遥感大作业界面’, main_base, /NO_BLOCK END PRO LOAD_HANDLER, event ; 图像加载事件处理过程 COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info SWITCH event.UVALUE OF ‘portrait’: BEGIN ; 加载个人肖像 file = DIALOG_PICKFILE(TITLE=‘选择个人肖像’, FILTER=‘.jpg;.png;*.bmp’) IF (file NE ‘’) THEN BEGIN img = READ_IMAGE(file) WIDGET_CONTROL, personal_img, SET_VALUE=img ENDIF END 'scenery': BEGIN ; 加载家乡美景 file = DIALOG_PICKFILE(TITLE='选择家乡美景', FILTER='*.jpg;*.png;*.bmp') IF (file NE '') THEN BEGIN img = READ_IMAGE(file) WIDGET_CONTROL, scenery_img, SET_VALUE=img ENDIF END 'remote': BEGIN ; 加载遥感影像 file = DIALOG_PICKFILE(TITLE='选择遥感影像', FILTER='*.tif;*.img;*.hdr') IF (file NE '') THEN BEGIN rs_data = READ_IMAGE(file) ; 读取遥感数据 WIDGET_CONTROL, rs_display, SET_VALUE=BYTSCL(rs_data) ; 更新影像说明 dims = SIZE(rs_data, /DIMENSIONS) type = SIZE(rs_data, /TYPE) info_str = '影像说明:' + FILE_BASENAME(file) + $ ', 尺寸:' + STRTRIM(dims[0] + 'x' + dims[1] + 'x' + dims[2], 2) + $ ', 数据类型:' + STRTRIM(STR(type), 2) WIDGET_CONTROL, rs_info, SET_TEXT=info_str ENDIF END ENDSWITCH END PRO MODE_CHANGE_HANDLER, event ; 显示模式切换事件处理过程 COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info IF (N_ELEMENTS(rs_data) EQ 0) THEN RETURN ; 未加载影像时不处理 SWITCH event.INDEX OF 0: BEGIN ; 原始影像 WIDGET_CONTROL, rs_display, SET_VALUE=BYTSCL(rs_data) END 1: BEGIN ; 假彩色合成(假设为4波段数据) dims = SIZE(rs_data, /DIMENSIONS) IF (dims[2] GE 4) THEN BEGIN rgb = [rs_data[*,*,3], rs_data[*,*,2], rs_data[*,*,1]] ; 4-3-2波段合成 WIDGET_CONTROL, rs_display, SET_VALUE=BYTSCL(rgb) ENDIF END 2: BEGIN ; NDVI计算(归一化植被指数) dims = SIZE(rs_data, /DIMENSIONS) IF (dims[2] GE 4) THEN BEGIN nir = FLOAT(rs_data[*,*,3]) ; 近红外波段 red = FLOAT(rs_data[*,*,2]) ; 红波段 ndvi = (nir - red) / (nir + red + 1E-10) ; 防止除零 ndvi_img = BYTSCL(ndvi) WIDGET_CONTROL, rs_display, SET_VALUE=ndvi_img ENDIF END ENDSWITCH END,有错误:IDL> remote_sensing_gui COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info ^ % Attempt to extend common block: RS_DATA_COMMON At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 5 personal_img = WIDGET_IMAGE(portrait_area, XSIZE=200, YSIZE=200, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 23 rs_display = WIDGET_IMAGE(rs_panel, XSIZE=600, YSIZE=400, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 31 scenery_img = WIDGET_IMAGE(scenery_panel, XSIZE=400, YSIZE=400, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 37 % 5 Compilation error(s) in module REMOTE_SENSING_GUI. COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info ^ % Attempt to extend common block: RS_DATA_COMMON At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 59 % 2 Compilation error(s) in module LOAD_HANDLER. COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info ^ % Attempt to extend common block: RS_DATA_COMMON At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 97 % 2 Compilation error(s) in module MODE_CHANGE_HANDLER. COMMON RS_DATA_COMMON, rs_data, personal_img, scenery_img, rs_display, rs_info ^ % Attempt to extend common block: RS_DATA_COMMON At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 5 personal_img = WIDGET_IMAGE(portrait_area, XSIZE=200, YSIZE=200, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 23 rs_display = WIDGET_IMAGE(rs_panel, XSIZE=600, YSIZE=400, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 31 scenery_img = WIDGET_IMAGE(scenery_panel, XSIZE=400, YSIZE=400, /RETURN_ID) ^ % Syntax error. At: C:\Users\DELL\IDLWorkspace\Default\remote_sensing_gui.pro, Line 37 % Attempt to call undefined procedure: ‘REMOTE_SENSING_GUI’. % Execution halted at: $MAIN$ ,请进行改正
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值