《2022年编程问题及解决方法 .pdf》由会员分享,可在线阅读,更多相关《2022年编程问题及解决方法 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、开发环境: BC6.0 问题 1:采集过程中CPU 占用为 100% 的问题问题 2:如何保证从串口获取某一数据整数倍的字节数据?问题 3 :在对长序列进行中值滤波时,总是出现内存不足的错误问题 4:当在 TTimer 事件响应程序中增加了一段代码后,程序不能正常运行。问题 5: 调用 TForm 的 ShowModal() 方法时,出现“Cannot make a visible window modal ”错误提示信息。问题 6:字符串与空串的比较问题问题 7:关于路径分割问题BORLAND第三方组件安装方法如何获取当前可执行文件的目录?如何使 TChart8.0 控件显示中文?动态分配空
2、间注意事项符号函数 Sign 的使用2008 年 10 月 10 日星期一本程序串口通讯使用了串口通讯组件,该组件为下载的第三方组件,使用方法通过自己摸索,现已基本掌握。该组件源代码包括comm.cpp,comm.dcr,comm.h 三个文件。使用时,首先要安装组件,然后在samples组件列表中出现该通讯组件图标。使用该组件的方法同其他组件,但是必须将源代码复制到你的源程序目录中。使用该串口通讯组件时,一定要注意将正确的参数传递给组件,参数的设置一定要与组件的参数定义一致(可通过察看源代码来确定组建参数的设置)。我在使用过程中,就是由于参数设置不一致,导致了数据传递(波特率)错误,是信号不
3、能正确发送和接受。2008 年 10 月 20 日星期一增加了峰值显示功能、扣除基线功能。2008 年 10 月 24 日星期五增加了扣除背景(基线) 、分页 /全显功能、数据保存/读取 /数据导出功能;问题 1:采集过程中CPU 占用为 100% 的问题解决了在采集过程中CPU 占用为 100% 的问题,这导致了程序不能正常操作问题。该问题与不断更新RichEdit 组件标题, 而组件标题越来越长有关。通过改用 AnsiString 变量保存 RichEdit 窗口内容,用richedit-Lines-Add() 来改变 RichEdit 窗口内容,问题解决。问题 2:如何保证从串口获取某一
4、数据整数倍的字节数据?首先判断缓冲区可读字节数,然后求得整数倍的数据值,该数据值要小于缓冲区可读字节数,然后进行读缓冲区操作。问题 3 :在对长序列进行中值滤波时,总是出现内存不足的错误,而检查程序没有发现错误?中值滤波使用了三层循环,对堆栈空间消耗较大,在project/option/linker表中调整最大栈大小( Max stack size ) ,由 0 x100000 调整为 0 x400000,问题解决。问题 4:当在 TTimer 事件响应程序中增加了一段代码后,程序不能正常运行。现象是程序运行后CPU 占用 100%,一会儿报错。 这段代码完成去除采样信号的无效的头数据,其算法
5、是首先判断采集到缓冲区数据的个数,当数据个数已达到无效数据个数时,从缓冲区读出无效数据。去掉这段代码后,程序运行依然正常。TTimer 事件响应程序中调用了TChart名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 控件,错误信息只与TChart 控件有关。问题出在哪里呢?分析:通过跟踪,增加代码没有问题,可以正常通过。判断问题与程序代码无关,可能与采集到的数据有关,影响到TChart 控件的正常运行。由于是空采集,采集到的数据
6、都是65535,由于数据都相同,从而导致TChart 控件运行不正常。修改程序,当采集到的数据都是 65535 时,改变其中一个数据值。修改后程序运行正常,问题解决。2008 年 11 月 14 日星期五今天遇到了一个问题,当进行中值滤波时,出现指针错误。跟踪发现,错误是在滤波模块运行结束后出现的,这说明与滤波程序无关。后来发现滤波后数据要在TChart 控件上显示,而滤波结果为65535 组成的常数序列,因此导致了问题4 的错误。2008 年 11 月 24 日星期一当从历史数据文件中读取数据进行显示时,欲想将数据显示于监视对话框,当数据个数较大时,将花费很长时间(10 万数据大约1 分钟)
7、,这是由于将数据转换为文本数据时,利用 ansiString 类型变量保存转换的文本数据,该变量存储字符数越多,处理速度就越慢,占用 CPU 时间也越多。解决办法是转换一部分数据后,马上放入数据显示区显示,然后再清空 ansiString 变量。2008 年 12 月 8 日星期一峰值条件:满足下列条件的值ixf为峰值,横坐标ix为峰值点。1iixfxf,1iixfxfthresholdxfxfii10thresholdxfxfii102009 年 5 月 13 日星期三C+Builder6 源代码组件安装步骤:执行 /Component/Install Component/ ,在对话框中选I
8、nto new pakages页面,在 Unit file name 编辑框输入组件文件名 (路径 comm.cpp) ,Pakage file name编辑框输入组件包文件名(例如路径 SeriesComm.bpk) ,Pakage description 编辑框输入说明性文字, 单击 OK 按钮, 即可进入 Pakage 对话框, 单击 Compile 按钮编译组件,单击 Install按钮安装组件。BORLAND第三方组件安装方法(资料来源 :学网 (), 原文地址 :http:/ BORLAND提供的组件叫第三方组件:安装方法:就目前常见的各种形式的组件的安装方法介绍一下。1 只有一个
9、DCU 文件的组件。 DCU 文件是编译好的单元文件,这样的组件是作者不想把源码公布。一般来说,作者必须说明此组件适合Delphi 的哪种版本,如果版本不对,在安装时就会出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦Delphi 版本升级,此组件就不能再使用了,当然有的作者给出了几种版本的DCU 文件,用户根据需要选择使用。这样的组件的安装方法是:在Component 菜单中,选择install component ,在对话框名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
10、第 2 页,共 7 页 - - - - - - - - - into existing package 页中,单击“ Unit file name ”后的“ Browse”按扭,在打开的文件对话框中, 将 “文件类型” 设定为 *.dcu , 找到要安装的DCU 文件,按 OK 按钮返回 into existing package页后再按 OK 按钮就可以安装了。注意, 此时 Delphi 会提示 dclusr40.dpk 将被重建,是否继续, OK 就可以了。这里是将组件安装到dclusr40.dpk 包中,此包从文件名上可以看出是用户自定义组件包,先安装到这个包中吧,下面再讲有关注意事项。
11、安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到组件面板上看看,一般会出现一个新的组件页,其中有刚安装的组件。2、 只有 cpp 文件或既有cpp 又有 DCU 文件的组件。这种组件因为有cpp 文件,也就是说作者提供了源码,这就好办多了。安装的方法和上面是一样的,在文件类型中可以设定为DCU 也可以设定为cpp,建议设定为cpp,这样可用你的C+Builder 重新编译一下, 看是否会出现问题。 C+Builder 升级后只能选择cpp 文件安装, 这样才能重新编译,使得组件能适应新 C+Builder版本。这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好
12、不要使用,一是存在C+Builder版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否是组件中存在BUG 。3、有 dpk 文件的组件包。带有dpk 文件的组件包一般是有多个组件构成的,也就是说安装后会有多个组件供使用,如果只有一个组件作者一般不会制成DPK 文件,使用上面的方式发布就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的RXLIB ,由于组件复杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没有安装说明文件,那么用下面的方法安装:在 File 菜单下, 选择”OPEN, ” 打开 dpk文件 (文件类型列表框中选*.dp
13、k) ,在出现的Package窗口中,工具栏上有Install 按钮,按此按钮即可进行安装。如果 Install 按钮处于无效状态,那么先按Compile 按钮编译, 一般来说编译之后Install 按钮就会处于有效状态,此时再按Install 按钮就可以了。4、 带有 Bpl 文件的组件包。 一般来说这也是由多种组件构成的组件包,它其实是一个动态连接库文件(DLL ) 。对于这种组件包的安装方法是:在component 菜单下选择“install packages ” ,然后单击Add 按钮,在打开的文件对话框中找到相应的bpl 文件打开返回后,再单击 Ok 按钮就可以了。5、ActiveX
14、 控件的安装。 要安装这类控件, 需要先用regsvr32.exe 注册,然后选择Component菜单中 Import ActiveX Control项。在 Import ActiveX Control打开的窗口中,只有已经注册的 ActiveX 控件才出现在列表中,选中一个然后按Install 按钮就可以安装了。如果事先没有用 regsvr32.exe 注册也可以按ADD 按钮找到OCX 文件即时注册,注册后再进行安装。几点说明:1 在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的指导,有些还会有组件的属性、事件、方法的使用说明,这些在使用时是非常重要的。2 在上面的组件(
15、包)安装操作之前,最好将*.bpl 拷贝到你的System目录中,将*.cpp、*.dcu、*.dcr 、*.dp?拷贝到 C+Builder 的 Lib 目录中再进行。3 前面我们提到安装DCU 组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 装到一个新的包中,如果选择新包,需要先取一个名字比如DEMO ,事实上安装完毕后用户 可以 找到 的是Demo.bpl
16、 , 而找 不到DEMO.DPK 。 假 如 你 已经 将一个组件安 装到dclusr40.dpk 中了,还想再安装一个组件,如果再安装到dclusr40.dpk 中,安装后你得到提示,原来安装的那个组件已经被取消注册,你将无法使用了。这样不就成了只能安装一个组件了吗?除非你再安装到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的BPL 文件也未偿不可,但BPL 文件就增加许多。能否在dclusr40.dpk 中多安装几个组件呢?当然是可以的。方法如下:用File 菜单下的OPEN 打开 dclusr40.dpk 文件,单击ADD 按钮,在打开的对话框中选择 ADD UNIT
17、 页面,按Unit file name 后的“ Browse”按钮打开组件单元文件,OK即可, 用此种方法这样可添加多个组件的单元文件,添加完毕,按一下编译按钮,然后再按Install 按钮即可,如果单元文件是编译好的(DCU)可以直接按安装按钮。4 组件的删除。 光会安装可不行, 还要会删除呀。 很简单,在 component 菜单下,选择 install packages ,在列表中找到安装所在的Bpl,按 Remove 按钮, ok!再把Bpl 文件删掉就彻底了,如果不删除BPL 文件,下次可以按安装BPL 组件的方法再安装使用2010 年 7 月 20 日星期二在程序编译链接过程中,若
18、出现若下问题,Linker Error Unresolved external Ex_Vender_ScanOrPrint referenced from F:MSUVDEVICEINTERFACE.OBJ 则说明程序在链接过程中,没有找到外部函数Ex_Vender_ScanOrPrint 所在的库文件或程序文件。只要将该库文件或程序文件添加到工程中即可。添加命令为菜单命令projectAdd to Project。2010 年 7 月 23 日星期五指向数组的指针,其删除的方法如下:Arrays are deleted by operator delete(). You must use t
19、he syntax delete expr when deleting an array. char * p; void func() p = new char10; / allocate 10 chars delete p; / delete 10 chars C+ 2.0 code required the array size to be named in the delete expression. In order to allow 2.0 code to compile, C+Builder issues a warning and simply ignores any size
20、that is specified. For example, if the preceding example reads delete10 p and is compiled, the warning is as follows: Warning: Array size for delete ignored in function func() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 2010 年 7 月 24 日星
21、期六今天在编译程序时遇到如下提示信息:应用程序正常初始化(0 xc0000005)失败 .请单击确定 ,终止应用程序关闭安装的各种杀毒软件、防火墙等,也无效。在卸载了系统安装的c+builder2009 ,并重新安装 c+builder6 后,恢复正常。分析原因可能是c+builder6 系统发生了问题。2010 年 8 月 7 日星期六如何获取当前可执行文件的目录?GetCurrentDir ()该函数获得当前目录的全限定名(全路径名)。extern PACKAGE int fastcall GetModuleFileName(HMODULE Module, char *Buffer, in
22、t BufLen); 这个函数获取给定模块的绝对路径,模块由句柄给定. 例如,获取当前执行的应用程序的绝对路径,可以如下调用该函数:char bufMAXFILE; int iret; iret=GetModuleFileName(NULL, Buffer,sizeof(Buffer); if(iret=0)ShowMessage( “失败!” ) ;return ; extern PACKAGE AnsiString_fastcall GetModuleName(unsigned Module); 这个函数获取给定模块的绝对路径,功能同GetModuleFileName 2010 年 8 月
23、 18 日星期三如何使 TChart8.0 控件显示中文?1.设计时设计时可以通过选项进行更改,在 TEECHART 控件中点击右键选择OPTIONS, 选择简体中文,便可以显示中文了。2.运行时通过上述方法更改后,运行时仍是英文,可以通过下述方法实现,在单元文件中引用TeeChineseSimp单元文件, 即在相应头文件中增加行#include TeeChineseSimp.hpp ,并在相应的 CPP 文件前面增加行#pragma link TeeChineseSimp ,然后在执行显示界面的语句前面调用 TeeSetChineseSimp()函数(全局函数) ,现在运行时,界面也同样是中
24、文了。2011 年 3月 21 日星期一动态分配空间注意事项名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 在程序中一定要对动态分配空间( new操作) 的指针变量赋初始值NULL ,然后在释放该指针占用之空间时,要判断其不为空才执行释放操作(delete ) ,这样可以避免delete对野指针进行操作。在程序中执行对非空指针变量的delete操作后,应立即给该变量指针赋空指针 NULL 。在定义对象类时,若有需要动态分配空间的
25、指针变量,一般应在构造函数中给指针变量赋值空指针NULL ,在析构函数中释放非空指针变量所占用之空间。问题5:调用 TForm 类的 ShowModal() 方法时,出现“Cannot make a visible window modal”错误提示信息。过去调用 TForm 类的 ShowModal() 方法时一切正常, 今天我将 myForm 的属性 FormStyle改为 fsMDIChild后,当执行 myForm- ShowModal() 时,出现“Cannot make a visible window modal”错误提示信息。 通过上网查询和查看帮助发现,fsMDIChild风
26、格窗口必须是可见的,即其 Visible 属性必须为真,当将属性FormStyle 改为 fsMDIChild后,其 Visible 属性自动由false 变为 true,而 ShowModal() 是将一个隐藏的模式窗口显示出来,而此时myForm 已经为可见的( Visible) ,从而执行ShowModal() 就产生了以上错误-“不能生成一个可视化的模态窗口” 。问题6:字符串与空串的比较问题以下程序段有什么问题?char a20; gets(a); if(a= = ”) 咋看是没有问题,编译也不会有语法错误,但是 a= =”是不能正确的, 因为字符串是没有= =这个关系运算的。正确的
27、方法是用字符串比较函数strcmp。但是对于 AnsiString 字符串,则可以使用“= =”关系运算。问题7:关于路径分割问题以下程序段是将一个全路径字符串分割为盘符和路径:char sMAXPA TH; / char driveMAXDRIVE; char dirMAXDIR; strcpy(s,” g:tempdd ” ); fnsplit(s,drive,dir,0,0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 该程序段能够满足要求吗?其实不然,正确的方法如下:strcpy(s,” g:tempdd ” ); strcat(s,” ” ); fnsplit(s,drive,dir,0,0); 符号函数Sign的使用符号函数Sign 包含在单元模块Math 中,因此程序中需包含单元Math,即程序前面要加入包含语句 #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -