第一篇:C语言代码套用在Delphi编程中
C语言代码套用在Delphi编程中(C++Builder(VC++)与 Delphi)
Delphi适合用来开发应用程序,但是有时侯一些底层的东西可以直接使用C语言来开发.我在公司经常开发跟硬件相关的项目,而很多硬件的SDK包是用C来写的.这个时候我一般把它们转换成Delphi(PASCAL)语法的代码.一:将C语言的程序编译成DLL供Delphi调用.这种方法过于简单,而且需要额外带一个DLL文件,所以不在本文的讨论范围之内.二:直接转换C语言代码到DELPHI代码
C语言的函数格式与Delphi不同,它们是函数返回类型在前,函数声明在后.对于没有任何返回类型的函数则定义为VOID类型.例如:Delphi中函数function MyFunction:(intIN:integer):Bool;相应的C语言代码就变成Bool MyFunction(int intIN);又例如procedure MyProcedure;====>void MyProcedure;采用这种方法,一般要求对C语言比较熟悉.我一般是采用这种方法.下面是我收集整理的自己常用的Delphi与C之间的类型对应表.其中左边是C类型,右边是对应的Delphi类型: 以下是引用片段:
ABC-> TABC
ACCEL-> TAccel
ATOM-> TAtom
BITMAP-> TBitMap
BITMAPCOREHEADER-> TBitmapCoreHeader
BITMAPCOREINFO-> TBitmapCoreInfo
BITMAPFILEHEADER-> TBitmapFileHeader
BITMAPINFO-> TBitmapInfo
BITMAPINFOHEADER-> TBitmapInfoHeader
BOOL-> Bool
CBT_CREATEWND-> TCBT_CreateWnd
CBTACTIVATESTRUCT-> TCBTActivateStruct
CHAR-> Char
CHAR*-> PChar
CLIENTCREATESTRUCT-> TClientCreateStruct
COLORREF-> TColorRef
COMPAREITEMSTRUCT-> TCompareItemStruct
COMSTAT-> TComStat
CREATESTRUCT-> TCreateStruct
CTLINFO-> TCtlInfo
CTLSTYLE-> TCtlStyle
CTLtype-> TCtltype
DCB-> TDCB
DDEAACK-> TDDEAck
DDEADVISE-> TDDEAdvise
DDEDATA-> TDDEData
DDEPOKE-> TDDEPoke
DEBUGHOOKINFO-> TDebugHookInfo
DELETEITEMSTRUCT-> TDeleteItemStruct
DEVMODE-> TDevMode DOUBLE-> Double
DRAWITEMSTRUCT-> TDrawItemStruct DWORD-> LongInt
ENUMLOGFONT-> TEnumLogFont EVENTMSG-> TEventMsg FARPROC-> TFarProc FIXED-> TFixed FLOAT-> Single
GLYPHMETRICS-> TGlyphMetrics HANDLE-> THandle
HANDLETABLE-> THandleTable
HARDWAREHOOKSTRUCT-> THardwareHookStruct HELPWININFO-> THelpWinInfo INT-> Integer
KERNINGPAIR-> TKerningPair LOGBRUSH-> TLogBrush LOGFONT-> TLogFont
LOGPALETTE-> TLogPalette LOGPEN-> TLogPen LONG-> LongInt
LONG DOUBLE-> Extended LONG INT-> LongInt LPSTR-> PChar
LPWSTR-> PWideChar MAT2-> TMat2
MDICREATESTRUCT-> TMDICreateStruct
MEASUREITEMSTRUCT-> TMeasureItemStruct MENUITEMTEMPLATE-> TMenuItemTemplate
MENUITEMTEMPLATEHEADER-> TMenuItemTemplateHeader METAFILEPICT-> TMetaFilePict METAHEADER-> TMetaHeader METARECORD-> TMetaRecord MINMAXINFO-> TMinMaxInfo
MOUSEHOOKSTRUCT-> TMouseHookStruct MSG-> TMsg
MULTIKEYHELP-> TMultiKeyHelp
NCCALCSIZE_PARAMS-> TNCCalcSize_Params NEWTEXTMETRIC-> TNewTextMetric OFSTRUCT-> TOFStruct
OUTLINETEXTMETRIC-> TOutlineTextMetric PAINTSTRUCT-> TPaintStruct PALETTEENTRY-> TPaletteEntry PANOSE-> TPanose
PATTERN-> TPattern
POINTFX-> TPointFX
PSTR-> PChar
PWSTR-> PWideChar
RASTERIZER_STATUS-> TRasterizer_Status
RGBQUAD-> TRGBQuad
RGBTRIPLE-> TRGBTriple
SEGINFO-> TSegInfo
SHORT-> SmallInt
SHORT INT-> SmallInt
SIZE-> TSize
TEXTMETRIC-> TTextMetric
TPOINT-> TPoint
TRECT-> TRect
TTPOLYCURVE-> TTTPolyCurve
TTPOLYGONHEADER-> TPolygonHeader
UINT-> Word
UNSIGNED-> Word
UNSIGNED CHAR-> Byte
UNSIGNED INT-> Word
UNSIGNED LONG-> LongInt(DWORD)
UNSIGNED LONG INT-> LongInt
UNSIGNED SHORT-> Word
UNSIGNED SHORT INT-> Word
VOID*-> Pointer
WINDOWPLACEMENT-> TWindowPlacement
WINDOWPOS-> TWindowPos
WNDCLASS-> TWndClass
WORD-> Word 三:在Delphi中直接链接C语言的OBJ文件.这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以直接把OBJ文件链接到我们的程序里面.不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:
这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下: 以下是引用片段:
/*
文件名称:DatFormat.h
*/
#ifndef DatFormat_H #define DatFormat_H #include
#pragma pack(push, 1)//这个与下面的配对,一般用到记录类型的时候需要定义,这里实际不用
#ifdef __cplusplus
extern “C” {
#endif
extern BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile);
#ifdef __cplusplus
}
#endif
#pragma pack(pop)
#endif // DatFormat_H
具体实现代码DatFormat.c如下:
#include “DatFormat.h”
BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)
/*
函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式.参数:
IN:
FileName:欲判断的文件名称
IN,OUT:
IsDatFile:是否为Dat格式文件
OUT:
读文件失败返回FALSE,否则返回TRUE.-----{
HANDLE hFile;
DWORD dwBytesRead;BOOL re;
char MyBuf[4];*IsDatFile=FALSE;//建立读文件句柄
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE)return FALSE;//读文件
re = ReadFile(hFile, &MyBuf, 4,&dwBytesRead, NULL);
if(dwBytesRead!=4){
CloseHandle(hFile);return FALSE;}
//读文件失败的时候
if(re!=TRUE){
CloseHandle(hFile);return FALSE;}
CloseHandle(hFile);
*IsDatFile=(MyBuf[0]=='R' && MyBuf[1]=='I' && MyBuf[2]=='F' && MyBuf[3]=='F');return(TRUE);} 运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.运行Delphi,新建一个工程并保存.然后把DatFormat.OBJ拷贝到它的目录之下.在单元的implementation下面添加如下代码:
{$LINK 'DatFormat.obj'} //链接外部OBJ文件
function _CheckIsDatFile(const FileName:Pchar;IsDatFile:PBool):Bool;cdecl;external;//定义函数.其中cdecl进栈方式说明采用C语言格式传递参数.external说明是个外部声明函数.注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中.C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论.请感兴趣的朋友自行参阅相关资料.然后我们写如下代码调用此函数: 以下是引用片段:
procedure TFrmMain.Button1Click(Sender: TObject);
var
IsDatFile:Bool;
begin
if OpenDialog1.Execute then
if _CheckIsDatFile(Pchar(OpenDialog1.FileName),@IsDatFile)then
if IsDatFile then ShowMessage('恭喜!该文件是一个Dat格式的视频文件!')
else ShowMessage('不好意思,该文件不是一个Dat格式的视频文件!')
else ShowMessage('读文件错误!');
end;编译这个程序,将得到一个干净的可执行EXE文件了.四:C++Builder中使用Delphi单元
这个实际是题外话了,不过这里还是提一提:假设我们有一个获取BIOS密码的Delphi单元
unit AwardBiosPas;
{=========
项目: 在Delphi编程中使用C语言代码-演示程序
模块: 获取BIOS密码单元 以下是引用片段:
interface
uses
windows, SysUtils;
function My_GetBiosPassword: string;
implementation
function CalcPossiblePassword(PasswordValue: WORD): string;
var
I: BYTE;
C: CHAR;
S: string[8];
begin
I := 0;
while PasswordValue <> 0 do
begin
Inc(I);
if $263 > PasswordValue then
begin
if $80 > PasswordValue then
S[I] := CHAR(PasswordValue)
else if $B0 > PasswordValue then
S[I] := CHAR(PasswordValue and $77)
else if $11D > PasswordValue then
S[I] := CHAR($30 or(PasswordValue and $0F))
else if $114 > PasswordValue then
begin
S[I] := CHAR($64 or(PasswordValue and $0F));
if '0' > S[I] then
S[I] := CHAR(BYTE(S[I])+ 8);
end
else if $1C2 > PasswordValue then
S[I] := CHAR($70 or(PasswordValue and $03))
else if $1E4 > PasswordValue then
S[I] := CHAR($30 or(PasswordValue and $03))
else
begin
S[I] := CHAR($70 or(PasswordValue and $0F));
if 'z' < S[I] then
S[I] := CHAR(BYTE(S[I])BYTE(S[I]))shr 2;end;
S[0] := CHAR(I);
PasswordValue := I shr 1;while PasswordValue < I do
begin {this is to do because award starts calculating with the last letter} C := S[BYTE(S[0])I + 1] := S[I];S[I] := C;Dec(I);end;
CalcPossiblePassword := S;end;
function readcmos(off: byte): byte;var
value: byte;begin asm
xor ax, ax mov al, off out 70h, al in al, 71h mov value, al end;
readcmos := value;end;
function My_GetBiosPassword: string;var
superpw, userpw: word;begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT
begin
pchar(@superpw)[0] := char(readcmos($1C));
pchar(@superpw)[1] := char(readcmos($1D));
pchar(@userpw)[0] := char(readcmos($64));
pchar(@userpw)[1] := char(readcmos($65));
Result:=('************BIOS密码**********************')+#13+'超级用户密码为:' + CalcPossiblePassword(superpw)+ #13 + '用户密码为:' + CalcPossiblePassword(userpw);
end
else
Result := '用户系统为NT,无法获取BIOS密码!';
end;
end.如何直接在CBC中使用它呢?新建一个CBC工程,然后把这个单元加到项目里面去.具体操作为:Add to Project--->文件类型:pascal unit(*.pas),然后Build Demo1.这个时候将在AwardBiosPas.pas的同目录下生成一个AwardBiosPas.hpp文件.把它引用到我们的需要调用的单元.然后直接调用即可: 以下是引用片段:
void __fastcall TFrmMain::Button1Click(TObject *Sender)
{
ShowMessage(My_GetBiosPassword());
} 五:其它方法.当然可以用RES将C语言生成的二进制文件,但这个方法与第一种方法差不多.优点是不怕文件丢失.缺点是很容易被别人直接用资源修改工具打开修改.这个时候可以使用笔者写的自制编程序工具PasAnywhere.不过这已经是另外一个话题了.
第二篇:编程语言学习心得
程序语言学习的总结
通过两年的学习,我们基本上掌握了C语言,C++和C#三个编程课程。对于程序设计语言的学习,分为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。课程上的安排除了课堂讲授以外,学院设有专门课堂到实验室进行上机操作实验。
要利用c语言学到的知识编写c语言程序,即把c语言作为工具,通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。通过上机实验来验证自己编制的程序是否正确。在这种思想支配下,可能你会想办法去“掩盖”程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。
在原有的C语言的基础知识之上,初步接触C++时感到比较简单易懂。但随着之后的步步深入学习,C++的不同之处以及其优势逐。从第二章引入了C++简单程序的设计。包括一些C++语言的概述,基本数据类型和表达式,数据的输入与输出,算法的基本东芝结构,以及自定义类型数据等知识。此部分多与C语言相似。之后又学习了函数的相关内容,这里学到了新的知识要点----函数重载。该内容尤其在现在做课程设计的时候尤为重要。类是C++语言的精华之所在,在学习中,我感觉到类和C语言中的结构体有很大的相似之处,但在类中的构造函数、拷贝构造函数以及类的组合,经常弄混淆一些概念。在这之后又学习了类的继承与派生。这使得类与类之间形成了树状图的模型,各子类可以访问到父类的一些数据成员,同样也实现了数据的之间的“共享”。我个人在编写派生类的构造函数和拷贝构造函数时,感觉很不熟练,后面章节的多态性主要学习了运算符的重载,其本质就是函数的重载。
在学习C#中,类是具有相同特性和行为的对象的抽象。它使用关键字class声明的。在c#中仅允许单个继承,类只能从一个基类继承实现。但是一个类可以实现一个以上的接口。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等局可以看对象,它不仅表示具体的事物,还能表示抽象的规则、计划或者事件。接口只是包含方法、委托或事件的签名。方法的实现是在实现接口的类中完成的。接口可以是命名空间或类的成员,并可以包含下列成员:每个C#可执行文件都有一个入口—Main方法:static void Main()修饰符public表示可以在任何地方访问该方法。所以可以在类的外部调用它。修饰符static表示方法不能在类的实例上执行,因此不必先实例化类在调用。在变量声明时:变量是类或者结构中的字段,如果没有显示初始化,创建这些变量时,其值就是默认的0。变量是方法的局部变量就必须在代码中显示初始化,之后才能在语句中使用它们的值。
课堂上要讲授许多关于语法规则,要使用这些工具解决问题,通过多次上机练习,对于语法知识有了更深刻的认识,在理解的基础上就会自然而然地掌握。一个程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。通过上机实验,熟练地掌握开发环境,为以后真正编写计算机程序解决实际问题打下基础。
第三篇:C语言编程
#include(stdio.h)
main()
{ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};
char again='y';
while(again=='y'){ srand((int)time(0));
while(i4){ k=(int)rand()%10;
for(j=0;ji;j++)if(k==question[j]){ k=-1;break;}
if(k==-1)continue;question[i]=k;i++;}/*while i*/
for(i=8;i0;i--)/*还有8次机会*/
{ A=0;B=0;printf(“n你还剩下%d次机会。”,i);
printf(“n请输入四个0-9之间的数字,中间用空格隔开n”);for(j=0;j4;j++)scanf(“%d”,&answer[j]);
for(j=0;j4;j++)
for(k=0;k4;k++)
{ if(answer[j]==question[k]){ if(j==k)A++;else B++;} }/*for*/
if(A==4){ again='0';
printf(“n你赢了,还继续猜吗?(y/n)”);
while(again!='y'&&again!='n')
scanf(“...%c”,&again);break;}/*if*/
printf(“n%dA%dB”,A,B);if(i==1){ again='0';
printf(“n你输了,正确答案是”);
for(j=0;j4;j++)
printf(“%dt”,question[j]);
printf(“n还继续吗?(y/n)”);
while(again!='y'&&again!='n')scanf(“%c”,&again);
printf(“%c”,again);break;}/*if*/ }/*for changce*/ }/*while again*/ printf(“感谢您玩这个游戏。”);}
第四篇:数控编程自己整理的G代码
G00 快速点定位
G01 直线插补
G02 顺时针圆弧插补 G03 逆时针圆弧插补 G04 暂停
G05.1 预读处理控制
G07.1 圆柱插补
G08 预读处理控制
G09 准确停止
G10 可编程数据输入 G11 可编程数据输入 G15 极坐标取消
G16 极坐标指令
G17 选择XY平面
G18 选择ZX平面
G19 选择YZ平面
G20 英寸输入
G21 毫米输入
G22 存储行程检测接通
G23 存储行程检测接通检测断开 G27 返回参考点检测G28 返回参考点检测点 G05 快速点定位
G06 直线插补
G07 顺时针圆弧插补G08 逆时针圆弧插补G09 暂停
G05.2 预读处理控制G07.2 圆柱插补
G05 快速点定位
G06 直线插补
G07 顺时针圆弧插补G08 逆时针圆弧插补G09 暂停
G05.2 预读处理控制G07.2 圆柱插补
G08 预读处理控制
G46 刀具位置偏置减
G47 刀具位置偏置加1倍G48 刀具位置为原来的1/2G49 刀具长度补偿取消G50 比例缩放取消
G51 比例缩放有效
G50.1 可编程镜像有效像有效 G51.1 可编程镜像取消G52 局部坐标系设定G53 选择机床坐标系G54 选择工件坐标系1G54.1 选择附加工件坐标系 G55 选择工件坐标系2 G56 选择工件坐标系3 G57 选择工件坐标系4 G58 选择工件坐标系5 G59 选择工件坐标系6 G60 单方向定位方式 G61 准确停止方式 G62 自动拐角倍率 G63 攻螺纹方式
G64 切削方式
G65 宏程序非模态调用 G66 宏程序模态调用 G67 宏程序模态调用取消 G68 坐标系旋转
G69 坐标系旋转取消 G73 深孔钻循环
第五篇:C语言课程设计代码
#include “stdio.h” #include
void main(){ int n=0;struct course *head=NULL;void insert(struct course **head,struct course *cou);void Print(struct course **head,int *n);void Modify(struct course **head,int *n);void Require(struct course **head);void Creat(struct course **head,int *n);void Delete(struct course **head,int *n);void Fun(struct course **head,int *n);
Fun(&head,&n);}
void insert(struct course **head,struct course *cou){ struct course *p0,*p1,*p2;p2=p1=*head;p0=cou;if(*head){
while((p0->semester>p1->semester)&&(p1->next))
{
p2=p1;
p1=p1->next;
}
if(p0->semester
semester)
{
if(*head==p1)*head=p0;
else p2->next=p0;
p0->next=p1;}
else
{
if(p0->semester==p1->semester){ while((p0->cID>p1->cID)&&(p1->next)&&(p0->semester==p1->semester))
{
} if(p0->semester!=p1->semester){
} else {
if(p0->cID<=p1->cID){
if(*head==p1)*head=p0;else p2->next=p0;p2=p1;p1=p1->next;p2->next=p0;p0->next=p1;
p0->next=p1;
}
else
{p1->next=p0;p0->next=NULL;}
}
}
else
{p1->next=p0;p0->next=NULL;}
} } else
{
*head=p0;
p0->next=NULL;} }
void Print(struct course **head,int *n){ struct course *p;p=*head;if(*head){
if(*n==1)printf(“nThis %d record is:n”,*n);
else printf(“nThese %d records are:n”,*n);
printf(“semester cID
name
creditn”);
do
{ printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
p=p->next;
}while(p!=NULL);} else printf(“nList null!n”);}
void Modify(struct course **head,int *n){ struct course *p,*p2;int cID;if(*head){
Print(head,n);while(1){ printf(“nPlease input the cID which you want to modify:”);
scanf(“%d”,&cID);p2=p=*head;while(p->next&&(cID!=p->cID)){
p2=p;
p=p->next;} if(cID==p->cID){
printf(“Please input the new cID(1~60):”);
scanf(“%d”,&p->cID);
while(p->cID<0||p->cID>60)
{
printf(“nError!”);
printf(“nPlease input the new cID(1~60):”);
scanf(“%d”,&p->cID);
}
printf(“Please input the new semester(1~8):”);
scanf(“%d”,&p->semester);while(p->semester<0||p->semester>8)
{
printf(“nError!”);
printf(“nPlease input the new semester(1~8):”);
scanf(“%d”,&p->semester);
}
printf(“Please input the new credit:”);
scanf(“%f”,&p->credit);
printf(“Please input the new name:”);
scanf(“%s”,p->name);
if(p==*head)*head=p->next;
else p2->next=p->next;
insert(head,p);
break;
}
else printf(“%d not been found!n”,cID);
} } else {printf(“nList null!n”);} }
void Require(struct course **head){ struct course *p;float sum=0;int sem,i=0;printf(“nPlease input the semester which is required:”);
scanf(“%d”,&sem);p=*head;while(p){
if(sem==p->semester)
{
i++;if(i==1)printf(“nsemester cID
name
creditn”);printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
sum=sum+p->credit;
}
p=p->next;} printf(“The sum of credit in this term is:%.1fn”,sum);}
void Creat(struct course **head,int *n){ struct course *p1;while(1){
p1=(struct course *)malloc(LEN);
printf(“Please input the cID(1~60):”);
scanf(“%d”,&p1->cID);
while(p1->cID<0||p1->cID>60)
{
printf(“nError!”);
printf(“nPlease input the cID(1~60):”);
scanf(“%d”,&p1->cID);
}
if(p1->cID==0)break;
printf(“Please input the semester(1~8):”);
scanf(“%d”,&p1->semester);
while(p1->semester<0||p1->semester>8)
{
printf(“nError!”);
printf(“nPlease input the semester(1~8):”);scanf(“%d”,&p1->semester);
}
} } printf(“Please input the credit:”);scanf(“%f”,&p1->credit);printf(“Please input the name:”);scanf(“%s”,p1->name);insert(head,p1);*n=*n+1;printf(“nYou can continue until the cID is ”0“!n”);Print(head,n);void Delete(struct course **head,int *n){
struct course *p1,*p2;int cID;Print(head,n);if(*head){ printf(“Please input the cID of the course which you want to delete:”);scanf(“%d”,&cID);p1=*head;
while(cID!=p1->cID&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(cID==p1->cID)
{
if(p1==*head)*head=p1->next;
else p2->next=p1->next;
printf(“Have delete cID:%dn”,cID);
*n=*n-1;
}
else printf(“%d not been found!n”,cID);} }
void Fun(struct course **head,int *n){ char num;
while(1)
{
system(“cls”);
puts(“**************** Main Menu ******************”);
puts(“* 1.Add Records
2.Print Records
*”);
puts(“* 3.Delete Records
4.Modify Records *”);
puts(“* 5.Require Records 6.Exit
*”);
printf(“Please input your choice: ”);
scanf(“%d”,&num);
switch(num)
{
case 1:Creat(head,n);break;
case 2:Print(head,n);break;
case 3:Delete(head,n);break;
case 4:Modify(head,n);break;
case 5:Require(head);break;case 6:exit(0);break;
default: break;
}
printf(“nPress ”Enter“ to continue!”);getchar();getchar();
} }