pl0编译器
A. cad命令大全
AutoCAD使用技巧
1. 在AutoCAD中有时有交叉点标记在鼠标点击处产生,用BLIPMODE命令,在提示行下输入OFF可消除它。
2. 有的用户使用AutoCAD时会发现命令中的对话框会变成提示行,如打印命令,控制它的是系统变量CMDDIA,关掉它就行了。
3. 椭圆命令生成的椭圆是以多义线还是以椭圆为实体是由系统变量PELLIPSE决定,当其为1时,生成的椭圆是PLINE。
4. CMDECHO变量决定了命令行回显是否产生,其在程序执行中应设为0。
5. DIMSCALE决定了尺寸标注的比例,其值为整数,缺省为1,在图形有了一定比例缩放时应最好将其改为缩放比例。
6. BREAK将实体两点截开,在选取第二点时如用“@”来回答,可由第一点将实体分
7. CAD的较高版本中提供了形位公差标注,但圆度及同轴度中的圆不够圆,其实,AutoCAD中常见符号定义都在AutoCAD安装目录下SUPPORT子目录下的gdt.shp文件中,其中2号和4号字符定义了圆形的形状,圆的弧度竟为127°,但不太好改正之(如改为90°更不好看)。
8. 空心汉字字形如使用AutoCADR14中的BONUS功能(一定要完全安装AutoCAD,或自定义安装时选了它),有一个TXTEXP命令,可将文本炸为线,对做立体字十分有用。
9. AutoCADR14的BONUS中有一个ARCTEXT命令,可实现弧形文本输出,使用方法为先选圆弧,再输入文本内容,按OK。
10. BONUS中还有一个有用的命令,即MPEDIT,用它将多个线一齐修改为多义线,再改它的线宽。
11. image命令在R14中代替了R13中的BMPIN、PCXIN之类命令,它将位图嵌入文件中,只用来显示,如炸开就成了空框架,如何使PCXIN等命令重现?请将R13安装目录下的RASTERIN.EXE拷入R14下,用appload将其装入,然后就可以将位图导入(可编缉,可炸开)了。
12. BREAK命令用来打断实体,用户也可以一点断开实体,用法是在第一点选择后,输入“@”。常用一条线段为点划线,另一段为实线时。
13. AutoCADR14中提供了大量的命令缩写,许多R13中无缩写的命令也有了缩写,下面提供了CAD中的单字符缩写:
A:ARC,B:Bmake,C:Circle,D:ddim,E:erase, F:fillet,G:group,H:bhatch,I:ddinsert,L:line, M:move,O:offset,P:pan,R:redraw,S:stretch,
T:mtext,U:undo,V:ddview,W:Wblock,X:explode,Z:zoo。你会发现使用它们比鼠标点取快(尤其在1s输5个字符的速度下)。AutoCADR14大量扩充了简化命令,不仅增加了以首字母简化的命令(这里不列出),而且增加了用前两个字母简化的命令,常用的如:array、、dist、donut、dtext、filter、mirror、pline、rotate、trim、scale、snap、style、units等,更加提高了用键盘输入命令的速度。
14. AutoCADR14的命令缩写也可用在R13,方法是将AutoCADR14下Support子目录下的ACAD.pgp拷贝至AutoCADR13的Support子目录下。
15. AutoCAD中ACAD.pgp文件十分重要,它记录命令缩写内容,用户可自定义它们,格式如下:<命令缩写>*命令名称。也可定义系统命令,AutoCADR14提供了sh命令,可执行DOS命令,但在Windows下作用不大。
16. AutoCADR14中用NOTEPAD、EDIT、DIR、DEL等系统命令,笔者认为其中NOTEPAD对自定义CAD用途较大,但使用起来会发现屏幕一闪(进了DOS),又返回,十分让人不愉快,让我们来编一个小程序,取名为note.lsp:
(defunc:notepad()
(startapp"notepad")
) 先将ACAD.pgp中的NOTEPAD命令定义行删除,重入CAD后,再将此程序用命令:(load"note")装入,下一次用NOTEPAD命令会有更好效果,最好将(load"note")加入Support子目录下的ACADR14.lsp中。
17. AutoCADR14中打印线宽可由颜色设定,这样机械制图中的各种线型不同、线宽不同的线条可放入不同的层,在层中定义了线型和颜色,而在打印设置中设定线型与颜色的关系,效果良好。
18. AutoCADR14的Support中ACAD.dwt为缺省模板,要好好加工它,把常用的层、块、标注类型定义好,再加上标准图框,可省去大量重复工作。
19. AutoCAD中有不少外部Lisp命令文件,可以直接观察它们,如果学习开发Lisp应用程序,注意:R14可是最后一版Lisp文件内容公开的AUTOCAD,在CAD2000中Lisp文件内容是加密的(笔者正在研究解密程序)。
20. AutoCAD二次开发工具很多,Lisp早就有了,R11提供了ADS(AcadDevelopsystem),R12中提供了ADS对实模式下C编译器(如BC,MSC)的支持,R13提供ARX(AcadRuntimeeXtend),R14提供了VBAutomation,这个Automation使VB编写CAD程序成为可能,渴望CAD编程的人有了一个最好的选择,不必学习ADS、ARX、ObjectARX,和AutoLisp,一起加入AutoCAD编程的世界。
21. 用户自定义的Lisp文件一定要自动装入AutoCAD,这样就需要在acadr14.lsp中加入用户Lisp文件的装入语句,acadr14.lsp(早期版本为acad.lsp),好似DOS的Autoexec.bat,一定要好好利用,在其中如定义了名为S::STARTUP()的函数可自动运行它(给CAD加个启用画面如何,可用STARTUP加startapp函数,也可加登录密码)。
22. 将AutoCAD中的图形插入WORD中,有时会发现圆变成了正多边形,用一下VIEWRES命令,将它设得大一些,可改变图形质量。
23. 形如f30H11()的标注如何去标注呢,请在文本内容中输入“%%c30{H11(){\H0.7x;\S+0.1^-0.2;}}”,可以实现,如嫌太麻烦,就编个程序来简化操作。
24. AutoCAD中文件可当作块插入其他文件中,但这样一来过多的块使文件过于庞大,用PURGE来清除它们吧,一次清一层,一定要多用几次呀!
25. AutoCADR14的帮助文件内容十分丰富,由很多本“书”组成,一层层打开,多看它们用处是很大的,其中包括了CAD的各方面,比任何CAD大全还全,你是否想您的帮助加入其中,请修改acad.cnt,加入自己帮助的链接。
26. 在CAD中可按规定编定.ahp的CAD帮助文件,在R14下用ahp2hlp.exe将其转变为.hpj的文件和.rtf的文件,再用HelpWorkshop工具(在VC5中有)将其项目打开,编译为.hlp文件。
27. 在AutoCAD中有一些DOS下的exe文件在R14中仍有用途,用Slidelib.exe可将幻灯片作库,mc.exe可实现菜单的编译。
28. 在作完零件图进行组装时,可将零件图块插入后焊开,再用group成组后组装,这时用ddselect命令控制组选取处于何种状态,取消组选取时可将组内成员删除、剪切、修改,要移动零件时再打开组状态。
29. 在AutoCAD中的菜单源文件为.mnu文件,将其修改可将自己的命令加入菜单中,再用menu命令装入,可参加AutoCAD帮助了解菜单文件格式。图标工具条中加入自己的命令相对简单,可在工具条上点右键,在toolbar对话中,点new按钮,输入工具条后,一个新工具条产生,再选Customize按钮,选定custom,将空按钮拖入工具条中,再在空按钮上按右键,这样就可定义自己的按钮图标和命令。
30. AutoCAD的状态行也可自定义,用DIESEL语言可以访问它,最简单的方法用modemacro命令,后输入$(getvar,clayer),以后当前层名就显示在状态行上,用户化可谓无孔不入吧!
31. AutoCAD的图形格式为.dwg,也可导出为.bmp及.wmf或.eps、.dxf、.3ds,如果用render命令可存为.pcx、.tga、.tif格式,AutoCAD还可将文件直接存为这几种格式,要为系统装一个名为“Rasterfileexport”的打印机,用它打印到文件,ACAD2000还可将文件存为JPG格式。
32. render进行着色时,render无关闭按钮,用户可用:(arxunload"render"),因为它是ARX文件扩展的功能。
33. dimzin系统变量最好要设定为8,这时尺寸标注中的缺省值不会带几个尾零,用户直接接受缺省值十分方便快捷。
34. 如遇到快捷键失效,如^o失去作用,变为正交模式切换的情况,请用menu将当前使用菜单的.mnu菜单源文件重装一遍即可。
35. 在多行文字(mtext)命令中使用Word97编辑文本。Mtext多行文字编辑器是AutoCADR14中的新增功能,它提供了Windows文字处理软件所具备的界面和工作方式,它甚至可以利用Word97的强大功能编辑文本,这一功能可以用如下方法实现:打开“Tools”菜单选“Preferences”命令,“Preferences”对话框弹出后,打开“Files/TextEditor,Dictionary,andFontFileName/TextEditorApplication/Internal”,双击“Internal”,出现“Selectafile”对话框,接着找到“Winword.exe”应用程序文件,击“打开”钮,最后单击“OK”返回。完成以上设置后,用户如再使用mtext命令时系统将自动调用我们熟悉的Word97应用程序,为AutoCAD中的文本锦上添花。
36. 巧用工具按钮自定义。AutoCAD中有许多lsp文件能为我们提供非常实用的命令,如chtext.lsp就是一个很好的文字修改命令,尤其适用于大批文字的修改,但在使用这样的命令之前必须先把lsp文件载入。一般你可以通过选取“Tools”菜单中“LoadApplication...”选项,再利用对话框打开AutoCADR14/Support下的Chtext.lsp文件,然后击“Load”钮,或者也可以直接在命令行中键入“(load“chtext”)”以达到载入的目的,如此做总有些繁琐。下面我们用自定义工具按钮的方式解决这个问题,右击任意工具钮,弹出“Toolbars”对话框,击“Customize...”钮,在“Categories:”中选“Custom”项,将出现的空按钮拖到工具条中目标位置,击“Close”钮返回,接着右击空按钮,出现“ButtonProperties”对话框,在“Name:”栏中为命令钮命名,“Help:”栏中你可写入或不写入内容,然后在“Macro:”中键入“(load“chtext”)cht”,至于“ButtonIcon",用户可选系统提供的图标,也可以点“Edit...”自行绘制或者直接调用已有的bmp文件,最后点“Apply”钮并依次关闭对话框返回。这样你自己的工作按钮就做成了。由于在后面增加了“cht”(注意:前面要有空格),所以你只要按下工具钮便可以直接去选择要编辑的目标文件。
37. “Stretch”命令也是一个常用命令,但输入命令后,系统总要提示“_windoworcrossing_polygon...”,要求你再输入一个“C”后才能用鼠标去选择目标。为了使操作简化,用户只需将系统提供的工具按钮做些小小的修改即可。右击任意工具按钮弹出“Toolbars”对话框,再右击“stretch”工具钮弹出“ButtonProporties”对话框,在“Macro:”框中的“^c^c_stretch”后键入空格和“C”。以后你再点击处理后的工具钮就可以直接选择目标进行操作。
38. AutoCADR14用户通常均采用系统给出的缺省格式存盘,这种格式存盘的缺点是文件所占空间大,不能用低版本的应用程序(如:AutoCADR12、AutoCADR13)打开,为避免磁盘空间的浪费,你可以在“SaveDrawingAs”对话框的“保存类型”中选“AutoCADR12/LT2Drawing”格式存盘。例如:同一dwg文件用两种方式存盘,它们的大小分别是87KB、58KB。可见差别还是很可观的。而且后者文件可以在R12、R13版本的应用程序中打开。这种方法对配置较低的用户尤为实用。
39. 有时在打开dwg文件时,系统弹出“AutoCADMessage”对话框提示“Drawingfileisnotvalid”,告诉用户文件不能打开。这种情况下你可以先退出打开操作,然后打开“File”菜单,选“DrawingUtilities/Recover”命令,或者在命令行直接用键盘输入“recover”,接着在“SelectFile”对话框中输入要恢复的文件,确认后系统开始执行恢复文件操作。
40. 汉化菜单。将support目录下的acad.mnu文件复制为chinese.mnu。用写字板打开chinese.mnu。仔细观察会发现其中有许多类似“***POP”的条目,每一条目定义了一列下拉菜单。将引号中的英文命令名称改为中文,存盘退出。再在R14中输入“menu”命令,将chinese.mnu菜单文件装入,下拉菜单就变成了中文。还可以再装入acad.mnu文件将菜单还原。
41. R14默认的“命令取消”键是“ESC”键,如果你已经习惯了R12的“Ctrl+C”怎么办呢?点击菜单Tools\preferences\compatibility\priorityforacceleratorkeys\autoCADclassic,然后就可以用“Ctrl+C”取消命令了,同时“ESC”键仍然有效。
42. trim命令中提示选取要剪切的图形时,不支持常用的window和crossing选取方式。当要剪切多条线段时,要选取多次才能完成。这时可以使用fence选取方式。当trim命令提示选择要剪除的图形时,输入“f”,然后在屏幕上画出一条虚线,回车,这时被该虚线接触到的图形全部被剪切掉。
43. 单击“ObjectPropertys”工具条上的“Makeobjects'layercurrent”按钮,然后在作图区选择要去的图层上的任一图形,当前层立刻变换到选取的图形所在层。
44. 用R14打开R12的文件时,即使正确地选择了汉字字形文件,还是会出现汉字乱码,原因是R14与R12采用的代码页不同。可到AutoDesk公司主页下载代码页转换工具wnewcp。运行wnewcp后,首先选中“R11/R12”复选框,再单击“Browse”按钮,选择要转换的文件或目录,然后选择新的代码页,ANSI936或GB2312均可,单击“StartConversion”即开始转换。转换后,在R14中就能正确地显示汉字。
1.选择技巧
在选择编辑中,有时不小心多选了某个图元,此时在命令未结束下并不需要取消命令而重来,只须在"选择目标"的提示后输入remove回车,再在提示下逐一选择哪些多选的图元(当然别太多,否则难选啊!)即可搞定.
在选择时,随便输入两个字母,如mn,这时你会发现command命令行出现一大串提示,包括fence、wc、wf等,很方便的。
2.AutoCAD裁剪技巧
如图所示,要对右图部分圆(可以是其他边框)外的直线进行裁剪,普通办法就是选择裁剪边界后再选择要裁剪的线段即可,实际上AutoCAD还有较为简捷的办法,其做法如下:
1.按常规执行裁剪命令,选择裁剪边界(回车确认);
2.在提示选择要裁剪的线段元素时输入“f”(即fence),回车确认;
3.在提示:First Fence point下绘制与要裁剪线段相交的连续橡皮筋直线,回车确认即可(见图示)。
尚需注意两点:1.橡皮筋直线无需闭合;2.橡皮筋直线与要裁剪线段重复相交时,则剪去以后一次的部分(这点很重要哦)。
3.选择技巧
用户可以用鼠标一个一个地选择目标,选择的目标逐个地添加到选择集中,另外,AutoCAD还提供了Window(以键入“w”响应Select object:或直接在屏幕上自右至左拉一个矩形框响应Select object:提示),Crossing(以键入“C”响应Select object:或直接在屏幕上自左至右拉一个矩形框响应Select object:提示),Cpolygon(以键入“CP”响应Select object:),Wpolygon(以键入“WP”响应Select object:)等多种窗口方式选择目标,其中Window及Crossing用于矩形窗口,而Wpolygon及Cpolygon用于多边形窗口,在Window及Wpolygon方式下,只有当实体的所有部分都被包含在窗口时,实体才被选中,而在Crossing及Cpolygon方式下,只要实体的一部分包括在窗口内,实体就被选择像。AutoCAD还提供了Fence方式(以键入“F”响应Select object:)选择实体,画出一条不闭合的折线,所有和该折线相交的实体即被选择。在选择目标时,有时会不小心选中不该选择的目标,这时用户可以键入R来响应“select objects:”提示,然后把一些误选的目标从选择集中剔除,然后键入A,再向选择集中添加目标。当所选择实体和别的实体紧挨在一起时可在按住CTRL键的同时,然后连续单击鼠标左键,这时紧挨在一起的实体依次高亮度显示,直到所选实体高亮度显示,再按下enter键(或单击鼠标右键),即选择了该实体。还可以有条件选择实体,即用'filter响应select objects:,在AutoCAD2000中,还提供了QuickSelect方式选择实体,功能和filter类似,但操作更简单,方便。AutoCAD提供的选择集的构造方法功能很强,灵活恰当地使用可使制图的效率大大提高。
4.如何在WORD表格中引用ACAD的形位公差?
其实也简单,但就怕部分新手不敢一试!
1.将ACAD的背景设为白色,否则在WORD中不能处理背景色;
2.在ACAD中单独直接标注形位公差图框,尽量放大显示至整个绘图区;
3.使用ACAD的clip(拷贝至粘贴板)命令,选中形位公差图框;
4.切换至WORD的表格中,粘贴即可,但此时整个表格会被挤得很乱,此时可耐点性子,利用WORD自带的图片编辑功能将形位公差图框多余的边剪去,并直接拖放形位公差图框图片至表格范围内的合适大小.为利于操作,可将文档显示放大。
5.如何给ACAD工具条添加命令及相应图标
以cad2004为例
cad的工具条并没有显示所有可用命令,在需要时用户要自己添加。
例如绘图工具条中默认没有多线命令(mline),就要自己添加。
做法如下:
视图->工具栏->命令选项卡,选中绘图右侧窗口显示相应命令
这时找到“多线”,点左键把它脱出,若不放到任何已有工具条中,则它以单独工具条出现;否则成为已有工具条一员。
这时又发现刚拖出的“多线”命令没有图标!!就要为他添加图标。
做法如下:
把命令拖出后,不要关闭自定义窗口,单击“多线”命令,在弹出的面板的右下角,给它选择相应的图标!
这时,我们还可以发现,cad允许我们给每个命令自定义图标。这样作个个性化工具条就变得easy了!!
最后,要删除命令,重复以上操作,把要删除命令拖回,然后在确认要求中选“是”就行了
以下截图按操作顺序:
6 、变量
一。系统变量
1.如果使用AutoCAD时会发现命令中的对话框会变成提示行,如 打印命 令,控制它的是系统变量CMDDIA,关掉它就行了。
2.椭圆命令生成的椭圆是以多义线还是以椭圆为实体是由系统变量 PELLIPSE决定,当其为1时,生成的椭圆是PLINE。
3.DIMSCALE决定了尺寸标注的比例,其值为整数,缺省为1,在图形 有了一定比例缩放时应最好将其改为缩放比例。
二。操作
1.BREAK将实体两点截开,在选取第二点时如用“@”来回答,可由 第一点将实体分。
2.AutoCAD R14的BONUS中有一个ARCTEXT命令,可实现弧形文本输 出,使用方法为先选圆弧,再输入文本内容,按OK。
3.AutoCAD中文件可当作块插入其他文件中,但这样一来过多的块 使文件过于庞大,用PURGE来清除它们吧,一次清一层,一定要多用 几次呀!
7.常用快捷键,可以提高你的绘图速度!
F1: 获取帮助
F2: 实现作图窗和文本窗口的切换
F3: 控制是否实现对象自动捕捉
F4: 数字化仪控制
F5: 等轴测平面切换
F6: 控制状态行上坐标的显示方式
F7: 栅格显示模式控制
F8: 正交模式控制
F9: 栅格捕捉模式控制
F10: 极轴模式控制
F11: 对象追 踪式控制
Ctrl+B: 栅格捕捉模式控制(F9)
Ctrl+C: 将选择的对象复制到剪切板上
Ctrl+F: 控制是否实现对象自动捕捉(f3)
Ctrl+G: 栅格显示模式控制(F7)
Ctrl+J: 重复执行上一步命令
Ctrl+K: 超级链接
Ctrl+N: 新建图形文件
Ctrl+M: 打开选项对话框
Ctrl+1: 打开特性对话框
Ctrl+2: 打开图象资源管理器
Ctrl+6: 打开图象数据原子
Ctrl+ 打开图象文件
Ctrl+P: 打开打印对说框
Ctrl+S: 保存文件
Ctrl+U: 极轴模式控制(F10)
Ctrl+v: 粘贴剪贴板上的内容
Ctrl+W: 对象追 踪式控制(F11)
Ctrl+X: 剪切所选择的内容
Ctrl+Y: 重做
Ctrl+Z: 取消前一步的操作
8.还说一点关于cad图层的知识
图层功能给我们管理工程图带来的极大的方便,利用他们,我们可以方便的绘制图形,修改图形。因此每个新手很有必要掌握图层方面的知识。
下图关于每个图层中线型设置(摘自国家制图标准)希望大家遵守
9.AutoCAD中如何计算二维图形的面积:
AutoCAD中,可以方便、准确地计算二维封闭图形的面积(包括周长),但对于不同类别的图形,其计算方法也不尽相同。
1. 对于简单图形,如矩形、三角形。只须执行命令AREA(可以是命令行输入或点击对应命令图标),在命令提示“Specify first corner point or [Object/Add/Subtract]:”后,打开捕捉依次选取矩形或三角形各交点后回车,AutoCAD将自动计算面积(Area)、周长(Perimeter),并将结果列于命令行。
2. 对于简单图形,如圆或其它多段线(Polyline)、样条线(Spline)组成的二维封闭图形。执行命令AREA,在命令提示“Specify first corner point or [Object/Add/Subtract]:”后,选择Object选项,根据提示选择要计算的图形,AutoCAD将自动计算面积、周长。
3. 对于由简单直线、圆弧组成的复杂封闭图形,不能直接执行AREA命令计算图形面积。必须先使用Boundary命令(其使用方法依照下图对话框选择即刻,它同于剖面线填充的面域创建),以要计算面积的图形创建一个面域(region)或多段线对象,再执行命令AREA,在命令提示“Specify first corner point or [Object/Add/Subtract]:”后,选择Object选项,根据提示选择刚刚建立的面域图形,AutoCAD将自动计算面积、周长。
10.AutoCAD字体替换技巧
AutoCAD文件在交流过程中,往往会因设计者使用和拥有不同的字体(特别是早期版本必须使用的单线字体),而需为其指定替换字体,如下图所示,即是因为笔者的电脑中没有UMHZ.shx字体,而需为其指定笔者电脑中存在的字体hzkt.shx。
这种提示在每次启动AutoCAD后,打开已有文件都会出现。其实,这种字体替换可以在配置中一次指定:
执行config命令,在下图对话框的黑显处(指定替换字体文件)输入字体文件及其完整目录,ok后,下次启动AutoCAD打开已有文件时,字体替换提示将不在出现。
11.如何巧妙使用AutoCAD
1、 十字光标尺寸改变
---- 工程图绘制时,要按投影规律绘图。为了便于“长对正,高平齐,宽相等”,绘图时,可调整十字光标尺寸。即用options命令或选择下拉菜单 Tools(工具)/ Options(系统配置),打开Options 对话框,找到Display(显示)选项卡,通过修改Crosshair Size(十字光标大小)区中的光标与屏幕大小的百分比或拖动滑块,可改变缺省值5%,使绘图窗口十字光标尺寸变大。
2、 画粗实线
---- 技术制图国家标准对机械图样中的线型有规定。用AutoCAD 2000画粗实线有多种办法,最简便的办法是使用lweight命令。此命令可在命令行直接键入,或选择下拉菜单Format(格式)/Lineweight(线宽),在出现的对话框中,设置所需线宽,缺省线宽为0.25mm,并可用滑块调整屏幕上线宽显示比例,该命令为透明命令。也可单击对象属性工具栏工具图标layers,在图层特性管理对话框中如同设置颜色、线型一样来设置线宽。因此在绘图仪出图时,不用再调整笔宽或线宽。
3、 画曲线
---- 在绘制图样时,经常遇到画截交线、相贯线及其他曲线的问题。手工绘制很麻烦,要找特殊点和一定数量一般点,且连出的曲线误差大。用AutoCAD 2000绘制平面曲线或空间曲线却很容易。
B. Microsoft VBScript 编译器错误 错误 '800a0400' 缺少语句
ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件
(0x80040E21)-->sql语句出错(数据类型不匹配或表名(字段名)错误或表处于编辑状态,或表不存在于conn打开的数据库中)
(0x80040E14)-->sql语句出错(字段名错误,或数据类型不匹配)
(0x80040E07)-->sql语句出错(要插入或更新的字段的类型与变量数据类型不匹配)
(0x80040E57)-->sql语句出错(要插入或更新的数据溢出)
(0x80040E10)-->sql语句出错(update字段名或要更新的数据类型错误)
(0x80004005)-->sql语句出错(要插入或更新的字段的数值不能为空值)
(0x80004005) -->打开数据库出错,没有在指定目录发现数据库
(0x80040E37)-->没有发现表
MicrosoftVBscript运行时错误(0x800A000D)-->错误引用rs变量(rs对像已关闭或未定义)
MicrosoftVBscript运行时错误(0x800A01C2)-->vbscript脚本错误(vbscript语句出错)
MicrosoftVBscript运行时错误(0x800A0006)-->vbscript脚本错误(溢出错误)
MicrosoftVBscript编译器错误(0x800A040E)-->缺少loop
MicrosoftVBscript编译器错误(0x800A03EA)-->缺少if或endif
MicrosoftVBscript编译器错误(0x800A03EE)--> 语句未结束(缺少")")
MicrosoftVBscript编译器错误(0x800A03F6)-->if语句出错(缺少endif)
MicrosoftVBscript运行时错误(0x800A005B)-->缺少set
MicrosoftVBscript运行时错误(0x800A0005)-->变量未定义
MicrosoftVBscript编译器错误(0x800A03F9)-->if语句缺少then
MicrosoftVBscript编译器错误(0x800A0411)-->dim语句定义错误
MicrosoftVBscript编译器错误(0x800A0408)-->sql语句错误(?????????????????)
Microsoft VBScript 运行时错误 (0x800A01B6)错误原因:set rs=server.create......你少了 set
ADODB.Recordset(0x800A0BB9)-->sql语句出错(sql语句或conn语句未定义或对一个rs属性进行赋值时发生错误)
ADODB.Recordset(0x800A0CC1)-->rs对像出错(rs对像本身不存在或错误地引用了一个不存在的字段名)
ADODB.Recordset(0x800A0BCD)-->rs对像出错(记录集中没有记录却对记录集进行操作)
ADODB.Recordset(0x800A0E78)-->rs对像出错(记录集不存在,缺少rs.open语句)
ADODB.Recordset(0x800A0CC1) -->rs对像出错(引用了一个不存在的字段名)
ADODB.Recordset(0x800A0E7D)-->conn定义错误
ADODB.Recordset(0x800A0CB3)-->数据库以只读方式打开,无法更新数据
如果 VBScript 语句结构违反了一个或多个 VBScript 脚本语言语法规则,就会产生 VBScript 语法错误。
错误通常在执行程序前,编译程序时产生。 以下是53个语法错误:
错误编号 描述
十进制 十六进制 说明
1001 800A03E9 内存不足
1002 800A03EA 语法错误
1003 800A03EB 缺少“:”
1005 800A03ED 需要 '('
1006 800A03EE 需要 ')'
1007 800A03EF 缺少“]”
1010 800A03F2 需要标识符
1011 800A03F3 需要 '='
1012 800A03F4 需要 'If'
1013 800A03F5 需要 'To'
1014 800A03F6 需要 'End'
1015 800A03F7 需要 'Function'
1016 800A03F8 需要 'Sub'
1017 800A03F9 需要 'Then'
1018 800A03FA 需要 'Wend'
1019 800A03FB 需要 'Loop'
1020 800A03FC 需要 'Next'
1021 800A03FD 需要 'Case'
1022 800A03FE 需要 'Select'
1023 800A03FF 需要表达式
1024 800A0400 需要语句
1025 800A0401 需要语句的结束
1026 800A0402 需要整数常数
1027 800A0403 需要 'While' 或 'Until'
1028 800A0404 需要 'While,'、 'Until,' 或语句未结束
1029 800A0405 需要 'With'
1030 800A0406 标识符太长
1031 800A0407 无效的数
1032 800A0408 无效的字符
1033 800A0409 未结束的串常量
1034 800A040A 未结束的注释
1037 800A040D 无效使用关键字 'Me'
1038 800A040E 'loop' 没有 'do'
1039 800A040F 无效 'exit' 语句
1040 800A0410 无效 'for' 循环控制变量
1041 800A0411 名称重定义
1042 800A0412 必须为行的第一个语句
1043 800A0413 不能赋给非Byval参数
1044 800A0414 调用 Sub 时不能使用圆括号
1045 800A0415 需要文字常数
1046 800A0416 需要 'In'
1047 800A0417 需要 'Class'
1048 800A0418 必须在一个类的内部定义
1049 800A0419 在属性声明中需要 Let , Set 或 Get
1050 800A041A 需要 'Property'
1051 800A041B 参数数目必须与属性说明一致
1052 800A041C 在类中不能有多个缺省的属性/方法
1053 800A041D 类初始化或终止不能带参数
1054 800A041E Property Let 或 Set 至少应该有一个参数
1055 800A041F 不需要的 'Next'
1056 800A0420 只能在 ‘Property’ 或 ’Function’ 或 ’Sub’ 上指定 ’Default’
1057 800A0421 说明 'Default' 必须同时说明 'Public' "
1058 800A0422 只能在 Property Get 中指定 'Default'
VBScript 运行时错误
如果 VBScript 脚本执行系统无法实施的操作,则会产生 VBScript 运行时错误。只有在运行脚本、为变量表达式赋值或
分配内存时,才会产生 VBScript 运行时错误。 以下是65个运行时错误:
错误编号 描述
十进制 十六进制 说明
5 800A0005 无效过程调用或参数
6 800A0006 溢出
7 800A0007 内存不足
9 800A0009 下标越界
10 800A000A 该数组为定长的或临时被锁定
11 800A000B 被零除
13 800A000D 类型不匹配
14 800A000E 字符串空间溢出
17 800A0011 无法执行请求的操作
28 800A001C 堆栈溢出
35 800A0023 未定义 Sub 或 Function
48 800A0030 加载 DLL 错误
51 800A0033 内部错误
52 800A0034 坏文件名或数
53 800A0035 文件未找到
54 800A0036 坏文件模式
55 800A0037 文件已经打开
57 800A0039 设备I/O错误
58 800A003A 文件已经存在
61 800A003D 磁盘空间已满
62 800A003E 输入超出文件尾
67 800A0043 文件太多
68 800A0044 设备不可用
70 800A0046 权限禁用
71 800A0047 磁盘未准备好
74 800A004A 不能用不同的驱动器重新命名
75 800A004B 路径/文件访问错误
76 800A004C 路径未找到
91 800A005B 未设置对象变量
92 800A005C For 循环未初始化
94 800A005E 非法使用 Null
322 800A0142 不能建立所需临时文件
424 800A01A8 需要对象
429 800A01AD ActiveX 部件无法创建对象
430 800A01AE 类不支持自动化
432 800A01B0 在自动化操作中未找到文件名或类名
438 800A01B6 对象不支持该属性或方法
440 800A01B8 Automation错误
445 800A01BD 对象不支持此操作
446 800A01BE 对象不支持指定的参数
447 800A01BF 对象不支持当前的区域设置
448 800A01C0 未找到命名参数
449 800A01C1 参数不可选
450 800A01C2 错误的参数个数或无效的参数属性值
451 800A01C3 对象不是一个集合
453 800A01C5 指定的dll函数未找到
455 800A01C7 代码源锁错误
457 800A01C9 这个键已经是本集合的一个元素关联
458 800A01CA 变量使用了一个 VBScript 中不支持的自动化(Automation)类型
462 800A01CE 远程服务器不存在或不能访问
481 800A01E1 无效图片
500 800A01F4 变量未定义
501 800A01F5 违法的分配
502 800A01F6 脚本对象不安全
503 800A01F7 对象不能安全初始化
504 800A01F8 对象不能安全创建
505 800A01F9 无效的或不合格的引用
506 800A01FA 类未被定义
507 800A01FB 发生异常
5016 800A1398 需要正则表达式对象
5017 800A1399 正则表达式中的语法错误
5018 800A139A 错误的数量词
5019 800A139B 在正则表达式中需要 ']'
5020 800A139C 在正则表达式中需要 ')'
5021 800A139D 字符集越界
32811 800A802B 元素未找到
C. MATLAB R2011a 如何安装编译器,如何生成exe文件
Matlab编译器是独立于matlab主程序的一个模块,名字叫做Matlab Compliler,你需要找到这个模块,安装完毕,才可以使用mcc -m xxx.m 编译出可执行的exe文件
希望能对你有帮助
D. 类Pcode是什么
pascal编译时的中间语言,如果楼主是指这个的话
简单来说:
PCode是一个基于可视过程,产生Web页面XML描述文件的一个开发工具。
全面来说:
PCode是一个开发框架和实现该框架的工具,在设计时,它通过一个直观的、基于描述的设计界面产生页面外观,通过一个良好的代码编辑环境书写代码,从而产生纯客户端的XML描述代码;在运行时,它利用一套基于HTC的封装GUI组件和自有的XML语法规则,通过一个运行时HTC,解释设计过程中产生的对页面的描述,从而生成可视的界面和交互行为;用户操作页面时,用户请求被转化成XML格式的请求POST到服务器端,服务器端处理完成后也仅仅返回XML格式的结果并由客户端解释,并反应给用户。
E. HI-TECH PICC lite V9.60PL0是什么东西
Microchip公司系列MCU c语言编译器。
F. MTK的开发环境怎么搭建
一、开发环境设立
以下表述中提到的相关压缩包或安装文件到华禹ftp服务器下载,部分文件要到群共享里面下,那里是最新的。
华禹ftp服务器:IP:220.113.15.15,帐号为study-bbs.com,密码为study-bbs0304
P1300的QQ群号: 15762255
P1300_Build_Guide.rar来自ftp服务器,“华禹\MTK相关部分”目录下
手机开发板C语言开发视频.rar来自ftp服务器,“华禹\MTK相关部分”目录下
huayu109_ads1.2.rar来自ftp服务器,“华禹\旋风001手机模块\1.工具类”目录下
huayu102_ADS12_Patch_Windows.rar同上
huayu106_perlzip.rar同上
huayu108_SourceInsight3.5.rar同上
huayu101_p1300软件使用工具及开发指南.rar同上
huayu201_P1300_V1.7_Release.rar文件来自群共享
huayu203_P1300_V1.7_Release_patch.rar文件来自群共享
FlashTool_v3.0844.00.rar文件来自群共享
1、开发主机要求及所需工具:
操作系统:Windows 2000, WinXP. 推荐Windows 2000 with SP2 or later.
编 译 器:ADS (Arm Developer Suite) v1.2 [Build 842]
Perl解析:ActivePerl, 推荐使用ActivePerl 5.6.1版本
仿真工具:MTK PC Simulator
跟踪工具:Catcher_L1 v3.10.01,从串口输出调试信息,只做普通UI应用的话,大致不会用到,用PC仿真工具就好了
烧录工具:FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00
其他:PL2303_Driver_XP2K v20,这是下载线用到的USB串口驱动,以前机器上装过PL2303驱动的就不必再装了
二、开发环境建立过程:
新建一个目录,英文的好了,否则有些工具不认识中文路径,这里以E:\MTK_P1300为例说明,下面我用文字和图片简单说明下安装过程,更详细的安装过程可以看压缩文件“手机开发板C语言开发视频.rar”中的Flash文件“P1300_Build_Env.swf”。
(1)安装ADS1.2
解压文件huayu109_ads1.2.rar到某个目录,比如说解压到“E:\MTK_P1300”,解压完后运行“E:\MTK_P1300\ADS1.2\Setup.exe”,一路按下一步,最后安装License时选定文件“E:\MTK_P1300\ADS1.2\CRACK\ license.dat”,然后接着一路下一步直到安装完。安装完后删掉目录“E:\MTK_P1300\ADS1.2\”,节省磁盘空间。
(2)安装ADS补丁
运行huayu102_ADS12_Patch_Windows.rar压缩文件中的ADS_Patch_Window.exe,这是个自解压的压缩文件,选Unzip解压到上一步ADS的安装目录(缺省是C:\Program Files\ARM\ADSv1_2),解压过程中如果问到是否覆盖,全部选覆盖好了。
(3)安装脚本解释器Perl
直接运行压缩包huayu106_perlzip.rar里面扩展名为msi的安装文件,缺省安装就好,一路Next,呵呵。
上述几步完成后,编译环境基本建立,此时可以开一个dos窗(开始菜单->运行->输入cmd->确定)看一下,安装正常应该能顺利执行以下命令,如下图:
注意看版本号,应该是ADS1.2 [Build 842],不是的话可能没打补丁,或补丁打的位置不对,请看第2步ADS补丁部分的说明并重新打一次,直到版本号对为止,哈哈。
这是perl解释器的运行画面。
注1:上述安装过程会自动创建编译环境所需的环境变量,如果发现编译不正常了,可能是安装了其他编译工具导致冲突,这时建议查看下系统环境变量,把Perl和ADS的安装目录调到最前面,同时从path中去掉可能会产生冲突的编译工具链的路径(例如winavr),如下图所示(我是安装到D盘滴,缺省是C盘,不过我C盘几乎被我塞满了):
如果嫌改path麻烦(因为要用到其他编译工具链的时候还得改回去),还有一种办法,就是改make.bat批处理,具体见注4中相关说明。
注2: 如果安装ADS时,改变了默认安装路径,需要修改源码中的设置,源码目录树解压过程见模拟器编译环节相关介绍。
1. make\Option.mak
2. ----------------------------------
3. ifeq ($(strip $(COMPILER)),ADS)
4. DIR_ARM= c:\progra~1\arm\adsv1_2 # 修改这里
5. DIR_ARM := $(strip $(DIR_ARM))
6. DIR_TOOL = $(DIR_ARM)\bin
7. DIR_ARMLIB = $(DIR_ARM)\lib
8. DIR_ARMINC = $(DIR_ARM)\include
9. endif
10. ------------------------------------------------
比如改装到D盘了,这里把红色部分“c”改成“d”就好了
(4)代码编辑环境
运行压缩文件huayu108_Source Insight3.5.rar中的安装文件安装即可。至于编辑器,这个看个人喜好了,不过Source Inside看代码蛮方便的。
(5)PC机模拟器
模拟器MTK PC Simulator是用来在PC上仿真调试用的,要安装VC6 SP6(同时要安装Uuicode 静态和动态库,没有装Unicode库的可以用“huayu103_MTK模拟器DLL补丁.zip”中的库,拷到系统目录“%windir%\system32”下即可)。我机器上的VC是有装Unicode库的,没装过Unicode库的如果在模拟器编译或运行中出现问题,建议重装下VC6,安装时勾选Unicode库,并打上相关补丁到SP6。
模拟器能模拟真机的大部分行为,这样能给调试带来很大便利,不需要每次改动都要烧录。
模拟器要从源码编译,解压压缩包“huayu201_P1300_V1.7_Release.rar”里面的文件“HUAYU_P1300_V1.7_Release.rar”到目录“E:\MTK_P1300”,此时会出现目录“E:\MTK_P1300\P1300_V1.7_Release”,这就是P1300的代码目录树了;接着打上最新的补丁,解压压缩包“huayu203_P1300_V1.7_Release_patch.rar”里面的压缩文件“HUAYU_P1300_V1.7_Release_patch.rar”到目录
“E:\MTK_P1300\P1300_V1.7_Release”,解压时选择全覆盖以替换被修改过的文件,打补丁之前对目录树里面的文件进行修改过的,需要手动再加上去。
编译PC仿真器之前需要先把刚才上面得到的目录树build一次,开一个dos窗,盘符和目录转到代码目录树对应的盘符和目录,例如:
1. E:
2. cd E:\MTK_P1300\P1300_V1.7_Release\
3. make new
注3:第一次make的时候要用“make new”,make new的时间比较长(慢的机器搞不好要2小时以上),编译过程中间会出现一些文件找不到的信息,只要编译过程没意外终止,那些信息可以忽略。编译日志文件位置: build\NEOTEL25_06B\log\,要查看编译过程有啥问题就看这个目录下的文件了;生成的bin文件位置: build\NEOTEL25_06B\*.bin,下载烧录就是烧bin文件。
这里顺带介绍下build的命令格式:
make new 清除后重新编译整个项目
make resgen 重新生成资源
make remake重新编译链接项目
make viewlog xxx 查看模块xxx的编译日志
make查看可以用make选项帮助信息
注4:如果机器上装了其他gcc编译工具链(比如winavr之类)的话可能要手动改下Path,否则编译会出错,修改Path的方法见注1,也可以修改批处理文件“E:\MTK_P1300\P1300_V1.7_Release\make.bat”,在“perl make2.pl %*”之前加上下面两句:
1. set PERL5LIB=D:\perl\lib
2. set PATH=D:\perl\bin;d:\progra~1\arm\adsv1_2\bin;E:\MTK_P1300\P1300_V1.7_Release\tools;c:\windows\system32;c:\windows;c:\windows\system
注意,上面的路径是我机器上的,不是缺省安装路径,要根据自己的实际安装路径做修改。
下面开始编译PC仿真器了,用VC6打开工程文件“E:\MTK_P1300\P1300_V1.7_Release\plutommi\mmi\ PC_Simulator.dsw”,然后开始编译,编译时间比较长,具体看机器配置了,这时又可以干点别的啥了,呵呵。
因为仿真器工程涉及文件较多,编译费时,建议编译过程中电脑上少开窗口,特别是网络类的,如QQ,有时会发现开QQ后,编译过程中VC会挂死,呵呵。有可能是开QQ后防火墙过滤网络数据占用较多系统资源,如果发现VC编译特别慢或干脆挂死,可以重启动一下电脑,只开必要的窗口,然后开始编译。
如果编译过程中发现怪异的问题,如:
1. incomingstringiddef.h(120) : error C2059: syntax error : 'constant'
2. 或者
3. error C2065: 'STR_CM_REDIAL' : undeclared identifier
4. 之类
5.
这个时侯你可能需要看一下你VC相关路径的设置顺序,如下图:
把VC原本的头文件路径调整到最前面,我刚开始编译的时候SDK的头文件在前面,编译总是通不过,改一下就好了,库也一样都调整下比较保险,呵呵。
(6)Tracer跟踪工具
解压文件P1300_Build_Guide.rar到E:\MTK_P1300,然后在文件管理器进入目录“E:\MTK_P1300\P1300_Build_Guide”,接着解压Catcher_L1_v3.10.01.zip到当前目录下的Catcher_L1_v3.10.01子目录,进入子目录Catcher_L1_v3.10.01,发送一个Catcher.exe的快捷方式到桌面。
在需要用到TRACE的时候,在代码中使用函数
void kal_prompt_trace(mole_type mod_id, const kal_char *fmt,...); 打印需要查看的信息,使用Catcher跟踪查看。
这个有点类似linux的Kernel Debug工具,具体使用方法见文档《cather使用手册.doc》,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南.rar”里面找到。
(7)烧录工具
解压文件“E:\MTK_P1300\P1300_Build_Guide\ FlashTool_UI_exe_v3.1.05.zip”到当前目录,然后进入目录“E:\MTK_P1300\P1300_Build_Guide\FlashTool_v3.1.05”,发送一个Flash_tool.exe的快捷方式到桌面好了。
还有个下载工具FlashTool_v3.0844.00.rar,也是不用安装,解压后直接用的,据说烧录速度比上面那个快。
具体使用方法见文档《flash_tool_MT平台使用教程.doc》,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南.rar”里面找到。
(8)USB串口下载线驱动
运行压缩文件
1. “E:\MTK_P1300\P1300_Build_Guide\ PL2303_Driver_XP2K_v20.zip”
里面的可执行文件进行安装,一路下一步,这里不再赘述。
nucleus实时操作系统MTK手机软件系统工程和配置简介
MTK使用了nucleus实时操作系统,在其上做了个内核抽象层的封装,以适应多种实时操作系统,如oscar、ThreadX、nucleus。整个软件系统包括nucleus操作系统、平台设备驱动、协议栈、文件系统、WGUI、MMI、J2ME等。在这里MMI部分几乎包括了操作系统内核、协议栈、文件系统之上的所有部分,其中WGUI也在其中。
MTK的PC模拟版使用VC的编译器和链接器生成,ARM版使用ADS1.2的编译器和链接器生成。因为MTK的整个软件系统是一个很庞大而且复杂的工程,并且要支持多个MTK的产品系列和多家客户的客户化支持,使用集成开发环境(IDE)已经无法胜任,而且很难做到整个工程的自动构建和资源、代码的生成。所以MTK的软件系统使用了windows下的GNU开发工具链(MinGW)来进行工程的管理、配置和构建,MTK将MinGW放到了第三方工具中。
另外还使用了perl脚本来解析用户输入的命令行参数,因此第三方工具中还包含了ActivePerl(windows下的perl解释器)。不过,整个软件系统并没有使用MinGW的全部工具,好象只使用了make这个工具,由几个Makefile控制了构建的过程,在编译和链接时根据最终生成PC模拟版还是ARM版而分别调用VC的编译器和链接器或ADS1.2的编译器和链接器。
G. 求一个c语言编写的pl0编译器
// pl0 compiler source code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "set.h"
#include "pl0.h"
//////////////////////////////////////////////////////////////////////
// print error message.
void error(n)
{
int i;
printf(" ");
for (i = 1; i <= cc - 1; i++)
printf(" ");
fprintf(outfile, " ");
fprintf(outfile, "^\n");
printf("^\n");
fprintf(outfile, "Error %3d: %s\n", n, err_msg[n]);
printf("Error %3d: %s\n", n, err_msg[n]);
err++;
} // error
//////////////////////////////////////////////////////////////////////
void getch(void)
{
if (cc == ll)
{
if (feof(infile))
{
printf("\nPROGRAM INCOMPLETE\n");
exit(1);
}
ll = cc = 0;
fprintf(outfile, "%5d ", cx);
printf("%5d ", cx);
while ( (!feof(infile)) // added & modified by alex 01-02-09
&& ((ch = getc(infile)) != '\n'))
{
fprintf(outfile, "%c", ch);
printf("%c", ch);
line[++ll] = ch;
} // while
fprintf(outfile, "\n");
printf("\n");
line[++ll] = ' ';
}
ch = line[++cc];
} // getch
//////////////////////////////////////////////////////////////////////
// gets a symbol from input stream.
void getsym(void)
{
int i, k;
char a[MAXIDLEN + 1];
while (ch == ' '|| ch == '\t')
// modified by yzhang 02-03-12,add some white space
getch();
if (isalpha(ch))
{ // symbol is a reserved word or an identifier.
k = 0;
do
{
if (k < MAXIDLEN)
a[k++] = ch;
getch();
}
while (isalpha(ch) || isdigit(ch));
a[k] = 0;
strcpy(id, a);
word[0] = id;
i = NRW;
while (strcmp(id, word[i--]));
if (++i)
sym = wsym[i]; // symbol is a reserved word
else
sym = SYM_IDENTIFIER; // symbol is an identifier
}
else if (isdigit(ch))
{ // symbol is a number.
k = num = 0;
sym = SYM_NUMBER;
do
{
num = num * 10 + ch - '0';
k++;
getch();
}
while (isdigit(ch));
if (k > MAXNUMLEN)
error(25); // The number is too great.
}
else if (ch == ':')
{
getch();
if (ch == '=')
{
sym = SYM_BECOMES; // :=
getch();
}
else
{
sym = SYM_NULL; // illegal?
}
}
else if (ch == '>')
{
getch();
if (ch == '=')
{
sym = SYM_GEQ; // >=
getch();
}
else
{
sym = SYM_GTR; // >
}
}
else if (ch == '<')
{
getch();
if (ch == '=')
{
sym = SYM_LEQ; // <=
getch();
}
else if (ch == '>')
{
sym = SYM_NEQ; // <>
getch();
}
else
{
sym = SYM_LES; // <
}
}
else
{ // other tokens
i = NSYM;
csym[0] = ch;
while (csym[i--] != ch);
if (++i)
{
sym = ssym[i];
getch();
}
else
{
printf("Fatal Error: Unknown character.\n");
fprintf(outfile, "Fatal Error: Unknown character.\n");
exit(1);
}
}
} // getsym
//////////////////////////////////////////////////////////////////////
// generates (assembles) an instruction.
void gen(int x, int y, int z)
{
if (cx > CXMAX)
{
fprintf(outfile, "Fatal Error: Program too long.\n");
printf("Fatal Error: Program too long.\n");
exit(1);
}
code[cx].f = x;
code[cx].l = y;
code[cx++].a = z;
} // gen
//////////////////////////////////////////////////////////////////////
// tests if error occurs and skips all symbols that do not belongs to s1 or s2.
void test(symset s1, symset s2, int n)
{
symset s;
if (! inset(sym, s1))
{
showset(s1);
showset(s2);
printf("sym=%d, id=%s\n", sym, id);
error(n);
s = uniteset(s1, s2);
while(! inset(sym, s))
getsym();
destroyset(s);
}
} // test
//////////////////////////////////////////////////////////////////////
int dx; // data allocation index
// enter object(constant, variable or procedre) into table.
void enter(int kind)
{
mask* mk;
// added by yzhang 02-02-28
if ( position(id)> 0 ){
error(26); //Redeclared identifier.
}
// end
tx++;
strcpy(table[tx].name, id);
table[tx].kind = kind;
switch (kind)
{
case ID_CONSTANT:
if (num > MAXADDRESS)
{
error(25); // The number is too great.
num = 0;
}
table[tx].value = num;
break;
case ID_VARIABLE:
mk = (mask*) &table[tx];
mk->level = level;
mk->address = dx++;
break;
case ID_PROCEDURE:
mk = (mask*) &table[tx];
mk->level = level;
break;
} // switch
} // enter
//////////////////////////////////////////////////////////////////////
// locates identifier in symbol table.
int position(char* id)
{
int i;
strcpy(table[0].name, id);
i = tx + 1;
while (strcmp(table[--i].name, id) != 0);
return i;
} // position
//////////////////////////////////////////////////////////////////////
void constdeclaration()
{
if (sym == SYM_IDENTIFIER)
{
getsym();
if (sym == SYM_EQU || sym == SYM_BECOMES)
{
if (sym == SYM_BECOMES)
error(1); // Found ':=' when expecting '='.
getsym();
if (sym == SYM_NUMBER)
{
enter(ID_CONSTANT);
getsym();
}
else
{
error(2); // There must be a number to follow '='.
}
}
else
{
error(3); // There must be an '=' to follow the identifier.
}
}
else //added by yzhang 02-02-28
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
} // constdeclaration
//////////////////////////////////////////////////////////////////////
void vardeclaration(void)
{
if (sym == SYM_IDENTIFIER)
{
enter(ID_VARIABLE);
getsym();
}
else
{
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
}
} // vardeclaration
//////////////////////////////////////////////////////////////////////
void listcode(int from, int to)
{
int i;
printf("\n");
fprintf(outfile, "\n");
for (i = from; i < to; i++)
{
printf("%5d %s\t%d\t%d\n", i, mnemonic[code[i].f], code[i].l, code[i].a);
fprintf(outfile, "%5d %s\t%d\t%d\n", i, mnemonic[code[i].f], code[i].l, code[i].a);
}
printf("\n");
fprintf(outfile, "\n");
} // listcode
//////////////////////////////////////////////////////////////////////
void factor(symset fsys)
{
void expression();
int i;
symset set;
test(facbegsys, fsys, 24); // The symbol can not be as the beginning of an expression.
while (inset(sym, facbegsys))
{
if (sym == SYM_IDENTIFIER)
{
if ((i = position(id)) == 0)
{
error(11); // Undeclared identifier.
}
else
{
switch (table[i].kind)
{
mask* mk;
case ID_CONSTANT:
gen(LIT, 0, table[i].value);
break;
case ID_VARIABLE:
mk = (mask*) &table[i];
gen(LOD, level - mk->level, mk->address);
break;
case ID_PROCEDURE:
error(21); // Procere identifier can not be in an expression.
break;
} // switch
}
getsym();
}
else if (sym == SYM_NUMBER)
{
if (num > MAXADDRESS)
{
error(25); // The number is too great.
num = 0;
}
gen(LIT, 0, num);
getsym();
}
else if (sym == SYM_LPAREN)
{
getsym();
set = uniteset(createset(SYM_RPAREN, SYM_NULL), fsys);
expression(set);
destroyset(set);
if (sym == SYM_RPAREN)
{
getsym();
}
else
{
error(22); // Missing ')'.
}
}
else // added by yzhang 02-02-28
test(fsys, createset(SYM_LPAREN, SYM_NULL), 23);
} // while
} // factor
//////////////////////////////////////////////////////////////////////
void term(symset fsys)
{
int mulop;
symset set;
set = uniteset(fsys, createset(SYM_TIMES, SYM_SLASH, SYM_NULL));
factor(set);
while (sym == SYM_TIMES || sym == SYM_SLASH)
{
mulop = sym;
getsym();
factor(set);
if (mulop == SYM_TIMES)
{
gen(OPR, 0, OPR_MUL);
}
else
{
gen(OPR, 0, OPR_DIV);
}
} // while
destroyset(set);
} // term
//////////////////////////////////////////////////////////////////////
void expression(symset fsys)
{
int addop;
symset set;
set = uniteset(fsys, createset(SYM_PLUS, SYM_MINUS, SYM_NULL));
if (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
term(set);
if (addop == SYM_MINUS)
{
gen(OPR, 0, OPR_NEG);
}
}
else
{
term(set);
}
while (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
term(set);
if (addop == SYM_PLUS)
{
gen(OPR, 0, OPR_ADD);
}
else
{
gen(OPR, 0, OPR_MIN);
}
} // while
destroyset(set);
} // expression
//////////////////////////////////////////////////////////////////////
void condition(symset fsys)
{
int relop;
symset set;
if (sym == SYM_ODD)
{
getsym();
expression(fsys);
gen(OPR, 0, 6);
}
else
{
set = uniteset(relset, fsys);
expression(set);
destroyset(set);
if (! inset(sym, relset))
{
error(20);
}
else
{
relop = sym;
getsym();
expression(fsys);
switch (relop)
{
case SYM_EQU:
gen(OPR, 0, OPR_EQU);
break;
case SYM_NEQ:
gen(OPR, 0, OPR_NEQ);
break;
case SYM_LES:
gen(OPR, 0, OPR_LES);
break;
case SYM_GEQ:
gen(OPR, 0, OPR_GEQ);
break;
case SYM_GTR:
gen(OPR, 0, OPR_GTR);
break;
case SYM_LEQ:
gen(OPR, 0, OPR_LEQ);
break;
} // switch
} // else
} // else
} // condition
//////////////////////////////////////////////////////////////////////
void statement(symset fsys)
{
int i, cx1, cx2;
symset set1, set;
if (sym == SYM_IDENTIFIER)
{ // variable assignment
mask* mk;
if (! (i = position(id)))
{
error(11); // Undeclared identifier.
}
else if (table[i].kind != ID_VARIABLE)
{
error(12); // Illegal assignment.
i = 0;
}
getsym();
if (sym == SYM_BECOMES)
{
getsym();
}
else
{
error(13); // ':=' expected.
}
expression(fsys);
mk = (mask*) &table[i];
if (i)
{
gen(STO, level - mk->level, mk->address);
}
}
else if (sym == SYM_CALL)
{ // procere call
getsym();
if (sym != SYM_IDENTIFIER)
{
error(14); // There must be an identifier to follow the 'call'.
}
else
{
if (! (i = position(id)))
{
error(11); // Undeclared identifier.
}
else if (table[i].kind == ID_PROCEDURE)
{
mask* mk;
mk = (mask*) &table[i];
gen(CAL, level - mk->level, mk->address);
}
else
{
error(15); // A constant or variable can not be called.
}
getsym();
} // else
}
else if (sym == SYM_IF)
{ // if statement
getsym();
set1 = createset(SYM_THEN, SYM_DO, SYM_NULL);
set = uniteset(set1, fsys);
condition(set);
destroyset(set1);
destroyset(set);
if (sym == SYM_THEN)
{
getsym();
}
else
{
error(16); // 'then' expected.
}
cx1 = cx;
gen(JPC, 0, 0);
statement(fsys);
code[cx1].a = cx;
}
else if (sym == SYM_BEGIN)
{ // block
getsym();
set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
set = uniteset(set1, fsys);
statement(set);
while (sym == SYM_SEMICOLON || inset(sym, statbegsys))
{
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(10);
}
statement(set);
} // while
destroyset(set1);
destroyset(set);
if (sym == SYM_END)
{
getsym();
}
else
{
error(17); // ';' or 'end' expected.
}
}
else if (sym == SYM_WHILE)
{ // while statement
cx1 = cx;
getsym();
set1 = createset(SYM_DO, SYM_NULL);
set = uniteset(set1, fsys);
condition(set);
destroyset(set1);
destroyset(set);
cx2 = cx;
gen(JPC, 0, 0);
if (sym == SYM_DO)
{
getsym();
}
else
{
error(18); // 'do' expected.
}
statement(fsys);
gen(JMP, 0, cx1);
code[cx2].a = cx;
}
else //added by yzhang 02-02-28
test(fsys, phi, 19);
} // statement
//////////////////////////////////////////////////////////////////////
void block(symset fsys)
{
int cx0; // initial code index
mask* mk;
int block_dx;
int savedTx;
symset set1, set;
dx = 3;
block_dx = dx;
mk = (mask*) &table[tx];
mk->address = cx;
gen(JMP, 0, 0);
if (level > MAXLEVEL)
{
error(32); // There are too many levels.
}
do
{
if (sym == SYM_CONST)
{ // constant declarations
getsym();
do
{
constdeclaration();
while (sym == SYM_COMMA)
{
getsym();
constdeclaration();
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
}
while (sym == SYM_IDENTIFIER);
} // if
if (sym == SYM_VAR)
{ // variable declarations
getsym();
do
{
vardeclaration();
while (sym == SYM_COMMA)
{
getsym();
vardeclaration();
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
}
while (sym == SYM_IDENTIFIER);
block_dx = dx; // modified by yzhang 02-03-15
} // if
while (sym == SYM_PROCEDURE)
{ // procere declarations
getsym();
if (sym == SYM_IDENTIFIER)
{
enter(ID_PROCEDURE);
getsym();
}
else
{
error(4); // There must be an identifier to follow 'const', 'var', or 'procere'.
}
if (sym == SYM_SEMICOLON)
{
getsym();
}
else
{
error(5); // Missing ',' or ';'.
}
level++;
savedTx = tx;
set1 = createset(SYM_SEMICOLON, SYM_NULL);
set = uniteset(set1, fsys);
block(set);
destroyset(set1);
destroyset(set);
tx = savedTx;
level--;
if (sym == SYM_SEMICOLON)
{
getsym();
set1 = createset(SYM_IDENTIFIER, SYM_PROCEDURE, SYM_NULL);
set = uniteset(statbegsys, set1);
test(set, fsys, 6);
destroyset(set1);
destroyset(set);
}
else
{
error(5); // Missing ',' or ';'.
}
} // while
set1 = createset(SYM_IDENTIFIER, SYM_NULL);
set = uniteset(statbegsys, set1);
test(set, declbegsys, 7);
destroyset(set1);
destroyset(set);
}
while (inset(sym, declbegsys));
code[mk->address].a = cx;
mk->address = cx;
cx0 = cx;
gen(INT, 0, block_dx);
set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
set = uniteset(set1, fsys);
statement(set);
destroyset(set1);
destroyset(set);
gen(OPR, 0, OPR_RET); // return
test(fsys, phi, 8); // test for error: Follow the statement is an incorrect symbol.
listcode(cx0, cx);
} // block
//////////////////////////////////////////////////////////////////////
int base(int stack[], int currentLevel, int levelDiff)
{
int b = currentLevel;
while (levelDiff--)
b = stack[b];
return b;
} // base
//////////////////////////////////////////////////////////////////////
// interprets and executes codes.
void interpret()
{
int pc; // program counter
int stack[STACKSIZE];
int top; // top of stack
int b; // program, base, and top-stack register
instruction i; // instruction register
printf("Begin executing PL/0 program.\n");
fprintf(outfile, "Begin executing PL/0 program.\n");
pc = 0;
b = 1;
top = 3;
stack[1] = stack[2] = stack[3] = 0;
do
{
i = code[pc++];
switch (i.f)
{
case LIT:
stack[++top] = i.a;
break;
case OPR:
switch (i.a) // operator
{
case OPR_RET:
top = b - 1;
pc = stack[top + 3];
b = stack[top + 2];
break;
case OPR_NEG:
stack[top] = -stack[top];
break;
case OPR_ADD:
top--;
stack[top] += stack[top + 1];
break;
case OPR_MIN:
top--;
stack[top] -= stack[top + 1];
break;
case OPR_MUL:
top--;
stack[top] *= stack[top + 1];
break;
case OPR_DIV:
top--;
if (stack[top + 1] == 0)
{
fprintf(stderr, "Runtime Error: Divided by zero.\n");
fprintf(stderr, "Program terminated.\n");
continue;
}
stack[top] /= stack[top + 1];
break;
case OPR_ODD:
stack[top] %= 2;
break;
case OPR_EQU:
top--;
stack[top] = stack[top] == stack[top + 1];
break;
case OPR_NEQ:
top--;
stack[top] = stack[top] != stack[top + 1];
case OPR_LES:
top--;
stack[top] = stack[top] < stack[top + 1];
break;
case OPR_GEQ:
top--;
stack[top] = stack[top] >= stack[top + 1];
case OPR_GTR:
top--;
stack[top] = stack[top] > stack[top + 1];
break;
case OPR_LEQ:
top--;
stack[top] = stack[top] <= stack[top + 1];
} // switch
break;
case LOD:
stack[++top] = stack[base(stack, b, i.l) + i.a];
break;
case STO:
stack[base(stack, b, i.l) + i.a] = stack[top];
//printf("%d\n", stack[top]);
fprintf(outfile, "%d\n", stack[top]);
top--;
break;
case CAL:
stack[top + 1] = base(stack, b, i.l);
// generate new block mark
stack[top + 2] = b;
stack[top + 3] = pc;
b = top + 1;
pc = i.a;
break;
case INT:
top += i.a;
break;
case JMP:
pc = i.a;
break;
case JPC:
if (stack[top] == 0)
pc = i.a;
top--;
break;
} // switch
}
while (pc);
//printf("End executing PL/0 program.\n");
fprintf(outfile, "End executing PL/0 program.\n");
} // interpret
//////////////////////////////////////////////////////////////////////
void main ()
{
FILE* hbin;
char s[80],*finddot;
int i;
symset set, set1, set2;
printf("Please input source file name: "); // get file name to be compiled
scanf("%s", s);
if ((infile = fopen(s, "r")) == NULL)
{
printf("File %s can't be opened.\n", s);
exit(1);
}
#if 1 // added by yzhang 02-02-28
// open the output file
finddot = strchr(s,'.');
if (finddot!=NULL){
strcpy(finddot, ".out");
}else{
strcat(s, ".out");
printf("%s\n", s);
}
printf("Output File is %s\n", s);
if ((outfile = fopen(s, "w")) == NULL)
{
printf("File %s can't be opened.\n", s);
exit(1);
}
#endif
phi = createset(SYM_NULL);
relset = createset(SYM_EQU, SYM_NEQ, SYM_LES, SYM_LEQ, SYM_GTR, SYM_GEQ, SYM_NULL);
// create begin symbol sets
declbegsys = createset(SYM_CONST, SYM_VAR, SYM_PROCEDURE, SYM_NULL);
statbegsys = createset(SYM_BEGIN, SYM_CALL, SYM_IF, SYM_WHILE, SYM_NULL);
facbegsys = createset(SYM_IDENTIFIER, SYM_NUMBER, SYM_LPAREN, SYM_NULL);
err = cc = cx = ll = 0; // initialize global variables
ch = ' ';
kk = MAXIDLEN;
getsym();
set1 = createset(SYM_PERIOD, SYM_NULL);
set2 = uniteset(declbegsys, statbegsys);
set = uniteset(set1, set2);
block(set);
destroyset(set1);
destroyset(set2);
destroyset(set);
destroyset(phi);
destroyset(relset);
destroyset(declbegsys);
destroyset(statbegsys);
destroyset(facbegsys);
if (sym != SYM_PERIOD)
error(9); // '.' expected.
if (err == 0)
{
hbin = fopen("hbin.txt", "w");
for (i = 0; i < cx; i++)
fwrite(&code[i], sizeof(instruction), 1, hbin);
fclose(hbin);
}
if (err == 0)
interpret();
else
printf("There are %d error(s) in PL/0 program.\n", err);
listcode(0, cx);
// close all files, added by yzhang, 02-02-28
fclose(infile);
fclose(outfile);
} // main
//////////////////////////////////////////////////////////////////////
// eof pl0.c
H. android native application没有
为了给Android编译程序,你需要ARM工具链(toolchain). 我发现有两种主张,分别是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android没有使用传统的libc库.相反,它用了Bionic库,一个由Google开发的,用在Android移动软件平台上的轻量级的libc
Bionic被裁剪到只支持 Android系统.请看 六百万美元的c程序库
2)CodeSourcery
CodeSourcery是ARM的合作伙伴.专门为ARM处理器开发增强GUN工具链的,并提供验证过的GNU工具链.这些工具链有很多不同的版本.
对于Android平台,需要 arm-none-linux-gnueabi,而arm-none-eabi是没有glibc包含在里面的,主要面向那些编译完整的native库和应用(比如FreeRTOS)
译者注: arm-none-eabi就是用来编译裸机程序的,请参考 最简单的ARM裸机程序
我个人的观点,如果白手起家开始创建一个Android的应用程序,你应该选择Bionic.
但是如果你选择从你的PC环境移植一个库到Android,你应该选择CodeSourcery
如果你使用到线程或者C++异常,Bionic库也不能完全支持它们(实际上,它根本就不支持异常)
agcc.pl是Andrew Ross开发的一个脚本,让你以一种很简单的方法来自动包含常用的库,使用Android的ARM工具链gcc
某种程度上,他像makefile
第1种方法使用Makefile和Android NDK
AR = arm-linux-androideabi-ar
AS = arm-linux-androideabi-as
CC = arm-linux-androideabi-gcc
CXX = arm-linux-androideabi-g++
LD = arm-linux-androideabi-ld.gold
NDK_KIT = /home/tim/android-ndk-r10b
PLATF_KIT = platforms/android-9
ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include
ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/lib
OBJS = hello.o
EXES = hello
hello : hello.o
$(LD) --dynamic-linker=/system/bin/linker -nostdlib \
-rpath-link=$(ARM_LIB) \
$(ARM_LIB)/crtbegin_dynamic.o \
-L$(ARM_LIB) -lc \
-o hello hello.o
hello.o: hello.c
$(CC) -I $(ARM_INC) -c hello.c
clean:
rm -f $(OBJS) $(EXES)
源代码
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello Android\n");
return 0;
}
设置环境变量 envsetup.sh
export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
最后,运行 make 就可以了
关于 -rpath-link选项,请参考 gcc链接选项第二种简单方法,使用shell脚本
#!/bin/sh
OS='linux'
ANDROIDSDK='android-14'
PROGDIR='/home/tim/android-ndk-r10b/'
PROGDIR=`cd $PROGDIR && pwd`
ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"
LINKER=/system/bin/linker
echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
echo "CRT:"$ARMEABICRT
$ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc
保存为b
./b hello.c -o hello
就可以了
实际就是运行命令
/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker \
-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib \
/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o /home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o \
-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include -nostdlib -lc \
hello.c -o hello
crtbegin_dynamic.o 和 crtend_android.o必须配对使用
第三种方法,用–sysroot也是可以的
#!/bin/sh
NDK=/home/tim/android-ndk-r8e
SYSROOT=$NDK/platforms/android-9/arch-arm
CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
LDFLAGS='-Wl,--fix-cortex-a8'
$CC $@
http://www.srombauts.fr/2011/03/06/standalone-toolchain/
#include <stdio.h>
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-ndk", __VA_ARGS__))
int main(void)
{
printf("Hello from NDKn");
LOGI("Hello from NDK");
return 0;
}
果然厉害,上面这段代码都可以这样编译
./b9 -l log nl.c -o hn
用Makefile也能搞
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =hello-ndk
all: $(SRC) $(EXE)
$(EXE): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
clean:
rm -f *.o $(EXE)
编译so库也是可以,厉害
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog -shared
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =libhello-ndk.so
还可以直接运行 gcc
/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm -lc -lm -g main.c -o mm
第4种方法,用ndk-build
创建工程目录hello,然后在其下创建子目录jni
然后在jni下创建两个文件,一个是hello.c,另外一个是Android.mk,内容如下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
其中LOCAL_MODULE_TAGS := optional 这行可以不要
进入到hello目录下,运行下面的命令
# export NDK_PROJECT_PATH=`pwd`
# ndk-build
Compile thumb : helloworld <= hello.c Executable : helloworld Install : helloworld => libs/armeabi/helloworld