[تمرين] استخراج حجم String بدون استعمال الدالة Length
#1
[FONT="Arial Black"]الســــــــــلام عليكـــــــــم

اكتب كود بالدالفى لاستراج حجم [FONT="Fixedsys"]String بدون الاستعانة بالدالة [FONT="Comic Sans MS"]Length

بالتــــــــــــــــــــــــــوفيق .
الرد
#2
وعليكم السلام ورحمة الله وبركاته
جرب بداية SizeOf مع توجيه IFDEF UNICODE يقسم الناتج على اثنين، فأعطتني حجم المؤشر Sad 4 byte
هذه باستخدام VCL وأحداث ويندوز WM_GETTEXTLENGTH...
PHP كود :
function GetStrLength(S: string): Integer;
var
  
c: TControl;
begin
  c 
:= TControl.Create(nil);
  
c.SetTextBuf(pChar(S));
  
Result := c.GetTextLen;
  
c.Free;
end; 
لكن لم أجربها على iOS فما تتوقع؟
شكرا على التمرين Smile
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#3
نعم SizeOf تعطى حجم المتغير و ليس حجم القيمة التى يحتويها المتغير .
كود :
لكن لم أجربها على iOS فما تتوقع؟
مثلك اخى kachwahed لم اجربها .


- بالنسبة لطريقتك :
تعطى نتيجة صحيحة لاكنها كبيرة جدا سواء بالدالفى او بالاسمبلى (Disassembly)

يوجد ما احسن منها مثلا لا يتعدى كودها نصف سطر بالدالفى و حوالى 4 اوامر بالاسمبلى . Smile

شكرا لك اخى kachwahed .

------------------------------
التمرين مفتوح لمحاولات اخرى .
الرد
#4
السلام عليكم Smile
PHP كود :
Function GetStringLength (TrgStr: String): Byte;
{
$IF CompilerVersion >= 17}Inline;{$IFEND}
Var
 
PL: PCHAR;
Begin
 PL 
:= Pointer(TrgStr);
 {
$IFDEF Unicode}
  
Dec(PL,2);
 {
$ELSE}
  
Dec(PL,4);
 {
$ENDIF}
 
Result:=Byte(PL^);
End; 

بالتوفيق,,
I'M Fly Like A G6

الرد
#5
وعليكم السلام

اخى TF6M محاولة جيدة لكنها ناقصة ... لماذا ?
ماذا لو كان حجم String اكبر من ان يخزن فى 1 بايت فقط (اى حجمه اكبر من ان يخزن فى بايت فقط)
الدالة تقراء بايت واحد فقط من المكان الصحيح بالرغم من انك ذهبت للمكان الصحيح عن طريق طرح 4 بايت الا انك قراءت 1 فقط Smile .
الرد
#6
hanipino كتب :وعليكم السلام

ماذا لو كان حجم String اكبر من ان يخزن فى 1 بايت فقط (اى حجمه اكبر من ان يخزن فى بايت فقط)
1- أولا طول القيمة النصية و ليس حجم لأن هناك فرق .
2- الطول المدروس بين 256 محرف و 65535 لاحظ التويجه IFDEF UNICODE
3-"
بالرغم من انك ذهبت للمكان الصحيحSmile" هنا
4- "الا انك قراءت 1 فقط" حسب الحاجة byte / word .... فقط للتقليل من حجم الداكرة المخصص
بارك الله فيك + في إنتطار البقية بالتوفيق,,
I'M Fly Like A G6

الرد
#7
كود :
2- الطول المدروس بين 256 محرف و 65535 لاحظ التويجه IFDEF UNICODE

لم افهمك انا استعمل دالفى 2007 دائما شرط UNICODE غير محقق و حتى ان تحقق فان المتغير PL سياخد عنوان قبل السلسلة النصية ب 2 بايت و ان لم يتحقق سياخد عنوان قبل السلسلة النصية ب 4 بايت

والنتيجة دائما قرائة 1 بايت من عنوان المتغير PL ... ???


كود :
حسب الحاجة byte / word .... فقط للتقليل من حجم الداكرة المخصص

كيف ذالك حسب الحاجة الدالة مخصصة للاتيان ب طول السلسة النصية و قيمة هذه الاخيرة يخزن فى 4 بايت ... كيف تقراء حسب الحاجة byte / word ... (لا بل DWORD او INTEGER ... )

مثلا طول سلسلة نصية 130000 محرف هل الدالة تعيد النتيجة صحيحة .
الرد
#8
أثناء أحد المحاولات الفاشلة حصلت على هذه Smile
[صورة: attachment.php?attachmentid=3264&stc=1&d=1329774158]
ثم تمكنت منها في سطرين... بالغش Smile


الملفات المرفقة
.jpg   FalseP.jpg (الحجم : 17.2 ك ب / التحميلات : 257)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#9
لماذا طرحت 2 من المؤشر pl
هل في هذا العنوان يخزن طول السلسلة ؟
الرد
#10
السلام عليكم

تفضل محاولتي:

كود :
procedure TForm1.Button1Click(Sender: TObject); var L: ShortString; begin L := 'delphi4arab delphi4arab delphi4arab delphi4arab'; ShowMessage(IntToStr([color=Red]Ord(L[0][/color]))); end;
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد


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


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