我的delphi代码如下,愿意帮忙的朋友留下E-mail或QQ,我给发过去。先谢谢了。
我的E-mail:[email protected] ,QQ:630715621 unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Doubuf=array of double;
//动态调用动态库的函数类型声明
fcInitForcal=function:boolean ; stdcall;
fcGetRunErr=procedure(var i:integer;var str:Pchar;var k:integer); stdcall;
fcRealCom=function(a:Pchar;m:Longint;var hFor:Longint;var npara:Longint;var para:Doubuf;var ii:Longint;var jj:Longint):integer; stdcall;
fcRealCal=function(hFor:Longint;a :DouBuf):double; stdcall;
fcFreeForcal=procedure; stdcall;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
LibHandle:THandle;
public
{ Public declarations }
end;var
Form1: TForm1; //定义要用到的函数,通过LoadLibrary 实现动态调用
InitForcal:fcInitForcal;
GetRunErr:fcGetRunErr;
RealCom:fcRealCom;
RealCal:fcRealCal;
FreeForcal:fcFreeForcal;implementation{$R *.dfm}//输出编译错误信息。
procedure OutErr(iCode:Integer;ii,jj:Longint);
begin
case iCode of
1:Form1.Memo2.Text :='内存分配失败!';
2:Form1.Memo2.Text :='括号不成对!';
3:Form1.Memo2.Text :='(等号后)没有表达式!';
4:Form1.Memo2.Text :='复数表达式中不能使用i作为参数!';
5:Form1.Memo2.Text :='字符串中转义字符错误!';
6:Form1.Memo2.Text :='字符串无效,即"..."不匹配!';
7:Form1.Memo2.Text :='不可识别字符!';
8:Form1.Memo2.Text :='表达式名称定义错误!';
9:Form1.Memo2.Text :='不可识别的自变量,自变量只能以字母或下画线开头!';
10:Form1.Memo2.Text :='不可识别的自变量定义方法,“(,:,:,:,:,...)”冒号过多!';
11:Form1.Memo2.Text :='自变量定义错误!';
12:Form1.Memo2.Text :='continue()函数只能有0个参数!';
13:Form1.Memo2.Text :='只能在while,until中使用continue函数!';
14:Form1.Memo2.Text :='break()函数只能有0个参数!';
15:Form1.Memo2.Text :='只能在while,until中使用break函数!';
16:Form1.Memo2.Text :='if,while,until,which中的参数个数至少为2个!';
17:Form1.Memo2.Text :='表达式中的数字错误!';
18:Form1.Memo2.Text :='&单目取地址运算符只能用于单独的变量!';
19:Form1.Memo2.Text :='单目运算符++、--错误!';
20:Form1.Memo2.Text :='括号内没有数字!';
21:Form1.Memo2.Text :='单目运算符+、-、!错误!';
22:Form1.Memo2.Text :='赋值“=”错误!';
23:Form1.Memo2.Text :='不正确的运算方式或其他语法错误!';
24:Form1.Memo2.Text :='不可识别变量名!';
25:Form1.Memo2.Text :='不可识别函数名!';
26:Form1.Memo2.Text :='一级函数只能有一个参数!';
27:Form1.Memo2.Text :='二级函数参数不匹配!';
28:Form1.Memo2.Text :='模块中的表达式的自变量不能重新赋值!';
29:Form1.Memo2.Text :='(模块中)表达式有重名!';
30:Form1.Memo2.Text :='***未定义***!';
31:Form1.Memo2.Text :='***未定义***!';
32:Form1.Memo2.Text :='调用整数表达式时参数不匹配!';
33:Form1.Memo2.Text :='调用实数表达式时参数不匹配!';
34:Form1.Memo2.Text :='调用复数表达式时参数不匹配!';
35:Form1.Memo2.Text :='自变量重名!';
36:Form1.Memo2.Text :='其他错误!';
-1:Form1.Memo2.Text :='在共享版中,编译表达式的长度受到限制!';
end; //确定出错位置。
Form1.Memo1.SelStart:= ii -1;
Form1.Memo1.SelLength:= jj - ii +1;
Form1.Memo1.SetFocus;
end;procedure TForm1.FormCreate(Sender: TObject);
begin LibHandle:=LoadLibrary('forcal.dll');
if LibHandle = 0 then
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('找不到forcal.dll,请将该库放到Windows的搜索路径内。');
exit;
end; //动态调用时得到函数地址
@InitForcal:=GetProcAddress(LibHandle,'InitForcal');
@GetRunErr:=GetProcAddress(LibHandle,'GetRunErr');
@RealCom:=GetProcAddress(LibHandle,'RealCom');
@RealCal:=GetProcAddress(LibHandle,'RealCal');
@FreeForcal:=GetProcAddress(LibHandle,'FreeForcal'); //判断这些函数指针是否有效。
if ((@InitForcal=nil) or (@GetRunErr=nil) or (@RealCom=nil) or (@RealCom=nil) or (@RealCal=nil)) then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('forcal.dll中没有有效的输出函数!');
exit;
end; if InitForcal()=False then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('forcal.dll初始化失败!');
exit;
end; Memo1.Text:='请在此输入表达式!只能计算20个实数表达式!'+Chr(13)+chr(10)+
'可在多行中输入表达式,表达式之间用分号“;”分隔。'+Chr(13)+chr(10)+
'只计算无参表达式。有参数的表达式,只编译,不计算。'+Chr(13)+chr(10)+
'重新初始化将清除以前的编译结果。'+Chr(13)+chr(10)+
'注意:该示例程序较简单,不能退出无限循环!';
Memo2.Text:='在这里输出计算结果!';end;procedure TForm1.FormDestroy(Sender: TObject);
begin
if LibHandle <> 0 then
begin
FreeForcal();
FreeLibrary(LibHandle);
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//重新初始化Forcal。
if InitForcal()=False then
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('重新初始化Forcal失败!');
end
else
begin
Memo2.Text :='重新初始化成功!以前的编译结果已全部清除!';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
bEnd:Boolean;
iCode,iErr:integer;
i,j,ii,jj,lFor:Longint;
pch:Pchar;
perr:Pchar;
hFor:array[0..20] of Longint;
lPara:array[0..20] of Longint;
d:array[0..1] of double;
pD:Doubuf;
begin
pch:=Pchar(Memo1.Text); //编译由分号隔开的各个实数表达式(最多20个)。
i:=0; lFor:=-1; bEnd:=False;
while (bEnd=False) and (lFor<19) do
begin
j:=i;
while (pch[j]<>';') and (pch[j]<>Chr(0)) do j:=j+1;
if pch[j]=Chr(0) then bEnd:=True;
if i=j then
begin
i:=j+1;
continue;
end;
pch[j]:=Chr(0);
lFor:=lFor+1;
//先清除以前的运行错误。
GetRunErr(iErr, perr, iCode);
//编译表达式。
iCode:=RealCom(@pch[i], 0, hFor[lFor], lPara[lFor],pD, ii, jj);
if bEnd=False then pch[j]:=';';
//输出编译错误。
if iCode<>0 then
begin
OutErr(iCode,i+ii+1,i+jj+1);
exit;
end;
i:=j+1;
end; Memo2.Text := ''; //计算各个表达式,仅计算无参表达式:lPara(i) = -1。
For i := 0 To lFor do
begin
If lPara[i] = -1 Then
begin
d[0]:=RealCal(hFor[i],@d);
Memo2.Text := Memo2.Text+Chr(13)+chr(10)+FloatToStr(d[0]);
end;
end;
//检查运行错误。
GetRunErr(iErr, perr, iCode);
If iErr <> 0 Then
begin
Memo2.Text := Memo2.Text +Chr(13)+chr(10)+
'出现运行错误!'+Chr(13)+chr(10)+
'函数名:'+perr+Chr(13)+chr(10)+
'错误代码:'+IntToStr(iCode);
end;end;end.
我的E-mail:[email protected] ,QQ:630715621 unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Doubuf=array of double;
//动态调用动态库的函数类型声明
fcInitForcal=function:boolean ; stdcall;
fcGetRunErr=procedure(var i:integer;var str:Pchar;var k:integer); stdcall;
fcRealCom=function(a:Pchar;m:Longint;var hFor:Longint;var npara:Longint;var para:Doubuf;var ii:Longint;var jj:Longint):integer; stdcall;
fcRealCal=function(hFor:Longint;a :DouBuf):double; stdcall;
fcFreeForcal=procedure; stdcall;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
LibHandle:THandle;
public
{ Public declarations }
end;var
Form1: TForm1; //定义要用到的函数,通过LoadLibrary 实现动态调用
InitForcal:fcInitForcal;
GetRunErr:fcGetRunErr;
RealCom:fcRealCom;
RealCal:fcRealCal;
FreeForcal:fcFreeForcal;implementation{$R *.dfm}//输出编译错误信息。
procedure OutErr(iCode:Integer;ii,jj:Longint);
begin
case iCode of
1:Form1.Memo2.Text :='内存分配失败!';
2:Form1.Memo2.Text :='括号不成对!';
3:Form1.Memo2.Text :='(等号后)没有表达式!';
4:Form1.Memo2.Text :='复数表达式中不能使用i作为参数!';
5:Form1.Memo2.Text :='字符串中转义字符错误!';
6:Form1.Memo2.Text :='字符串无效,即"..."不匹配!';
7:Form1.Memo2.Text :='不可识别字符!';
8:Form1.Memo2.Text :='表达式名称定义错误!';
9:Form1.Memo2.Text :='不可识别的自变量,自变量只能以字母或下画线开头!';
10:Form1.Memo2.Text :='不可识别的自变量定义方法,“(,:,:,:,:,...)”冒号过多!';
11:Form1.Memo2.Text :='自变量定义错误!';
12:Form1.Memo2.Text :='continue()函数只能有0个参数!';
13:Form1.Memo2.Text :='只能在while,until中使用continue函数!';
14:Form1.Memo2.Text :='break()函数只能有0个参数!';
15:Form1.Memo2.Text :='只能在while,until中使用break函数!';
16:Form1.Memo2.Text :='if,while,until,which中的参数个数至少为2个!';
17:Form1.Memo2.Text :='表达式中的数字错误!';
18:Form1.Memo2.Text :='&单目取地址运算符只能用于单独的变量!';
19:Form1.Memo2.Text :='单目运算符++、--错误!';
20:Form1.Memo2.Text :='括号内没有数字!';
21:Form1.Memo2.Text :='单目运算符+、-、!错误!';
22:Form1.Memo2.Text :='赋值“=”错误!';
23:Form1.Memo2.Text :='不正确的运算方式或其他语法错误!';
24:Form1.Memo2.Text :='不可识别变量名!';
25:Form1.Memo2.Text :='不可识别函数名!';
26:Form1.Memo2.Text :='一级函数只能有一个参数!';
27:Form1.Memo2.Text :='二级函数参数不匹配!';
28:Form1.Memo2.Text :='模块中的表达式的自变量不能重新赋值!';
29:Form1.Memo2.Text :='(模块中)表达式有重名!';
30:Form1.Memo2.Text :='***未定义***!';
31:Form1.Memo2.Text :='***未定义***!';
32:Form1.Memo2.Text :='调用整数表达式时参数不匹配!';
33:Form1.Memo2.Text :='调用实数表达式时参数不匹配!';
34:Form1.Memo2.Text :='调用复数表达式时参数不匹配!';
35:Form1.Memo2.Text :='自变量重名!';
36:Form1.Memo2.Text :='其他错误!';
-1:Form1.Memo2.Text :='在共享版中,编译表达式的长度受到限制!';
end; //确定出错位置。
Form1.Memo1.SelStart:= ii -1;
Form1.Memo1.SelLength:= jj - ii +1;
Form1.Memo1.SetFocus;
end;procedure TForm1.FormCreate(Sender: TObject);
begin LibHandle:=LoadLibrary('forcal.dll');
if LibHandle = 0 then
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('找不到forcal.dll,请将该库放到Windows的搜索路径内。');
exit;
end; //动态调用时得到函数地址
@InitForcal:=GetProcAddress(LibHandle,'InitForcal');
@GetRunErr:=GetProcAddress(LibHandle,'GetRunErr');
@RealCom:=GetProcAddress(LibHandle,'RealCom');
@RealCal:=GetProcAddress(LibHandle,'RealCal');
@FreeForcal:=GetProcAddress(LibHandle,'FreeForcal'); //判断这些函数指针是否有效。
if ((@InitForcal=nil) or (@GetRunErr=nil) or (@RealCom=nil) or (@RealCom=nil) or (@RealCal=nil)) then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('forcal.dll中没有有效的输出函数!');
exit;
end; if InitForcal()=False then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('forcal.dll初始化失败!');
exit;
end; Memo1.Text:='请在此输入表达式!只能计算20个实数表达式!'+Chr(13)+chr(10)+
'可在多行中输入表达式,表达式之间用分号“;”分隔。'+Chr(13)+chr(10)+
'只计算无参表达式。有参数的表达式,只编译,不计算。'+Chr(13)+chr(10)+
'重新初始化将清除以前的编译结果。'+Chr(13)+chr(10)+
'注意:该示例程序较简单,不能退出无限循环!';
Memo2.Text:='在这里输出计算结果!';end;procedure TForm1.FormDestroy(Sender: TObject);
begin
if LibHandle <> 0 then
begin
FreeForcal();
FreeLibrary(LibHandle);
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//重新初始化Forcal。
if InitForcal()=False then
begin
Button1.Enabled:=False;
Button2.Enabled:=False;
ShowMessage('重新初始化Forcal失败!');
end
else
begin
Memo2.Text :='重新初始化成功!以前的编译结果已全部清除!';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
bEnd:Boolean;
iCode,iErr:integer;
i,j,ii,jj,lFor:Longint;
pch:Pchar;
perr:Pchar;
hFor:array[0..20] of Longint;
lPara:array[0..20] of Longint;
d:array[0..1] of double;
pD:Doubuf;
begin
pch:=Pchar(Memo1.Text); //编译由分号隔开的各个实数表达式(最多20个)。
i:=0; lFor:=-1; bEnd:=False;
while (bEnd=False) and (lFor<19) do
begin
j:=i;
while (pch[j]<>';') and (pch[j]<>Chr(0)) do j:=j+1;
if pch[j]=Chr(0) then bEnd:=True;
if i=j then
begin
i:=j+1;
continue;
end;
pch[j]:=Chr(0);
lFor:=lFor+1;
//先清除以前的运行错误。
GetRunErr(iErr, perr, iCode);
//编译表达式。
iCode:=RealCom(@pch[i], 0, hFor[lFor], lPara[lFor],pD, ii, jj);
if bEnd=False then pch[j]:=';';
//输出编译错误。
if iCode<>0 then
begin
OutErr(iCode,i+ii+1,i+jj+1);
exit;
end;
i:=j+1;
end; Memo2.Text := ''; //计算各个表达式,仅计算无参表达式:lPara(i) = -1。
For i := 0 To lFor do
begin
If lPara[i] = -1 Then
begin
d[0]:=RealCal(hFor[i],@d);
Memo2.Text := Memo2.Text+Chr(13)+chr(10)+FloatToStr(d[0]);
end;
end;
//检查运行错误。
GetRunErr(iErr, perr, iCode);
If iErr <> 0 Then
begin
Memo2.Text := Memo2.Text +Chr(13)+chr(10)+
'出现运行错误!'+Chr(13)+chr(10)+
'函数名:'+perr+Chr(13)+chr(10)+
'错误代码:'+IntToStr(iCode);
end;end;end.
解决方案 »
- 定时器问题
- 大家有沒有做過ServerSocket的文件保存功能啊,客戶端同時發文件過來時,保存多個文件由於共用一個全局文件流而發生錯誤!大家是怎麼處理的?
- 为什么SPComm控件不支持DSR和CTS变化
- 【请教】该如何设置FastReport?
- 在线等!请教一个简单问题:如何动态加载一个image控件?
- 高手指教!急!
- 各位大侠帮帮我吧:用EXCEL做的报表程序,安装程序怎么做呀?
- 找不到WSockets.dcu,请帮忙,谢谢
- ReportBuilder 的用法?
- 请问哪个网站可以检测到我的ip地址?
- 有用过2005的吗?有个设置问题请教?
- ★★★Delphi圣地高级群 欢迎您的加入 33393638 33393638★★★
Array Of 是动态数组,本质上是指针,是Delphi的语法特征~用做DLL接口当然不行的另外注意指针操作~
显然你这个错误就是指针用错所致
不过程序能运行,就是释放空间时出错.下面是c++头文件,大家再帮忙看一下.
另:不知道c++中的"void *"用delphi怎样表示?//////// FORCAL7.h ////////////////////////// 常量及数据类型 ///////////////////typedef long fcINT; //FORCAL的整数定义;#define FC_Key_User 256 //用户键值最小值;#define Key_IntFor 1 //整数表达式标志;
#define Key_RealFor 2 //实数表达式标志;
#define Key_ComplexFor 3 //复数表达式标志;
#define Key_IntFunction 4 //整数函数标志;
#define Key_RealFunction 5 //实数函数标志;
#define Key_ComplexFunction 6 //复数函数标志;
#define Key_IntArray 7 //整数数组标志;
#define Key_RealArray 8 //实数数组标志;
#define Key_ComplexArray 9 //复数数组标志;
#define Key_Str 10 //字符串标志;
#define Key_IntConst 11 //整数常量标志;
#define Key_RealConst 12 //实数常量标志;
#define Key_ComplexConst 13 //复数常量标志;typedef long (_stdcall * fcIntFun)(fcINT ,long *,void *); //FORCAL标准整数二级函数;
typedef double (_stdcall * fcRealFun)(fcINT ,double *,void *); //FORCAL标准实数二级函数;
typedef _complex (_stdcall * fcComplexFun)(fcINT ,_complex *,void *);//FORCAL标准复数二级函数;////////// 输出函数 /////////////////////FORCAL版本信息
typedef const char * (_stdcall * fcForcalVer) (void);
//初始化FORCAL
typedef bool (_stdcall * fcInitForcal) (void);
//释放FORCAL动态库
typedef void (_stdcall * fcFreeForcal) (void);
//获得FORCAL运行错误;执行了该函数后,将FORCAL恢复为无错状态
typedef void (_stdcall * fcGetRunErr) (int &,char *&,int &);
//测试是否有运行错误
typedef int (_stdcall * fcTestRunErr) (void);
//设置FORCAL运行运行错误;字符串指针指出出错函数名
typedef void (_stdcall * fcSetRunErr) (int ,char *,int );//编译实数表达式
typedef int (_stdcall * fcRealCom) (char *,fcINT ,void *&,fcINT &,double *&,fcINT &,fcINT &);
//计算实数表达式的值
typedef double (_stdcall * fcRealCal) (void *,double *);//编译整数表达式
typedef int (_stdcall * fcIntCom) (char *,fcINT ,void *&,fcINT &,long *&,fcINT &,fcINT &);
//计算整数表达式的值
typedef long (_stdcall * fcIntCal) (void *,long *); //编译复数表达式
typedef int (_stdcall * fcComplexCom) (char *,fcINT ,void *&,fcINT &,_complex *&,fcINT &,fcINT &);
//计算复数表达式的值
typedef _complex (_stdcall * fcComplexCal) (void *,_complex *);//设置外部二级函数
typedef int (_stdcall * fcSetFunction) (int ,char *,void *,fcINT );
//设置常量
typedef int (_stdcall * fcSetConst) (int ,char *,void *);
//删除常量或二级函数
typedef void (_stdcall * fcDeleteConstOrFunction) (int ,char *);//根据表达式名称获得表达式信息
typedef bool (_stdcall * fcGetFor) (char *,int ,void *,void *&,void *&,fcINT &);
//获得表达式中的所有字符串
typedef void (_stdcall * fcGetForStr) (void *,char *&,fcINT &);
//根据数组名称获得数组信息
typedef bool (_stdcall * fcGetArray) (int ,char *,void *&,long &);//删除一个表达式
typedef void (_stdcall * fcDeleteFor) (int ,void *);//用户插入一个键
typedef int (_stdcall * fcInsertKey) (char *,int ,void *,void (_stdcall *)(void *),void *&);
//用户查找一个键
typedef void * (_stdcall * fcSearchKey) (char *,int );
//用户删除一个键
typedef void (_stdcall * fcDeleteKey) (char *,int );