PDA

View Full Version : چرا این فانکشن در دلفی7 اجرا ولی در دلفی 2009 ارور میده



mehdi_naghoos
شنبه 14 فروردین 1389, 20:49 عصر
function HexToByteStr(Buf:Pointer; BufLen: integer): string;
var
i: integer;
defHex : string;
begin
defHex := '$PV'; i:=1;
SetLength(Result,BufLen);
while i<=BufLen do begin
while (Char(Buf^)<'0') or (Char(Buf^)>'f') do
if(Byte(Buf^)=0) then break else inc(Dword(Buf));
defHex[2] := Char(Buf^); inc(Dword(Buf));
defHex[3] := Char(Buf^); inc(Dword(Buf));
Byte(Result[i]) := StrToIntDef(defHex,0);
inc(i);
end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////
alim2201

vcldeveloper
شنبه 14 فروردین 1389, 22:54 عصر
چرا این فانکشن در دلفی7 اجرا ولی در دلفی 2009 ارور میده
بخاطر اینکه اندازه Char را یک بایت در نظر گرفته، در حالی که در دلفی 2009 اندازه Char دو بایت هست.

mehdi_naghoos
پنج شنبه 19 فروردین 1389, 13:34 عصر
میشه همین تابع را برام بنویسید که توی دلفی 2009 جواب بده من متوجه نشدم
تشکر

vcldeveloper
پنج شنبه 19 فروردین 1389, 17:54 عصر
میشه همین تابع را برام بنویسید که توی دلفی 2009 جواب بده من متوجه نشدم
این تابعتون کامل نیست، بعضی متغیرهای مثل Buf اصلا توی این کد تعریف نشدند.

mehdi_naghous
یک شنبه 23 آبان 1389, 17:21 عصر
یونیت کامل را گذاشتم میشه یه نگاهی بندازید char را هم به ansichar
و string هم به ansistring تبدیل کردم بازم مشکل حل نشد

Mahmood_M
یک شنبه 30 آبان 1389, 13:52 عصر
مشکل در خروجی تابع هست که باید به AnsiString تبدیل کنید :
unit HexUtils;

interface

uses
Windows,SysUtils;

...
function HexToByteStr(Buf:Pointer; BufLen: integer): ansistring;
...

implementation

...

function HexToByteStr(Buf:Pointer; BufLen: integer): ansistring;
var
i: integer;
defHex : string;
begin
defHex := '$PV'; i:=1;
SetLength(Result,BufLen);
while i<=BufLen do begin
while (Char(Buf^)<'0') or (Char(Buf^)>'f') do
if(Byte(Buf^)=0) then break else inc(Dword(Buf));
defHex[2] := Char(Buf^); inc(Dword(Buf));
defHex[3] := Char(Buf^); inc(Dword(Buf));
Byte(Result[i]) := StrToIntDef(defHex, 0);
inc(i);
end;
end;
در خط زیر :

Byte(Result[i]) := StrToIntDef(defHex, 0);
مقدار [Result[i باید یک Byte باشه درحالی که چون Result از نوع String هست ، هر حرف از اون از نوع Char و دو بایت هست ، پس [Result[i هم دو Byte میشه ...
در دلفی 2009 و 2010 که از Unicode پشتیبانی میشه Char معادل یک WideChar هست که دو بایته ولی در نسخه های قبلی Char معادل یک AnsiChar هست که یک بایته ، مشکل کد شما توی TypeCast با Byte هست که باید درونش یک بایت داده قرار داده بشه ، پس باید خروجی به صورت AnsiString تعریف بشه تا Result هم از نوع AnsiString باشه و مقدار [Result[i هم برابر با یک AnsiChar بشه تا در نهایت یک بایت داده به عنوان خروجی داشته باشید ...

با توجه به مطالبی که گفته شد ، اگر نتیجه ی دلخواه رو از تابع نگرفتید شاید مشکل در نحوه ی تعریف متغیر DefHex باشه که از نوع String تعریف شده ، با توجه به اینکه از کارکترهای اون در تابع استفاده میشه ...

موفق باشید ...