مشكل Division by zero في delph xe 5 android
#1
السلام عليكم عندي استفسار

طبقت هذا الكود في Delphi XE وعمل بنجاح
واعدت تطبيقه في Delphi XE Android ثم جربته في الهاتف تخرج لي الرسالة
Division by zero

كود :
function CalculateCode(LicenseName: string): string; var i, Code: integer; CodeStr: string; Num: Int64; FSeed: Int64; FRegCodeSize: integer; begin FSeed := 3210; FRegCodeSize := 13; // You can modify this algorithm if you want to... if (Length(LicenseName) > 21) or (Length(LicenseName) < 4) then begin Result := ''; // LicenseName did not fit length requirements Exit; end; i := Length(LicenseName); // Takes the last 6 characters (going backwards), converting each // character to ASCII and taking the remainder of dividing it into Seed while (i >= Length(LicenseName) - 8) and (i > 0) do begin CodeStr := CodeStr + IntToStr(FSeed mod Ord(LicenseName[i])); Dec(i); end; Val(CodeStr, Num, Code); if FRegCodeSize <= 0 then Result := IntToHex(Num, 0) else begin Result := IntToHex(Num, FRegCodeSize); Delete(Result, FRegCodeSize + 1, Length(Result) - FRegCodeSize); end; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := CalculateCode(Edit1.Text); end;
الرد
#2
المشكلة أن كومبايلر أندرويد يستخدم Zero based string : بمعنى الترقيم يبدأ من الصفر و ليس الواحد !!
يمكن تعطيله باستخدام التوجيه :

PHP كود :
{$ZEROBASEDSTRINGS OFF} 

لكن كحل مثالي و آمن أنصحك أن لا تقوم بتعطيله لأن ال RTL الخاصة بالأندرويد تعمل بنفس المبدأ Zero Based ..
هذا حل يلبي احتياجك :

PHP كود :
{$IF CompilerVersion >=26}
   {
$IFDEF MSWINDOWS}
      {
$ZEROBASEDSTRINGS ON}
      {
$DEFINE ZeroBasedStrOn}
   {
$ENDIF}
{
$IFEND}

function 
CalculateCode(LicenseName: string): string;
var
  
i, Code: integer;
  
CodeStr: string;
  
Num: Int64;
  
FSeed: Int64;
  
FRegCodeSize: integer;
begin
  FSeed 
:= 3210;
  
FRegCodeSize := 13;
  
// You can modify this algorithm if you want to...
  
if (Length(LicenseName) > 21) or (Length(LicenseName) < 4) then
  begin
    Result 
:= ''; // LicenseName did not fit length requirements
    
Exit;
  
end;
  
i := Length(LicenseName){$IFDEF ZeroBasedStrOn} - 1{$ENDIF};
  
// Takes the last 6 characters (going backwards), converting each
  // character to ASCII and taking the remainder of dividing it into Seed
  
while {$IFDEF ZeroBasedStrOn} (i >= Length(LicenseName) - 1 - 8) and (i >= 0)
{
$ELSE}
    (
i >= Length(LicenseName) - 8) and (i > 0)
{
$ENDIF}
    do
  
begin
    CodeStr 
:= CodeStr + IntToStr(FSeed mod Ord(LicenseName[i]));
    
Dec(i);
  
end;
  
Val(CodeStr, Num, Code);
  if 
FRegCodeSize <= 0 then
    Result 
:= IntToHex(Num, 0)
  else
  
begin
    Result 
:= IntToHex(Num, FRegCodeSize);
    
Delete(Result, FRegCodeSize + 1, Length(Result) - FRegCodeSize);
  
end;
end; 
Open Your Source .. Open Your Mind
الرد
#3
نفس المشكلة
الرد
#4
اعتذر .. غير :
PHP كود :
{$IF CompilerVersion >=26} 
   {
$IFDEF MSWINDOWS} 
      {
$ZEROBASEDSTRINGS ON} 
      {
$DEFINE ZeroBasedStrOn} 
   {
$ENDIF} 
{
$IFEND} 
الى :
PHP كود :
{$IF CompilerVersion >=26}// Delphi XE5 
   
{$ZEROBASEDSTRINGS ON} 
   {
$DEFINE ZeroBasedStrOn} 
{
$IFEND} 
Open Your Source .. Open Your Mind
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم