当前位置:文档之家› VC_与Delphi源代码的互译详解

VC_与Delphi源代码的互译详解

Computer Knowledge and Technology 电脑知识与技术第7卷第32期(2011年11月)VC++与Delphi 源代码的互译详解许苗村,陈业恩(海南软件职业技术学院软件工程系,海南琼海571400)摘要:以大量举例的形式给出了VC++与Delphi 的代码互译,首次做到了对VC++与Delphi 程序的沟通,为算法研究及软件开发人员提供了可靠的代码转换依据,具有非常重要的意义和应用价值。

关键词:VC++;Delphi ;互译中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)32-7924-04VC++and Delphi Source Code Mutual TranslationXU Miao-cun,CHEN Ye-en(Hainan College of Software Technology,Qionghai 571400,China)Abstract:The article gives VC++and the Delphi code mutually translation by the massive examples,for the first time to do the VC++and the Delphi code communication,which provides the reliable code conversion basis for the algorithm research and the software develop⁃er and has the extremely vital significance and the application value.Key words:VC++;Delphi;Mutually translation一个程序开发员常常手中掌握了一种语言的代码,但却需要以另一种开发平台进行开发,为解决此问题,本文通过举出大量实例对VC++与Delphi 语言中的一些不同之处进行了对应互译,解决了不同开发平台之间沟通难的问题[1-4]。

1运算符互译表1为VC++与Delphi 的算术、位、逻辑运算符互译对照表。

2源代码的互译详解2.1单元的引用VC++中单元引用部分include 用于列出该单元要引用的标准库单元(诸如①)和其它库单元(诸如②),这类似于Delphi 中的uses 语句,可以把外部的已声明过的常量、类型、变量、过程或函数引入到本单元中使用,使得功能更加强大,使用更加方便。

VC++:#include <windows.h>①#include "shearwarp.h"②Delphi :Uses windows ,shearwarpunit;2.2宏常量用#define 定义的常量,即宏常量,其一般形式为#define <宏名><常量>,宏名可以是简单的字符名,也可以是带有参数的函数名。

常量可以是数值、字符串和函数等。

一般用#define 定义一个宏,是为了在程序中使用,使程序更加简洁,维护更加方便。

1)#define <字符名><数值>VC++:#define FPSH 8Delphi :Const FPSH=8;2)#define <带参的函数名><函数>VC++:#define CLAMPX(x)(((x)<0)?0:(((x)>=m_x)?(m_x-1):(x)))在Delphi 中首先需要在此函数所属的类中宣称这一方法,Public function CLAMPX(x:integer):integer;其次需要在执行部分(implementation)对函数体进行定义,以便返回函数值:function Volume.CLAMPX(x:integer):integer;收稿日期:2011-08-25作者简介:许苗村(1984-),女,陕西咸阳人,海南软件职业技术学院教师,主要研究方向为图像处理与信息技术;陈业恩(1980-),男,海南琼海人,海南软件职业技术学院教师,主要研究方向WEB 开发。

表1VC++与Delphi 的算术、位、逻辑运算符互译对照表E-mail:xsjl@ Tel:+86-551-56909635690964ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.7,No.32,November 2011.Computer Knowledge and Technology电脑知识与技术第7卷第32期(2011年11月)beginif x>=m_x then x:=m_x-1else Result:=x;if x<0then x:=0else x:=Result;end;2.3复杂数据类型的定义1)枚举型VC++:enum SliceOrientation{SO_XY,SO_XZ,SO_YZ};Delphi:typeTSliceOrientation=(SO_XY,SO_XZ,SO_YZ);2)结构体结构体是一种混合的数据结构,它可以由不同的数据类型构成。

VC++:struct coord3{float x,y,z;};Delphi中的记录类型与VC++中的结构体类似,它包含可以保存数据的域,每一个域可以有一个数据类型。

typeTcoord3=recordx,y,z:Real;//此记录就含有3个数据类型都相同的域3)数组的定义及初始化定义一个有4个元素的一维整型数组,并对其进行初始化。

VC++:int a[4]={0,0,0,0};Delphi:vara:array[0…3]of integer;beginfor i:=0to3doa[i]:=0;end;2.4指针与动态内存分配1)无类型指针它是指指针变量在声明时没有指明基类型。

VC++:void*p;Delphi:p:Pointer;2)指针运算VC++:char*c=(char*)p;用“数据类型名*”的形式对指针进行强制类型转换。

指定了p的指针类型为PChar。

Delphi:c:PChar;c:=p;3)动态内存分配与释放VC++:m_data=new data_t[m_size];delete m_data;new用来动态的分配存储空间,它能够自动计算要分配的存储空间大小,并能返回正确的指针类型。

delete运算符用于在使用完内存后,能够将其还给内存池。

Delphi:m_data:array of Tdata_t;setlength(m_data,m_size);m_data:=nil;2.5构造与析构函数构造和析构是类类型中两种特殊的方法,用于控制类对象的创建和初始化及删除时的行为。

VC++:public:Volume();//构造函数~Volume();//析构函数Delphi:Type Tvolume=classpublicconstructor create();destructor Destroy();Computer Knowledge and Technology电脑知识与技术第7卷第32期(2011年11月) end;2.6过程与函数的首部1)一般情况下对过程首部的转换VC++:Void ShearWarp::Shear(coord3dir,int threshold)Shear是类ShearWarp的成员函数,类作用域分辨操作符“::”用于类和成员之间的访问。

Delphi:procedure TShearWarpForm.Shear(dir:Tcoord3;threshold:Integer);2)参数的传递方式VC++:float normlen(grad_t&g);在过程或函数首部<形参表>中的参数前面如果使用了&,则表示该参数为变量参数。

变量参数的传递方式为“按地址传递”,即将实参变量的地址传递给形参,这样形参与实参表示同一个存储单元。

如果在过程或函数中改变形参变量的值,将同时影响实参变量的值。

与之等价的Delphi语句如下:function normlen(var g:grad_t):Real;3)函数名与保留字同名VC++:float length(grad_t g);直接译为Delphi语句应该是function length(g:grad_t):Real;但当运行至if length(NumStr)>0时便会出现错误提示:[Error]Pictu⁃reUnit.pas(4307):Incompatible types:'grad_t'and'String',原因是length是Delphi保留字,用于返回字符串的动态长度。

保留字是由系统规定的、具有特定意义的单词,在编程时不能被重新定义或另作他用,因此必须把此处的函数名与Delphi保留字length加以区分。

Delphi:function length1(g:grad_t):Real;4)运算符重载VC++:grad_t operator*(grad_t g1,float s);grad_t operator+(grad_t g1,grad_t g2);Operator是VC++中的关键字,它与重载的运算符一起构成函数名,因函数名的特殊性,当编译器遇到该重载的运算符时就会调用此函数。

运算符重载为类的成员函数的一般语法形式为:<函数类型>类名::operator<重载运算符号>(形参表){函数体;}Delphi:function operatormult(g1:grad_t;s:Real):grad_t;function operatoradd(g1,g2:grad_t):grad_t;2.7向量及矩阵的定义及初始化1)向量VC++:coord3v0={0.0f,0.0f,0.0f};Delphi:constv0:Tcoord3=(x:0.0;y:0.0;z:0.0);2)4×4矩阵VC++:struct matrix44{int maskh;int maskv;};matrix44IDENTITY_MATRIX={0x8421,0x8421,{{1.0f,0.0f,0.0f,0.0f},{0.0f,1.0f,0.0f,0.0f},{0.0f,0.0f,1.0f,0.0f},{0.0f,0.0f,0.0f,1.0f}}};0x用来表示后面的数8421是十六进制,1.0f表示浮点后缀,说明1.0是浮点数。

相关主题