对全局变量的处理是IDL语言的特色之一!在IDL语言中没有全局变量的概念,所有的变量都是局部变量,只在当前的程序中有效。但是在实际的编程中,大部分情况下全局的变量又是必须的,那如何处理IDl中的所需的全局变量呢?本文探讨IDL使用中常用处理方法。

1 common—-定义公共区

在程序中用common命令定义一个公共区,在公共区中保存程序中所需的公共变量。具体形式如下:

COMMON Block_Name, Variable1, Variable2, …, Variablen

其原理是,在内存中定义一个公共区来存储变量,需要这些变量的程序,只要引用这个公共区的名称(Block_Name)就可,公共区中可以存放多个变量,支持IDl中所以的变量类型。

例子:

PRO vartest

common vart , a,b,c ;定义所需的公共区

a=2&b=3&c=4

print,(a*b*c)

vartest2

End

Pro vartest2

common vart ;引用公共区

print,(a+b)

End

注意:

common的方式来定义全局变量,是早期IDl程序使用方法,用这种方法来处理全局变量,变量管理很混乱而且程序维护性差。现在程序已经不使用这种方法,不推荐使用。

————————————————————————————————————–

2 DEFSYSV —定义系统变量

在程序中用defsysv来定义用户自己的系统变量。具体形式如下:

DEFSYSV, Name, Value

IDL的的系统都以!开头,IDl有很多已定义好现成的系统变量(详细细节请看帮助System Variables ),如:!DPI

,!MAP,!PI ,!CPU 。。。

它们都可以直接使用,如!DPI表示双精度圆周率的值。

用户自定义系统变量后,就可以直接使用,支持所有的变量类型

例子 :

Pro vartest2

c=!sysvar_a+!sysvar_b

print,c

End

PRO vartest

a=2

b=3

defsysv,’!sysvar_a’,a

defsysv,’!sysvar_b’,b

c =!sysvar_a * !sysvar_b

print,c

vartest2

End

注意:

1)DEFSYSV 程序一次只能定义一个系统变量;

2)所有的系统变量名称只能以!开头;

3)用DEFSYSV 的系统变量 的存在周期和编译器一样,除非关闭编译器或reset才能使系统变量无效;

4)一般在系统变量中保存一些使用频率很高的差数,如:程序系统路径,draw大小。

5)不存储数据量很大的数组,无法销毁,生命太长;

6)一般只在程序开始时定义,随意使用会使程序很混乱,很难维护;

———————————————————————————————————————–

3 用uvalue 来储存变量

uvalue是个好东西,里面可以存放各种数据类型,在IDL中有两个地方有uvalue,一个是所有界面组件中,有uvalue关键字可以存放变量,二是在所有图型类(IDlgr开头的类)中

有uvalue属性,可以存储变量,具体形式如下:

组件:

定义:

可以在初始化中定义 wtlb=widget_base(uvalue = var)

用widget_control对已有的组件进行设置 widget_control,wtlb,set_uvalue=var

引用:

widget_control,wtlb,get_uvalue=var

类:

定义:

初始化中定义 model = obj_new(’IDLgrmodel’,uvalue=var)

已有类进行定义 omodel->setproperty,uvalue=var

引用:

omodel -> getproperty,uvalue=var

般类中只存储与它功能相关的数据或差数。程序中所需的全局变量一般存储在tlb(顶级base)的uvalue中。因为tlb的值就是事件结构体中的

event.top,可以直接获得。根据tlb的值,用widget_control,wtlb,get_uvalue=var,就可以直接获得存储的全

局变量var

例子:

pro testbar_cleanup,base

;清空内存

widget_control,base,get_uvalue=pstate ; 获取全局变量

for i=0,n_tags(*pstate)-1 do begin

case size((*pstate).(i), /tname) of

‘POINTER’:$

ptr_free, (*pstate).(i)

‘OBJREF’:$

obj_destroy, (*pstate).(i)

else:

endcase

end

ptr_free,pstate

end

pro testbar_event, event

print,event

help,event

widget_control, event.top, get_uvalue=pstate ; 获取全局变量

uname =widget_info(event.id,/uname)

case uname of

‘quit’:begin

widget_control, event.top,/destroy

end

‘open’:begin

print, ‘widget user uname = ‘ + uname

print, ‘open’

file = dialog_pickfile(/read, filter = ‘*.jpg’,title=’读取数据’)

if file eq ” then return

print, file

read_jpeg, file, image, /true

image = congrid(image,3,600,450)

(*pstate).oimage = obj_new(’idlgrimage’,image)

(*pstate).omodel->add, (*pstate).oimage

(*pstate).owin->draw, (*pstate).oview

end

else:

endcase

end

;———————————————————————–

pro testbar

;组件系统

base = widget_base(title = ‘qqz_练习’,$

mbar=bar_base,$

xsize=600,$

ysize=450,$

/kill_notify)

file_menu = widget_button(bar_base, value=’file’, /menu)

file_bttn1 = widget_button(file_menu, value=’open’,

uname=’open’)

file_bttn2 = widget_button(file_menu, value=’file item 2′,

uname=’file 2′)

file_bttn3 = widget_button(file_menu, value=’file item 3′,

uname=’file 3′)

file_bttn4 = widget_button(file_menu, value=’quit’,

uname=’quit’)

opt_menu = widget_button(bar_base, value=’options’, /menu)

opt_bttn1 = widget_button(opt_menu,value=’options item 1′,

uname=’file1′)

opt_bttn2 = widget_button(opt_menu,value=’options item 2′,

uname=’file2′)

opt_bttn3 = widget_button(opt_menu,value=’options item 3′,

uname=’file3′)

opt_pr = widget_button(opt_menu,value=’options pull-right’,

/menu)

pr_bttn1 = widget_button(opt_pr, value=’options pull item1′,

uname=’pr 1′)

pr_bttn2 = widget_button(opt_pr, value=’options pull item2′,

uname=’pr 2′)

opt_bttn5 = widget_button(opt_menu,value=’options item 5′,

uname=’file5′)

help_menu = widget_button(bar_base,value=’help’, /menu)

help_buttn1 = widget_button(help_menu,value=’help item 1′, uname=

‘help 1′)

help_buttn2 = widget_button(help_menu,value=’help item 2′, uname=

‘help 2′)

wdraw = widget_draw(base,graphics_level=2,$

retain=2,$

xsize=600,$

ysize=450)

widget_control, base, /realize

;

widget_control, wdraw, get_value=owin

;对象系统

oview = obj_new(’IDlgrview’,

viewplane_rect=[0,0,600,450],dimension=[600,450])

omodel = obj_new(’IDlgrmodel’, name=’topmodel’)

oview->add, omodel

;全局变量

state = {owin:owin ,$

oview:oview ,$

omodel:omodel ,$

oimage:obj_new() ,$

wdraw:wdraw $

}

;把全局变量结构体的指针付给顶base

widget_control, base,set_uvalue=ptr_new(state, /no_copy)

xmanager, ‘testbar’, base,cleanup=’testbar_cleanup’,

/no_block

end

注意:

1)用tlb的uvalue来存储全局变量,是IDL全局变量处理最主要的手段。

2)uvalue中也只能存放一个变量,存放多个全局变量,一般采用在uvalue中存放一个结构体的指针。

例如:

state ={a:a,b:b,c:c,d:d }

widget_control,wtlb,set_uvalue=ptr_new(state,/no_copy)

3)面向对象的程序设计,大部分的变量都可以存在各功能类或子base的uvalue里,真正需要存在tlb的全局变量不多。

————————————————————————————————————————

4 用sav来存储系统参数

一个完善的软件,涉及到的系统各种差数很多,参数模块也很多,留给用户交换配置的参数也很多,就像IDL编译器分file-prefercences。

原理是:对于与主模块非常独立的模块之间参数传递,定义一个结构体,存储需要传递的参数。然后在把结构体以sav文件的形式存在指定的路径下。需要这些参数是把这个sav文件,restore了就可以了。著名的IDL开源软件dave就采用的这种手段

例子:

Pro vartest2

;从指定目录还原sav文件

restore,!sysfile

(*sys).a=3

(*sys).b=3

(*sys).c=obj_new(’IDlgrmodel’)

;改变后数据在存储

save,filename=!sysfile,sys

print,’*sys’

help,*sys,/str

obj_destroy,(*sys).c

ptr_free,sys

End

PRO vartest

;定义系统结构体

sys_define={ $

a:1 ,$

b:2 ,$

c:obj_new() $

}

;

print,’sys_define’

help,sys_define,/str

;

defaults_file = ‘C:\.defs.sav’

;自定义系统参数,保存路径名

defsysv, ‘!sysfile’, defaults_file

sys=ptr_new(sys_define)

;把参数保存在自定目录下

save,filename=!sysfile,sys

ptr_free,sys

vartest2

End

注意:适用多模块,大型系统,一般程序不推荐使用。

————————————————————————————————————————

5 完全面向文件变量存储

种方法比较落后,不推荐使用,仅让大家有所了解。一些古老或对IDL不太了解的研究者,会用到这种方法这种方法没有所谓的全局变量,所有生成的变量或数

据,都把它们写成txt文件文件或dat的数据。别的程序需要调用的时候,在读这些txt或dat。这种程序bug率非常高。程序很难控制。

后记:

一般程序设计会使用一种或几种相结合。常用的方法用defsysv和uvalue。

大型软件会用到sav。

全局变量中是在内存中常驻的,所以尽量减少变量冗余,和大型数组。

另内存变量的释放函数:.reset_session 或者.full_reset_session或DELVAR

matlab读取idl的变量,[转]IDL中全局变量的处理相关推荐

  1. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  2. matlab输入excel高版本,『matlab读取excel指定列』excel中大量数据如何导入matlab当中?超过1000个数据无法一个一个输入...

    如何将excel表格中大量数据导入matlab中并作图 哈哈,选我吧!使用xlsread函数体的语法你在帮助里面搜索xlsread就可以了.我要是现在回答也接翻译帮助文件.xlsread的参数有文件表 ...

  3. IDL和MATLAB读取grib数据

    IDL读取grib数据 (1)      需要IDL8.1以上版本 (2)      代码如下:        (3)      读取的数据结果在ENVI中查看如下: 可以看到在山东半岛的角上的值为0 ...

  4. matlab读取excel表作图,读取Excel表格数据进行绘图-如何将excel表格中大量数据导入matlab中并作图...

    matlab 读取excel时间数据并绘图 没看懂你的格式是什么意思, 不过我一般读取excel都用xlsread函数,你也可以试一试 [a,b,c]=xlsresd('data.xls');%r如果 ...

  5. MATLAB使用readtable读取首行变量名失败

    手头有一个数据量庞大的csv文件,其中第一行是变量名,其他为数据,用matlab读取时,碰到一个问题: Data = readtable('Data.csv',"ReadVariableNa ...

  6. MATLAB读取excel文件中的数据

    MATLAB读取excel中的数据 读取sheet1中的数据 [num,txt,raw]=xlsread('C:\Users\Administrator\Desktop\test\a.xls')    ...

  7. JSP隐含变量和Spring中Model在EL表达式中的读取顺序

    偶然中存在着必然,必然中存在着偶然 偶然出现的bug,必然存是由代码的不合理甚至错误的 代码逻辑越长,越复杂,就越容易出现bug 之前项目里几次偶然出现了一个bug,简单的描述就是第一次新增了之后进行 ...

  8. docker中不能读取带.环境变量的问题

    问题描述: 打包的docker镜像,启动时使用docker run -e 参数添加环境变量时,环境变量名称中包含".",有时能在环境变量里获取到,有时不能在环境变量里获取到; 由于 ...

  9. matlab gui怎样将结果保存_Matlab将工作区变量保存到文件中的方法

    save 将工作区变量保存到文件中 全页折叠 语法 save(filename) save(filename,variables) save(filename,variables,fmt) save( ...

最新文章

  1. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现
  2. Waymo十周年:多尔戈夫讲述从被嘲笑到硕果累累
  3. Java实现JsApi方式的微信支付
  4. Struts2配置时报struts-default.xml:65:72异常的解决方法
  5. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 6 ----asp.net MVC+Extjs
  6. 操作系统原理第二章:操作系统结构
  7. 产品 电信nb接口调用_电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程)...
  8. Word2Vec ——gensim实战教程
  9. Spark机器学习库(MLlib)指南
  10. 与Maven 3,Failsafe和Cargo插件的集成测试
  11. 图谱实战 | 基于半结构化百科的电影KG构建、查询与推理实践记录
  12. pythonscrapy爬虫_python爬虫scrapy之如何同时执行多个scrapy爬行任务
  13. 20年的老程序员对新入行的朋友的一些建议
  14. 后台系统上传文件回显上传进度条
  15. windows下安装TensorFlow(Win8 + Anaconda4.4 python3.6)
  16. 【Python】排序函数 sort、sorted 对复杂列表排序
  17. BOM有效日期的设置
  18. C# Graphics类详解
  19. “真功夫”与“花拳绣腿”
  20. scala函数式变程,curry,读取文件,字符串插值,隐式转换,模式匹配

热门文章

  1. icon图标 基础线性图标得设计
  2. 几种通信方式介绍(一)————串行通信技术介绍
  3. 临时文件存储助手:Yoink for Mac
  4. 病毒木马查杀实战第003篇:熊猫烧香之行为分析
  5. 这些能力,是书本上学不到的
  6. Science:只要跟着生物钟吃,就没那么容易胖
  7. 红淘客APP排行榜之花卷云淘客app系统
  8. 有趣的汉语:同音文(三):《饥鸡集矶记》
  9. 复旦大学计算机学院东华大学,上海市大学录取分排名前12:上财第3,华政第5,东华仅排第12...
  10. word涂改涂掉图片_Word对图形照片处理的几个小技巧,很少人知道!