程序开发中函数的理解什么?

程序开发中函数的理解什么?,第1张

table 是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。) 表可以是 异构 的; 也就是说,表内可以包含任何类型的值( nil 除外)。 任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值 nil 。

表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 aname 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表(参见 §349)。

我们使用 序列 这个术语来表示一个用 {1n} 的正整数集做索引的表。 这里的非负整数 n 被称为该序列的长度(参见 §347)。

和索引一样,表中每个域的值也可以是任何类型。 需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。 这样,表就可以携带 方法 了。 (参见 §3411)。

索引一张表的原则遵循语言中的直接比较规则。 当且仅当 i 与 j直接比较相等时 (即不通过元方法的比较), 表达式 a[i] 与 a[j] 表示了表中相同的元素。 特别指出:一个可以完全表示为整数的浮点数和对应的整数相等 (例如:10 == 1)。 为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时, 都会被转换为对应的整数储存。 例如,当你写 a[20] = true 时, 实际被插入表中的键是整数 2 。 (另一方面,2 与 "2" 是两个不同的 Lua 值, 故而它们可以是同一张表中的不同项。)

表、函数、线程、以及完全用户数据在 Lua 中被称为 对象: 变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的 *** 作, 这些 *** 作均不会做任何形式的隐式拷贝。

库函数 type 用于以字符串形式返回给定值的类型

引用一个叫 var 的自由名字(指在任何层级都未被声明的名字) 在句法上都被翻译为 _ENVvar 。 此外,每个被编译的 Lua 代码块都会有一个外部的局部变量叫 _ENV (参见 §332), 因此,_ENV 这个名字永远都不会成为一个代码块中的自由名字。

在转译那些自由名字时,_ENV 是否是那个外部的局部变量无所谓。 _ENV 和其它你可以使用的变量名没有区别。 这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。 当编译器在转译自由名字时所用到的 _ENV , 指的是你的程序在那个点上可见的那个名为 _ENV 的变量。 (Lua 的可见性规则参见 §35)

被 _ENV 用于值的那张表被称为 环境。

Lua 保有一个被称为 全局环境 特别环境。它被保存在 C 注册表 (参见 §45)的一个特别索引下。 在 Lua 中,全局变量 _G 被初始化为这个值。 (_G 不被内部任何地方使用。)

当 Lua 加载一个代码块,_ENV 这个上值的默认值就是这个全局环境 (参见 load)。 因此,在默认情况下,Lua 代码中提及的自由名字都指的全局环境中的相关项 (因此,它们也被称为 全局变量 )。 此外,所有的标准库都被加载入全局环境,一些函数也针对这个环境做 *** 作。 你可以用 load (或 loadfile)加载代码块,并赋予它们不同的环境。 (在 C 里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)

Windows的API函数是应用程序开发的有力辅助工具,对它们的恰当使用,可大大增强和改进应用程序与系统打交道的能力,使自己的程序 真正具有底层 *** 作功能。作为RAD工具的基础代表,BORLANDDELPHI虽然本身也已提供了大 量强有力的函数和过程,但在某些场合、要求下,使用API函数将使你的程序进一步得到改 善,并可拓宽范围,简化程序代码。

在DELPHI中引用API函数,和使用DELPHI本身的函 数、过程几乎没有区别。在DELPHI目录下有一个WINDOWSPAS文件,凡是在其中声明过的API 函数,都可在编程时直接引用而无须另加说明。只是要注意,标准API函数都是以C或C++为 标准进行数据结构定义的,而DELPHI使用的是OBJECTPASCAL语言,因此在引用时应特别注 意参数和函数本身的数据类型。如一个API函数若为布尔值,则在DELPHI中就应以TRUE、FALSE 而不能用0、非0来对返回值进行判断。

下面以三个小例子来说明API函数在DELPHI中的 使用。

一、本地化消息框

想让自己的消息框显示“OK”、“Cancel”还是“确定”、“ 取消”?如果想使程序彻底本地化,那么还是放弃MessageDlg和ShowMessage吧——都怪DELPHI 没有。用MessageBox这个API函数照样方便。

使用语法为:

MessageBox(HWND:hWND,lpMessage:

PChar,lpCaption:PChar,uType:Cardinal);

各参数中,第一个为消息框所属的窗口句柄,第二 个为要显示的消息,第三个为消息框的标题,第四个为消息框的类型,函数返回值为整型数。

为使消息框有所归属,第一个参数设为当前窗口, 获取其句柄的方法是使用另一个API函数:GetActiveWindows(),且不需任何参数。

例1)Messagebox示例:

1.主要构件及属性的设置:

form1:caption:messagebox示例

bordericons:biMaximize和biHelp设为false

panel1:caption:文字部分Alignment:taLeftJustify

panel2:caption:图象部分Alignment:taLeftJustify

button1~button12:caption分别为:确定、确定取消、

确定帮助取消、是否、重试取消、终止重试取消、

信息、提问、系统图标、警告、停止、组合方式

bitbtn1:kind:bkClose

如图一所示:

2.事件说明:(详见源程序,下仅举两例)

{文字部分以button2click()为例}

procedureTForm1Button2Click(Sender:TObject);

begin

casemessagebox(getactivewindow(),

显示确定、取消框,例子,

okcancel)

ofidok:messagebox(getactivewindow(),

您按下的是“确定”按钮,

结果,mb_ok);

idcancel:messagebox(getactivewindow(),

您按下的是“取消”按钮,

结果,mb_ok);

end;

end;

{图象部分以button8click()为例}

procedureTForm1Button8Click(Sender:TObject);

begin

messagebox(getactivewindow(),显示警告图标,例子,

mb_iconwarning)

end;

二、改进Windows9x的系统登录的安全性:

Win9x的“用户登录”窗口可谓来者不拒,密码不 对照样可以“登堂入室”,系统为用户保留的个人设置等信息也就毫无保密性可言,通过查 看Profiles目录,可轻松地将其复制或删除。虽然Win95、Win98的应用对象是个人用户,但 在某些场合下,还是让登录窗口起点作用的好。

要使系统登录具有安全性,对非法使用者真正能 拒之门外,不妨用两个API函数来实现此目的。

例二)系统登录检查

1.主要构件及属性设置:

form1:caption:CheckUser

height、width:设为最小值

2.事件说明:

//定义变量

private

size:cardinal;

name:pchar;

entry:boolean;{Privatedeclarations}

procedureTCheckUserFormShow(Sender:TObject);

begin

size:=64;

name:=StrAlloc(64);

{检查用户名,判断是按了“取消”按钮还是键入了新用户名}

ifGetUsername(name,size)

thenifname=’wj’//‘wj’为笔者机器的登录用户名

{在此,若允许的合法使用者不止一个,还可利用关系运算指定

一个以上的用户进入。

如:if(name=’computer1’)or(name=’computer2’)

}

thenentry:=true;

close;

end;

procedureTCheckUserFormClose

(Sender:TObject;varAction:TCloseAction);

begin

ifnotentry

thenExitWindowsEx(EWX_REBOOT,32);

//若用户名不对,则重新启动Windows

end;

procedureTCheckUserFormCreate(Sender:TObject);

begin

entry:=false;//设定初始值

end;

编译完毕后,生成EXE文件,然后打开注册表—— 使用Regedit,找到HKEY_LOCAL_MACHINESOFTWAREMicrWindowsCurrentVersionRUN 行,添加键值名(如:CheckUser)及键值(EXE文件所在的完整路径)。如图所示:

好了,重新启动一次,没有正确的密码还能进入吗 ?

三.没有“媒体播放器”的声音播放

日前做了一个小程序,想在“关于”窗口加上一段 声音说明,但小小的“关于”FORM放上一个长长的、Visible属性需为False的MediaPlayer构 件实在别扭。东查西找之下,还是靠API函数SNDPLAYSOUND()解决了问题——从而摆脱了MediaPlayer 的“束缚”。例三)使用API函数控制声音文件的播放:(部分代码)

procedureTaboutBoxFormShow(Sender:TObject);

begin

//播放当前目录下的welcomewav文件

sndplaysound(‘welcomewav’,snd_async)

end;

procedureTAboutBoxFormClick(Sender:TObject);

begin

//停止播放

sndplaysound(‘’,snd_async);

end;

别忘了,在USES子句中加入mmsystem单元。如果只 需要播放声音,那么一条API函数就能实现功能的还用得着MediaPlayer来大动干戈吗?

总之,使用DELPHI的“聪明的程序员”们应该充分 发挥DELPHI调用API函数方便快捷的优势,好好利用API函数以更好地为自己程序服务。

这个是不是帮助文件里面的例子啊?我的和你差不多,成功过,你试试

double l1_endpt1[3] = {-14476606170268,23788333712953,00};

double l1_endpt2[3] = { 15471310496399,22539419253757,00};

double l2_endpt1[3] = {-14476606170268,12548103580189,00};

double l2_endpt2[3] = { 15471310496399,13797018039385,00};

double l3_endpt1[3] = {-14710981170268,18168218646571,00};

double l3_endpt2[3] = { 15289018829732,18168218646571,00};

double direction[3] = {00,00,10};

double ref_pt[3];

// double arc1_start_ang = (PI/180)87611984536731;

// double arc1_end_ang = (PI/180)27238801546327;

double arc1_start_ang = (PI/180)0;

double arc1_end_ang = (PI/180)360;

double arc1_rad = 05625;

double arc2_start_ang = (PI/180)27238801546327;

double arc2_end_ang = (PI/180)44761198453673;

double arc2_rad = 04375;

char part_name = "arm";

char taper_angle = "00";

char limit1[2] = {"10", "125"};

int english_units = 2, i, count = 4;

tag_t objarray[5], part, wcs_tag, matrix_tag;

uf_list_p_t loop_list, features;

UF_FEATURE_SIGN create = UF_NULLSIGN;

UF_CURVE_line_t line1, line2, line3;

UF_CURVE_arc_t arc1, arc2;

line1start_point[0] = l1_endpt1[0];

line1start_point[1] = l1_endpt1[1];

line1start_point[2] = l1_endpt1[2];

line1end_point[0] = l1_endpt2[0];

line1end_point[1] = l1_endpt2[1];

line1end_point[2] = l1_endpt2[2];

line2start_point[0] = l2_endpt1[0];

line2start_point[1] = l2_endpt1[1];

line2start_point[2] = l2_endpt1[2];

line2end_point[0] = l2_endpt2[0];

line2end_point[1] = l2_endpt2[1];

line2end_point[2] = l2_endpt2[2];

line3start_point[0] = l3_endpt1[0];

line3start_point[1] = l3_endpt1[1];

line3start_point[2] = l3_endpt1[2];

line3end_point[0] = l3_endpt2[0];

line3end_point[1] = l3_endpt2[1];

line3end_point[2] = l3_endpt2[2];

arc1start_angle = arc1_start_ang;

arc1end_angle = arc1_end_ang;

arc1arc_center[0] = l3_endpt1[0];

arc1arc_center[1] = l3_endpt1[1];

arc1arc_center[2] = l3_endpt1[2];

arc1radius = arc1_rad;

arc2start_angle = arc2_start_ang;

arc2end_angle = arc2_end_ang;

arc2arc_center[0] = l3_endpt2[0];

arc2arc_center[1] = l3_endpt2[1];

arc2arc_center[2] = l3_endpt2[2];

arc2radius = arc2_rad;

UF_CALL(UF_PART_new(part_name, english_units, &part));

UF_CALL(UF_CURVE_create_line(&line1,&objarray[0]));

UF_CALL(UF_CURVE_create_line(&line2,&objarray[1]));

UF_CALL(UF_CURVE_create_line(&line3,&objarray[4]));

UF_CALL(UF_CSYS_ask_wcs(&wcs_tag));

UF_CALL(UF_CSYS_ask_matrix_of_object(wcs_tag, &matrix_tag));

arc1matrix_tag = matrix_tag;

arc2matrix_tag = matrix_tag;

UF_CALL(UF_CURVE_create_arc(&arc1, &objarray[2]));

UF_CALL(UF_CURVE_create_arc(&arc2, &objarray[3]));

UF_CALL(UF_MODL_create_list(&loop_list));

// for(i = 0; i < count; i++) {

UF_CALL(UF_MODL_put_list_item(loop_list, objarray[2]));

// }

UF_CALL(UF_MODL_create_extruded(loop_list, taper_angle, limit1,

ref_pt, direction, create, &features));

我的UG卸掉了,你先试试这段行不行

未正确加载CATIA类型库文件。

在使用CATIA二次开发时,需要先加载CATIA的类型库文件。如果未正确加载类型库文件,则可能会导致无法使用apply等方法。

CATIA是汽车工业的事实标准,是欧洲、北美和亚洲顶尖汽车制造商所用的核心系统。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12186150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存