[تمرين] استخراج حجم String بدون استعمال الدالة Length
#11
1- "لم افهمك انا استعمل دالفى 2007 دائما شرط UNICODE...." أ تكلم على إصدار 2009 و ما يليه

2- كل الفكرة هي معرفة بنية الـ Data Type , كما أشرت سابقا طول السلسة المحرفية يخزن في
الخانة 0 قبل بداية السلسلة , لاحظ مثال الأخ : هنا

3- "لماذا طرحت 2 من المؤشر pl " , نفس الفكرة 2
المؤشر عوض التأشير على بداية المحارف نرجع مرتين أو 4 (Ascii or unicode) لقراءة محتوى الخانة 0

4- "كيف ذالك حسب الحاجة الدالة مخصصة للاتيان ب طول السلسة النصية ...."
لن أستخدم هده الدالة لحساب طول من فئة 10 و 20 فكر Smile أهم شئ في كتابة الكود هي كيفية
إستعماله بطريقة مثلا .

5- " مثلا طول سلسلة نصية 130000 محرف هل الدالة تعيد النتيجة صحيحة . " هنا نحتاج قالب للقيمة
و ليس إعادة كتابة فكرة أخرى , Dword / Big Int .... ect
الفكرة بسيطة Smile.
[url=http://www.delphi4arab.net/forum/showpost.php?p=33021&postcount=10][/url]
I'M Fly Like A G6

الرد
#12
الاخ louay محاولتك صحيحة لاكن مع ShortString
Maximum length = 255 characters

و بالتالى يمكن تخزين طول هذه السلسلة فى 1 بايت فقط و موقع هذا الاخير قبل بداية السلسة الحرفية تماما . عكس String المطلوب فى التمرين .

------------------------
كود :
- كل الفكرة هي معرفة بنية الـ Data Type , كما أشرت سابقا طول السلسة المحرفية يخزن في الخانة 0 قبل بداية السلسلة , لاحظ مثال الأخ : هنا
صحيح مع ShortString
PHP كود :
SizeOf(ShortString) = 256 Byte
  255  Byte 
for ShortString (characters string[255])
  
001  Byte for             (save length           ) 

كود :
- "كيف ذالك حسب الحاجة الدالة مخصصة للاتيان ب طول السلسة النصية ...." لن أستخدم هده الدالة لحساب طول من فئة 10 و 20 فكر [COLOR="Red"]أهم شئ في كتابة الكود هي كيفية إستعماله بطريقة مثلا .[/COLOR]

انا فى الحقيقة اخطاءت فى صياغة التمرين كان قصدى بعدم استعمال اى دالة بل بالاعتماد على المؤشرات
الطريقة موجودة فى هذا الموضوع ... وهى التى اردت استعمالها فى الحل Smile ... .
الرد
#13
وعليكم السلام ورحمة الله وبركاته

هده محاولتي ...بعيدا عن المؤشرات و الأسمبلي Big Grin

PHP كود :
function LengthOfSTR(S: string): Byte;
var
  
i: Byte;
begin
  i 
:= 1;
  while 
S[i] <> #0 do
    
inc(i);

  
Dec(i);
  
Result := i;
end;

procedure TForm1.FormCreate(Sender: TObject);
var 
s: string;
begin
  s 
:= 'Delphi4Arab';
  
ShowMessage(IntToStr(LengthOfSTR(s)));
end; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#14
تعديل

PHP كود :
function LengthOfSTR(S: string): Byte;
var
  
i: Byte;
begin
  
if S = '' then
  begin
    Result 
:= 0;
    Exit;
  
end;
  
i := 1;
  while 
S[i] <> #0 do
    
inc(i);

  
Dec(i);
  
Result := i;
end; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#15
محاولتي


PHP كود :
function strlen(str:string):LongInt ;
begin
  Result 
:= 0;
  while 
str[Result+1] <> '' do
  
begin
    Inc
(Result);
  
end;
end; 
الرد
#16
me&delphi و phpbb3
كلا المحاولتين صحيحة و تعتمد على (حتمية انتهاء السلسلة النصية ب بايت صفرى #0) + و كلاهما ايضا يعتمد على حلقة و بالتالى كلما طالت السلسلة النصية ازداد عدد الحلقات
(يوجد طريقة احسن)
شكرا لكم .
الرد
#17
إقتباس :كلما طالت السلسلة النصية ازداد عدد الحلقات

كما تعلم أخي hanipino طول محارف string لا يتعدى 255 لهدا فالحلقة لن تكون طويلة

...أحسن من دلك ...السرعة انها asm ...هدا مثال

PHP كود :
function LenOfStr(s: string): Byte;
asm
   TEST EAX
, EAX
   JZ 
@Fin
   SUB EAX
, 4
   MOV EAX
, [EAX]
   @
Fin:
   
RET
end
; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#18
كود :
كما تعلم أخي hanipino طول محارف string لا يتعدى 255 لهدا فالحلقة لن تكون طويلة

1 -
لست معك طول سلسلة نصية string يتعدى بكثير 255 محرف بل يصل الى(High(Integer اى ما يعادل 2GB
حوالى 2 مليار بايت (حرف .. دون UNICODE) اما 255 محرف فهى تخص ShortString وليس string

2 -
فيما يخص الدالة بالاسمبلى ... جيدة ... وهذه احسن منها لانها اصغير منها ب 4 بايت .
PHP كود :
function GetStrLen(S: string): Integer;
asm
   TEST EAX
, EAX
   JZ 
@Ret
   mov eax 
, [eax-$04]
  @
Ret:
end; 

شكرا لك اخى me&delphi
الرد
#19
إقتباس :يتعدى بكثير 255

هل نستطيع أن نعلن عن متغير

PHP كود :
var S:String[255]; 

هكدا

PHP كود :
var S:String[256]; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#20
إقتباس :هل نستطيع أن نعلن عن متغير
var S:String[256];

لا نستطيع (لها اسبابها لا ادرى)
... لاكن هذا لا يعنى انه String لا يستطيع حمل اكثر من 255 محرف ... قم بتجربة صغيرة على String ... .

عندما نقول
var S: String
هذا لا يساوى
إقتباس :var S:String[256];

----------------------
لو كان String لا يتعدى 255 محرف اى طول السلسلة لا يخزن فى اكثر من واحد بايت ... لاكن عندما ننقح الدالة length نرى انه تمت قراءت 4 بايت للاتيان بطول السلسلة و ليس قراءت 1 بايت ... .

إقتباس : SUB EAX, 4
MOV [COLOR="Red"]EAX, [EAX][/COLOR]
@Fin:
الرد


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


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