我的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.

解决方案 »

  1.   

    PCHAR就一般不需要VAR修饰
    Array Of 是动态数组,本质上是指针,是Delphi的语法特征~用做DLL接口当然不行的另外注意指针操作~
    显然你这个错误就是指针用错所致
      

  2.   

    这台机器上没有装delphi,我只能回家时试一下,但家里的机器没上网,太不方便了.
    不过程序能运行,就是释放空间时出错.下面是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 );
      

  3.   

    那位能将以下c++函数声明转换为delphi语法说明。先谢谢了。typedef long fcINT;bool (_stdcall * fcInitForcal) (void);void (_stdcall * fcGetRunErr) (int &,char *&,int &);int (_stdcall * fcRealCom) (char *,fcINT ,void *&,fcINT &,double *&,fcINT &,fcINT &);double (_stdcall * fcRealCal) (void *,double *);
      

  4.   

    ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net) 说得正确:  “Array Of 是动态数组,本质上是指针,是Delphi的语法特征~用做DLL接口当然不行的”就这一个错误,改了之后,程序能正常运行了。