爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6668|回复: 9

[混合编程] IDL之sav文件系统梳理

[复制链接]

新浪微博达人勋

发表于 2018-11-15 14:54:47 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2019-1-31 15:16 编辑

------序言------
我之前做sav文件,只是为后续做exe铺垫
sav生成方法例示:
把example.pro文件做成sav文件,存在D盘根目录下,只需在控制台键入:save,filename='D:\example.sav',/routines(routine:程序)
但是,sav文件不仅可以保存程序和函数,对象、数据也可以保存
楼下继续......




密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-11-15 15:40:05 | 显示全部楼层
本帖最后由 15195775117 于 2018-11-15 15:43 编辑

------用sav保存变量------

把2个变量保存到桌面:
a=findgen(3,4)
b=indgen(2)-99
save,a,b,filename='C:\Users\Administrator\Desktop\ab.sav',/variables
飞鸽截图20181115153746.png
重置,
help,a,b
restore,'C:\Users\Administrator\Desktop\ab.sav'
help,a,b

A               UNDEFINED = <Undefined>
B               UNDEFINED = <Undefined>
A               FLOAT     = Array[3, 4]
B               INT       = Array[2]

可见,a,b两个变量保存于ab.sav了,变量名也不变这样的话,保存那种很大的变量就有了新方法,
以前我都是做成系统变量,现在可以输出为sav,其实比系统变量更方便



密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-29 16:45:03 | 显示全部楼层
sav文件也能保存结构体
------代码------
a=findgen(3,4)
b=indgen(2)-99
s={a:a,b:b}
save,s,filename='C:\Users\Administrator\Desktop\s.sav',/variables
help,s
restore,'C:\Users\Administrator\Desktop\s.sav'
help,s
------输出------
IDL> use_sav
% Compiled module: USE_SAV.
** Structure <15013ff0>, 2 tags, length=52, data length=52, refs=1:
   A               FLOAT     Array[3, 4]
   B               INT       Array[2]
** Structure <13420700>, 2 tags, length=52, data length=52, refs=1:
   A               FLOAT     Array[3, 4]
   B               INT       Array[2]

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-1-29 19:20:10 | 显示全部楼层
谢谢楼主的分享,我想问楼主的头像是哪里来的呀,这个想说话的小女孩真可爱
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-30 11:29:53 | 显示全部楼层
Simpering 发表于 2019-1-29 19:20
谢谢楼主的分享,我想问楼主的头像是哪里来的呀,这个想说话的小女孩真可爱

桑德拉布洛克的《选美俏佳人》
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-31 15:50:46 | 显示全部楼层
save命令,可以将程序变量保存到.sav文件中,调用格式如下:
SAVE [, Var1, ..., Varn] [, /ALL] [, /COMM, /VARIABLES] [, /COMPRESS] [, DESCRIPTION=string] [, /EMBEDDED] [, FILENAME=string] [, /IGNORE_NOSAVE] [, /ROUTINES] [, /SYSTEM_VARIABLES] [, /VERBOSEvar是需要保存的变量or程序;


all关键字保存系统变量、公共变量、自定义变量等到sav文件中,不保存程序;
routines关键字保存程序到sav文件中;
system_variables关键字设置是否保存系统变量;
variables关键字控制是否保存变量;

comm关键字,保存[系统公共变量]到sav文件中;


compress关键字控制sav文件是否压缩
embedded控制是否在sav文件中嵌入许可(自动添加Licence?);
filename设置输出的sav文件名;


description关键字设置sav文件中的描述内容;
verbose:print an informative message for each saved object
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-2-13 14:05:02 | 显示全部楼层
目前没空研究如何识别一个陌生sav文件的内容,
虽然直接将sav文件拖入IDL可以输出某些信息,但跟保存的似乎不一样,多了一些内容,
我决定:
以后用sav文件保存变量时,将所有变量放入一个结构体,结构体名与sav文件名一致
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-3-13 15:06:46 | 显示全部楼层
sav文件保存程序的案例

------------------------

附件压缩包的文件:
1、one.pro中包括了次级的two.pro
2、函数文件f.pro和g.pro
3、编译并保存程序为sav文件的批处理文件pichuli.txt
4、sav文件,只需要再加载即可使以上4个函数和过程有效
------------------------
批处理文件执行方式:在控制台键入:@文件路径
------------------------
批处理文件内容:
;重置IDL
.reset_session
;查看当前IDL环境下编译的pro,仅有系统的$main程序,只有$MAIN是说什么都没编译
help,/pro
;编译
.compile -v 'C:\Users\Administrator\Desktop\IDL_Program_example\one.pro'
.compile -v 'C:\Users\Administrator\Desktop\IDL_Program_example\f.pro'
.compile -v 'C:\Users\Administrator\Desktop\IDL_Program_example\g.pro'
help,/pro
save,'one','two','f','g',$
filename='C:\Users\Administrator\Desktop\IDL_Program_example\one.sav',/routines
.reset_session
restore,filename='C:\Users\Administrator\Desktop\IDL_Program_example\one.sav'
help,/pro
;这样只要加载one.sav,one、two,以及f和g函数就都能用了



IDL_Program_example.rar

2.45 KB, 下载次数: 1, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-3-14 10:13:58 | 显示全部楼层
15195775117 发表于 2019-2-13 14:05
目前没空研究如何识别一个陌生sav文件的内容,
虽然直接将sav文件拖入IDL可以输出某些信息,但跟保存的似 ...

自问自答,前面只知道把sav文件拖入IDL可以查询内容,
现在还可以通过对象类来操作
------------------------------------------------------------

;sav文件的查询通过对象类“IDL_Savefile”来实现
file=filepath('cduskcD1400.sav',subdirectory=['examples','data'])
sobj=obj_new('IDL_Savefile',file)
;查询对象内容:
scontents=sobj.Contents()
;输出内容个数:
print,scontents.n_var
;获得变量名称:
print,sobj.names()
;查density变量的大小,用size函数:
print,sobj.size('density')
;将density打入内存
sobj.restore,'density'
ivolume,density


飞鸽截图20190314101425.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-3-14 10:39:33 | 显示全部楼层
用IDL虚拟机打开sav-------------------
双击这个虚拟机后,弹出文件选择窗口,加载sav就行了

1.png 2.png

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表