谢谢刘胜淘,接分

解决方案 »

  1.   

    http://community.csdn.net/Expert/TopicView.asp?id=3332201
      

  2.   

    楼上的,我不稀罕分,分对我来说不重要,只不过给了楼主个用Delphi写的公式的类而已。要不要我给你贴出所有源代码啊。楼主可以把源代码给贴出来
      

  3.   

    To jinjazz(人雅的标记--落寞刺客) :没什么好说的是我的马甲,封了他吧。呵呵,你认为我会导分吗
      

  4.   

    http://community.csdn.net/Expert/topic/2641/2641406.xml?temp=.7165033
    http://community.csdn.net/Expert/topic/2794/2794615.xml?temp=.5860865
      

  5.   

    function TCompile.GetErrorBIG5(const xErrorCode: integer): string; //返回错误描述
    begin
      //注意:以下使用的是中文繁体BIG5码,要使用内码转换器才能察看
      case xErrorCode of
        csTCompile_NoError: result := ''; //⊿Τ祇瞷岿粇!
        csTCompile_NoKnownError: result := 'ぃ笵岿粇!';
        csTCompile_NoErrorCode: result := 'тぃ岿粇腹┮癸莱岿粇磞瓃!';
        csTCompile_CompileHexCodeError: result := '絪亩せ秈絏岿粇!';
        csTCompile_HexMod2_EQ_1_Error: result := '絪亩肚岿粇!';
        csTCompile_PMMarker_Error: result := '絪亩眔把计嘿祇ネ岿粇!';
        csTCompile_FMMarker_Error: result := '絪亩眔ㄧ计嘿祇ネ岿粇!';
        csTCompile_Wording_Error: result := '粂猭祇ネ岿粇!';
        csTCompile_Bracket_Error: result := '粂猭岿粇, ( ) 矪!';
        csTCompile_Optimize_Error: result := '絪亩涩て祇ネ岿粇!';
        csTCompile_Define_Error: result := 'ㄧ计絪亩岿粇(┪禬﹚竡办)!';
        csTCompile_Handwriting_Error: result := 'ㄧ计糶Α岿粇!';
        csTCompile_FFHandwriting_Error: result := '縩だㄧ计糶Α岿粇!';
        csTCompile_ReadFloat_Error: result := '絪亩弄盽计计祇ネ岿粇!';
        csTCompile_ReadMarker_Error: result := '絪亩弄夹醚才祇ネ岿粇!';
        csTCompile_Read_Error: result := '粂猭岿粇,Τぃ醚才!';
        csTCompile_Note_Match_Error: result := '猔睦才腹ぃで皌!  { } ┪ /*  */';
      else
        result := GetErrorBIG5(csTCompile_NoErrorCode);
      end;
    end;function TCompile.GetErrorEnglish(const xErrorCode: integer): string;
    //返回错误描述
    begin
      //注意:作者是使用工具软件翻译的,希望能有大虾更正:)
      case xErrorCode of
        csTCompile_NoError: result := ''; //Not found error!
        csTCompile_NoKnownError: result := 'Not knowing error.';
        csTCompile_NoErrorCode: result :=
          'Can not find the error code opposite describe.';
        csTCompile_CompileHexCodeError: result :=
          'The CPU instruction''s HEX code error, when compile the text.';
        csTCompile_HexMod2_EQ_1_Error: result :=
          'Stream into the instruction length is error, when compile the text.';
        csTCompile_PMMarker_Error: result :=
          'Find a error when do compile to get the parameters''s name.';
        csTCompile_FMMarker_Error: result :=
          'Find a error when do compile to get the functions''s name.';
        csTCompile_Wording_Error: result := 'Wording error!';
        csTCompile_Bracket_Error: result := 'Wording error for the "( )" .';
        csTCompile_Optimize_Error: result :=
          'Find a error when do the compile optimize.';
        csTCompile_Define_Error: result :=
          'Get the error when compile then function, or overstep the define extent.';
        csTCompile_Handwriting_Error: result :=
          'The Function''s writeing format error.';
        csTCompile_FFHandwriting_Error: result :=
          'The integral function''s writeing format error.';
        csTCompile_ReadFloat_Error: result :=
          'Find a error when do compile to get the constant''s character.';
        csTCompile_ReadMarker_Error: result :=
          'Find a error when do compile to get the ing''s character.';
        csTCompile_Read_Error: result :=
          'Wording error,have characters did not define.';
        csTCompile_Note_Match_Error: result := 'Note match error!  { } or /*  */';
      else
        result := GetErrorEnglish(csTCompile_NoErrorCode);
      end;
    end;
      

  6.   

    function TCompile.GetErrorCode(): integer;
    begin
      result := ErrorCode;
    end;constructor TCompile.Create();
    begin
      inherited Create();
      //Enabled:=true;
      FEnabledNote := false;
      GetFunctionList();
      RndSeed[0] := 0; //随机函数初始种子值
      RndSeed[1] := 0;
      //保证 @RndSeed[0] 以后的4字节单元恒为零 使指令 FILD  qword ptr [E?X] 能按要求执行
    end;destructor TCompile.Destroy;
    begin
      inherited Destroy;
    end;function TCompile.SetText(const Value: string): boolean;
    begin
      //if not Enabled then
     // begin
     //   result:=true;
     //   exit;
     // end;
      try
        //application.MessageBox(pchar(inttostr(length(value))),'!');
        result := false;
        Clear();
        if Value <> '' then
          FExeText := Value
        else
          FExeText := '0.0';
        if not Compile() then
          exit;
        result := true;
      except
        result := false;
      end;
    end;function TCompile.GetText(): string; //获得当前编译的字符串
    begin
      result := FExeText;
    end;function TCompile.SetParameter(const PName: string; const dValue: Extended):
      boolean;
    var
      i: integer;
      sKey: string;
    begin
      //if not Enabled then
      //begin
      //  result:=true;
     //   exit;
      //end;
      try
        result := false;
        sKey := uppercase(PName);
        if sKey[1] <> '&' then
          sKey := '&' + sKey;
        for i := 0 to PParameterList - 1 do
        begin
          if uppercase(ParameterList[i].CName) = sKey then
          begin
            ParameterList[i].CAddress^ := dValue;
            result := true;
            exit;
          end;
        end;
      except
        result := false;
      end;
    end;procedure TCompile.SetParameter(const PAddress: PExtended; const dValue:
      Extended);
    begin
      //if not Enabled then exit;
      PAddress^ := dValue;
    end;function TCompile.GetParameterAddress(const PName: string): PExtended;
    var
      i: integer;
      sKey: string;
    begin
      try
        result := PExtended(0);
        sKey := uppercase(PName);
        if sKey[1] <> '&' then
          sKey := '&' + sKey;
        for i := 0 to PParameterList - 1 do
        begin
          if uppercase(ParameterList[i].CName) = sKey then
          begin
            result := ParameterList[i].CAddress;
            exit;
          end;
        end;
      except
        result := PExtended(0);
      end;
    end;function TCompile.GetParameterIndex(const PName: string): integer; //得到参数序号
    var
      i: integer;
      sKey: string;
    begin
      try
        result := -1;
        sKey := uppercase(PName);
        if sKey[1] <> '&' then
          sKey := '&' + sKey;
        for i := 0 to PParameterList - 1 do
        begin
          if uppercase(ParameterList[i].CName) = sKey then
          begin
            result := ParameterList[i].CIndex;
            exit;
          end;
        end;
      except
        result := -1;
      end;
    end;procedure TCompile.Clear();
    begin
      ErrorCode := 0;
      CompileInPFirst := 0;
      TF00 := '';
      T_ff_sys_ConstN := 0;  PExeAddressCode := 0; //(编译以后的执行码) 初始化
      setlength(ExeAddressCode, 1024);  PParameterList := 0; //(参数列表) 初始化
      setlength(ParameterList, 1024);  PExeParameter := 0; //(编译后 参数储存空间) 初始化
      setlength(ExeParameter, 1024);  PExeAddressList := 0; //(记录指针位置列表 积分) 初始化
      setlength(ExeAddressList, 1024);  PExeAddressPMList := 0; //(记录指针位置列表 参数存储地址) 初始化
      setlength(ExeAddressPMList, 1024);  PFunctionStack := 0; //(函数符号调用堆栈) 初始化
      setlength(FunctionStack, 1024);  T_PTrueNow.ifConst := false; //(编译优化常数时  参数性质堆栈) 初始化
      T_PTrueOld.ifConst := false;
      PT_PTrueNowList := 0;
      setlength(T_PTrueNowList, 1024);end;
      

  7.   

    procedure TCompile.ExeAddressCodeIn(const B: array of Byte);
    var
      i: integer;
    begin
      for i := low(b) to high(b) do
      begin
        ExeAddressCodeIn(b[i]);
      end;
    end;
    procedure TCompile.ExeAddressCodeIn(const sB: string);
    var
      i: integer;
      b: byte;
      function hextoint(const cB: char): byte;
      begin
        case upcase(cB) of
          '0'..'9':
            result := strtoint(cB);
          'A':
            result := 10;
          'B':
            result := 11;
          'C':
            result := 12;
          'D':
            result := 13;
          'E':
            result := 14;
          'F':
            result := 15;
        else
          begin
            //application.MessageBox('Compile Error!','Error:');
            ErrorCode := csTCompile_CompileHexCodeError;
            result := 0;
          end;
        end;
      end;
    begin
      if length(sb) mod 2 = 1 then
        //application.MessageBox('Compile Error!','Error:');
        ErrorCode := csTCompile_HexMod2_EQ_1_Error;
      for i := 1 to length(sB) div 2 do
      begin
        b := hextoint(sb[i * 2 - 1]) * 16 + hextoint(sb[i * 2]);
        ExeAddressCodeIn(b);
      end;
    end;
    procedure TCompile.GetExeAddressCodeInPointerRePm(const PMIndex: integer);
    begin
      if PExeAddressPMList >= high(ExeAddressPMList) - 1 then
      begin
        setlength(ExeAddressPMList, 2 * high(ExeAddressPMList) + 2);
      end;
      ExeAddressPMList[PExeAddressPMList].ExeIndex := PExeAddressCode;
      ExeAddressPMList[PExeAddressPMList].PMIndex := PMIndex;
      inc(PExeAddressPMList);
    end;
    function TCompile.GetExeAddressCodeInPointerReCode(): Pointer;
    begin
      if PExeAddressList >= high(ExeAddressList) - 1 then
      begin
        setlength(ExeAddressList, 2 * high(ExeAddressList) + 2);
      end;
      result := @ExeAddressCode[PExeAddressCode];
      ExeAddressList[PExeAddressList] := PExeAddressCode;
      inc(PExeAddressList);
    end;
    procedure TCompile.RefreshExeAddressCodeInPointer();
    var
      i: integer;
      pExe: pointer;
      iExe: integer;
    begin
      for i := 0 to PExeAddressList - 1 do
      begin
        pExe := @ExeAddressCode[ExeAddressList[i]];
        iExe := Cardinal(PExe) + 5;
        ExeAddressCode[ExeAddressList[i]] := $B8; //mov eax
        ExeAddressCode[ExeAddressList[i] + 1] := (byte(iExe mod 256));
        ExeAddressCode[ExeAddressList[i] + 2] := (byte((iExe div 256) mod 256));
        ExeAddressCode[ExeAddressList[i] + 3] := (byte((iExe div (256 * 256)) mod
          256));
        ExeAddressCode[ExeAddressList[i] + 4] := (byte((iExe div (256 * 256 * 256))
          mod 256)); //  mov   eax,iExe   //return Address
      end;
      for i := 0 to PExeAddressPMList - 1 do
      begin
        pExe := @ExeParameter[ExeAddressPMList[i].PMIndex];
        iExe := Cardinal(pExe);
        ExeAddressCode[ExeAddressPMList[i].ExeIndex] := (byte(iExe mod 256));
        ExeAddressCode[ExeAddressPMList[i].ExeIndex + 1] := (byte((iExe div 256) mod
          256));
        ExeAddressCode[ExeAddressPMList[i].ExeIndex + 2] := (byte((iExe div (256 *
          256)) mod 256));
        ExeAddressCode[ExeAddressPMList[i].ExeIndex + 3] := (byte((iExe div (256 *
          256 * 256)) mod 256)); //return Address
      end;
    end;function TCompile.GetExeCodeLength(): integer;
    begin
      result := PExeAddressCode;
    end;function TCompile.GetExeParameterLength(): integer;
    begin
      result := PParameterList * ExendedFormatLength;
    end;procedure TCompile.SetRandomize2(const RandomSeed: integer);
    begin
      RndSeed[0] := RandomSeed;
    end;