admin 管理员组

文章数量: 887021


2024年1月4日发(作者:access公司加班严重吗)

计算机时代2010年第4期 ・4l ・ Delphi和C语言混合编程在处理工程地质资料中的应用 戴峻’,刘海军 ,翟波 (1.煤炭科学研究总院沈阳研究院,辽宁抚顺113001;2.辽宁石油化工大学) 摘要:详细描述了利用Delphi和c语言混合编程处理工程与地质资料的思想和程序设计方法,并以SEG一2格式为例, 介绍了这种方法的具体应用。 关键词:Delphi;SEG.2格式;动态链接库;工程和地质资料处理 Application of Delphi and C Mixed Programming in Processing Engineering and Geological Data DAI Jun ,LIU Hai-jun2,ZHAI Bo (J.Shenyang Branch of China Coal Research Institute,Fushun,Liaoning 113001,China;2.Liaoning Shihua University) Abstract:The idea and programming method of processing engineering and geological data by Delphi and C mixed programming are described in detail,and taking SEG一2 format as an example,the specific application of this method is introduced. Key words:Delphi;SEG一2 format;DLL;engineering and geological data processing 0引言 科技飞速发展的今天,数字化的地震仪、地质雷达等现代 1.1文件描述块 每一个SEG一2格式文件都有文件描述块。文件描述块对 包括文件的格式标识、版本号、 化仪器和设备的出现结束了模拟记录的历史。目前,各厂家生 整个文件进行了综述性的描述,采集时间、前方增益、炮点间隔、首桩号、尾桩号、备 产的仪器对数据记录都有一套标准的存贮方式和处理软件。 采集日期、道头指针等内容。 国内不少科研单位花巨资从国外引进仪器或设备,而由于经费 注、道数、文件描述块中的第0—1字节存放数据为3a55H的一个十六 紧张,却没有购得相应的处理软件,所以很多单位和科研院所 都非常需要一套通用的数据处理软件。 进制正数,这表明文件的存储方式是低字节在前,高字节在 Delphi作为第四代编程语言,具有简单、高效、功能强大等 后。第2—3字节存放了9905H,这是此文件采用SEG标准的版 特点,但由于工程和地质资料一般数据量很大,计算非常复杂, 本号。第4—5字节存放了一个无符号的整型量M,一般M=道 Delphi在底层计算方面与C语言相比还是有一定的差距。所 头指针尺寸=道数 4。第6—7字节的无符号整型量,表明了此 以,我们需要使用C语言来编写计算方面的模块,而使用Delphi 文件的道数。第8字节存放的是01H或02H,用于说明串结束  来编写人机交互的图形界面。众所周之,数据处理软件首先要 符存放于第9字节还是分别存放于第9和第l0字节。第ll,4—3l字节 考虑数据结构,有了数据结构,才可以对数据进行处理。那么 l2,l3字节存放换行符的尺寸及换行符的类型。第l3l+M)字节 现有的数据格式主要有哪些呢?以地震仪为例,美国SEG曾推 为SEG~2的保留字节,用于以后扩充内容。第32一(此 荐过诸如SEG—D,SEG—Y等格式,在1987年l0月又推出 为道头的指针,每一个指针为一个4字节的无符号长整型量,SEG一2标准。按有关规定,从1987年l0月以后出厂的数字化 处M由第4—5字节决定。第32+M字节直至字节内容为O都为 I字符串,这些字符串选择性包括TRACE SORT<sort 地震仪器及有关设备,无论以何种方式采集的数据,都应以此 ASCIhod>,UNITS<linear unit system>,NOTE<text>,PRO— 标准存贮数据。所以,目前大部分仪器采用SEG—Y、SEG—D和 metSEG一2格式存储数据。本文以使用Delphi调用VC生成的动态 CESSING TIME<value>,PROCESSINGDATE<value>, 链接库(DLL)来实现SEG一2格式数据文件描述块字符串读取 为例,简要介绍一下这种方式在工程和地质数据处理方面的应 用。 OBSERVER<name>,JOBID_<character string>,INSTRU- MENT<manufacturer name><model number/name><serial number>,GENERALCONSTANT_<value>,COMPANY< 1 SEG一2格式 根据sEG官方网站上关于sEG一2格式的英文介绍,我们在 name>,CLmNT<name>,ACQUISITION_TIME<value>等重 要内容,这些内容一般以空格键或者换行符隔开,如图2所示。 40 0l 04 OO lB 00 5《52聚} 歌 20 。。,TR . 这里参照官方格式对其先做一个简要的解读。 z ,..,  If I I......I I  I22’’u0 uu uu O O0 D0 ETERg’’,J 图1 SEG一2格式数据结构 图2由WinHex显示出的SEG一2文件描述块ASCII字符串 2道头块和数据块 从图l可以看出,一个SEG一2格式文件包括一个文件描述 1.般SEG一2文件包含N个道头块和与之匹配的相应数据 块和若干个道头块和数据块。 一

・42・ Computer Era No.4 2010 ∞0 ∞ ∞蛇¨ //数据文件描述块ASCII字符串变量 块。道头块一般包括道头标识,道尺寸,数据块长度,每道样点 ∞ 雌轮 stdng[1 00]; 数,数据段格式码,途径文件名,道号,采样率,延迟时间,低截, 砖 char dscrpt∞ d readfile(),,读取文件函数 测线号,炮点位置,检波器位置,叠加次数,作图幅度等内容。∞”  们 voi(FILE fseg2; ∞ ∞ 道头块的第0一l字节为一个十六进制无符号整型量 _∞牾蚰∞ 4422H作为道头标识。第2-3字节为道头尺寸,是一个无符号 ∞∞ 曲 fseg2=fopenC.\\data_seg2.sgy”,”rb”): n∞∞ 的整型量。第4—7字节为数据段长度,为样点数/道 4字节。 ∞l兰i“描 第8一ll字节为每道样点数,是一个无符号的长整型量。第l2 fread(&seg2一hd32,32,1,fseg2); fread(tracepointer,4,seg2_hd32.tracenum,fseg2); fread(&stringlength,2,1,fseg2); ,,读取数据文件描述块ASCII字符串 unsigned short int I.0: ∞ 字节为数据段存储数据的格式码,1H表示l6位整数,2H表示 “躬 32位整数,3H表示20位浮点数,4H表示32位浮点数,5H表示 ∞“蛆 驰 64位浮点数。第l3—31字节为SEG保留内容,以备扩充。第 wh.1e(O!=st—ngIength) 32字节直至字节内容为0,均为ASCII字符串,由于篇幅所限, 此处不一一描述。每道紧跟道头后的是数据段,具体数据内容 如柏 由此段读出。图3所示为由WinHex显示出的SEG一2道头块 ASCII字符串。 RACE丑…DEL髓0 45 54 52 59 20 3i 2E 37 33 6s 2B 3O 3O 36 00 1E£】 r 1.73e+O0 ̄ i 00 52 45 43雌5 49 56 4s 52 5F 4c 4F 43 41 54,辱霉 .RE蜡EIVER_L0eA ̄I 哇F 4E 20 31 2E 37 33 65 2 )O工8,屯U 53 c}N l。73e+006..霹 4i 4D sO 4e s 5F 49《E 5 AscII字符串—n Ic 20 30 hMp啦.INTERVALfG 2E 30 30 34 00 1B O0 s3 4 ;3 45 5i 55 004 。.sHcrr gE iI 45 4E 43 45 5F{E 55{D 42{s s2 20 3 33 36 OO E E 瑭姻ER 4 6. iE 0O 53 4F 55 52唾3唾5 5F 4c唾F 43 41 54 49 4F ..S0U蹙CE_LO 汀10 4E 20 33=2 22El’30 3 2 37 35 65 2B 3o 30 36 00 00 00 N 2 027S +—叻6. . 图3由WinHex显示出的SEG一2道头块ASCII字符串 2 VC++建立动态链接库(DLL) 打开Vc++,新建一个MFC AppWizard(dl1)工程,命名为 Seg2。建立c,C++Header File,命名为Seg2_Read.h。建立 c\C++Source File,命名为Seg2_Read.cpp。两个文件的代码 及解释如下。 在Seg2_Read-b文件中键入: extern”C”—.declspec(dllexp0rt)char outputstring0; ,/向调用程序声明可被调用的函数 在Seg2_Read.cpp文件中键入: #include”StdAfx.h” #include”seg2_read.h” #include<stdio.h> unsigned short int stringlength;/,数据文件描述块结构体变量 struct seg2hd32 _{short blockid; short revnum; unsigned short pointerbytecount; unsigned short tracenum; char stringtermcount; char stringterml: char stringterm2; char linetermcount; char lineterml: char lineterm2; char reserved[1 8】: )segl2_hd32; unsigned int tracepointer[100]; {unsigned short int_i=1: wh_le(j<=(st ringIength一2)) (fread(&dscrptstring[i],1,1,fseg2); j寸}1: i=i+l; } fread(&stringlength,2,1,fseg2); ) fclose(fseg2); )/,可被调用的函数 extern”C”—declspec(d¨export)char outputstring() {read_file0; return dscrptstring;H- ̄ASCII字符串数据指针 ) 。 将数据文件data—seg2.sgy放置于工程目录下,点击执行, 在工程目录Debug下生成了Seg2.DLL。我们将在下一步使 用它。 3 Delphi调用动态链接库(DLL)中的函数 在Delphi中新建工程Seg2_Read,布置面板如图4所示。 由于篇幅有限,我们使用隐式调用。 SEG 2蹙筻据文伴描述块事簿审: 输出ASCI ̄串 图4.Delphi面板布置 新建一个单元,命名为opstring.pas,分别在interface和 implementation下键入以下代码: interface function outputstring():pchar;stdcall; implementation function}outputstring;external。seg2.DLL‘name’outputstring。: ||讽入DLL 在Seg2_Read.pas的implimentation下键入以下代码: USeS opstring; procedure TForm1.Button1CIick(Sender:TObject); (下转第45页1 盯 

计算机时代2010年第4期 f name=document.form1.name.value; date=document.form1.date.value; ・45・ if(chkspc(name)==OIIfucCheckLength(name)<4) {alert(”请填写您的姓名,姓名由1到4个字符组成。“): document.f0rm1.name.focus();return false; ) pwd=document.f0rm1.pwd.value; jf(chkspc(date)==OIIchkdate(date)==O) {alert(”请填写您的订货日期,格式如2010-1—8。”) ;document.f0rm1.date.focus();return false; ) ) <,script> if(fucCheckLength(pwd)<611fucCheckLength(pwd)> 1211fucPWDchk(pwd)==0) {alert(”密码由6到12 ̄-:字母或数字组成。”) document.f0rm1.pwd.focus();return false; ) email=document.form1.email.value; 3结束语 本文提出了一种基于JavaScript的验证表单数据的通用方 案,并给出了相应的验证程序代码。该方案可以对用户信息进 行详细验证。该方案将验证机制对应在一个外部脚本文件 Client Event Handlers.js中,通过调用这个文件实现代码复 用。该方案能够在多种环境下应用,其主要技术特点有:①跨 if((chkspc(email)==O)I1(chkemail(email)==0)1I (fucCheckLength(email)>40)) (alert(”请填写正确的e-mail地址。”): document.f0rm1.email.focus();return false; ) postcode=document.form1.postcode.value; 平台、跨浏览器运行;②适合多种表单网页动态验证数据。应 用范例和实际运行表明,该方案简洁实用,较好地满足了通用 性的应用需求。 参考文献: if(chkspc(postcode)==011(fucCheckLength(postcode)>1 5) lIfucCheckNUM(postcode)==O) {alert(”请您填写正确的邮政编码,它由数字组成。”): document.f0rm1.postcode.focus();return false; ) usephone=document.f0rm1.usephone.value; 【1lTomNegrino,Dori Smith著,陈创瓯等译.JavaScript基础赦程(第7 版)fM1.人民邮电出版社,2009. 【2】Michael Moncur著,王军译.davaScript入门经典(第4版)【M】.人民邮 电出版社.2008. 【3】熊圣芬,贺智明,王俊.基于JavaScfipt和DOM的动态表单设计及教 据提交[J】.江西理工大学学报,2009.2:31 ̄33 if(usephone==”l Ichkspc(usephone)==O l lfucCheckLength (usephone)>3OIIfucCheckTEL(usephone)==O) {alert(”您的常用电话号码填写有误。”): document.f0rm1.usephone.focus();return false; ) I4l张彦芳,谢虹.基于JavaScript的客户端表单验证【J】.生产一线,2009:33 【5l徐卫英.《脚本语言与动态网页设计》谋程教学案例的设计【J】.苏州大 学学报,20o8・ 2:79—8 ■ 《上接第42页) begin 4结束语 本文详细介绍了使用Delphi调用VC++生成的动态链接库 (DLL)来实现地质和工程数据文件描述块ASCII字符串读取 edit1.text:=outputstring0;//调用动态链接库中的函数 end; 的方法和步骤。只要稍作修改就可以通过这样的方法读取文 到工程目录下,点击运行,然后在运行窗口上单击“输出ASCII 件中其他所有的地质和工程数据资料,进行下一步的计算和处 字符串”按钮,文本框显示如图5所示。可见,与图2中WinHex 将前面已生成的Seg2.DLL及数据文件data_seg2.sgy拷贝 理工作。虽然,这里只以动态链接库封装数据读取函数的实 例,但是,Delphi也可以通过这样的方式调用其他的函数。这 种方法不仅发挥了C语言底层编程计算大量地质和工程数据 速度快的优势,还利用了Delphi简单、易学、易用的界面图形编 显示出的SEG一2文件描述块ASCII字符串相符合。 SEG 缓 据文件描述块字符串 程特点。 参考文献: 【1】牛江民.Delphi7开发基础教程【M】.科学出版社,2005. ITP ̄CLSORT E0MM石 石 再疆一一一 一一~一 ‘;; 褥磁 i鸸竽符攀I ; ; 【2】肖庆航.Dephi7数据 库开发教程【M】.清华大学出版社,2004. 【3】侯俊杰.深入浅出MFC[M].华中科技大学出版社,2001. 【4l张慧龙,刘君宝.面波法的数据采集处理系统反其应用实例【J】西部探 矿工程.2007.12. 图5 Delphi调用seg2.DLL读出的SEG一2文件描述块AsCⅡ字符串 至此,我们介绍了使用Delphi调用VC生成的动态链接库 5】徐维秀,段卫星.表层结构调查资料的毅字化处理及应用【J】.物探化探 CDLL)来实现数据文件描述块ASCII字符串读取的步骤,这种 f方法比纯Delphi或C语言编程省时,省力。 计算技术,2005.5. 


本文标签: 数据 文件 字节 工程 描述