المشاركات : 378
المواضيع 44
:
: 6
الإنتساب : Feb 2008
20-02-2012, 12:02 AM
(آخر تعديل لهذه المشاركة: 20-02-2012, 12:13 AM بواسطة hanipino.)
[FONT="Arial Black"]الســــــــــلام عليكـــــــــم
اكتب كود بالدالفى لاستراج حجم [FONT="Fixedsys"]String بدون الاستعانة بالدالة [FONT="Comic Sans MS"]Length
بالتــــــــــــــــــــــــــوفيق .
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
وعليكم السلام ورحمة الله وبركاته
جرب بداية SizeOf مع توجيه IFDEF UNICODE يقسم الناتج على اثنين، فأعطتني حجم المؤشر
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 فما تتوقع؟
شكرا على التمرين
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
المشاركات : 378
المواضيع 44
:
: 6
الإنتساب : Feb 2008
نعم SizeOf تعطى حجم المتغير و ليس حجم القيمة التى يحتويها المتغير .
كود :
لكن لم أجربها على iOS فما تتوقع؟
مثلك اخى kachwahed لم اجربها .
- بالنسبة لطريقتك :
تعطى نتيجة صحيحة لاكنها كبيرة جدا سواء بالدالفى او بالاسمبلى (Disassembly)
يوجد ما احسن منها مثلا لا يتعدى كودها نصف سطر بالدالفى و حوالى 4 اوامر بالاسمبلى .
شكرا لك اخى kachwahed .
------------------------------
التمرين مفتوح لمحاولات اخرى .
المشاركات : 563
المواضيع 28
:
: 0
الإنتساب : Dec 2008
السلام عليكم
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;
بالتوفيق,,
المشاركات : 378
المواضيع 44
:
: 6
الإنتساب : Feb 2008
وعليكم السلام
اخى TF6M محاولة جيدة لكنها ناقصة ... لماذا ?
ماذا لو كان حجم String اكبر من ان يخزن فى 1 بايت فقط (اى حجمه اكبر من ان يخزن فى بايت فقط)
الدالة تقراء بايت واحد فقط من المكان الصحيح بالرغم من انك ذهبت للمكان الصحيح عن طريق طرح
4 بايت الا انك قراءت
1 فقط

.
المشاركات : 563
المواضيع 28
:
: 0
الإنتساب : Dec 2008
20-02-2012, 09:25 PM
(آخر تعديل لهذه المشاركة: 20-02-2012, 09:41 PM بواسطة TF6M.)
hanipino كتب :وعليكم السلام
ماذا لو كان حجم String اكبر من ان يخزن فى 1 بايت فقط (اى حجمه اكبر من ان يخزن فى بايت فقط)
1- أولا طول القيمة النصية و ليس حجم لأن هناك
فرق .
2- الطول المدروس بين 256 محرف و 65535 لاحظ التويجه
IFDEF UNICODE
3-" بالرغم من انك ذهبت للمكان الصحيح

"
هنا
4- "الا انك قراءت
1 فقط" حسب الحاجة byte / word .... فقط للتقليل من حجم الداكرة المخصص
بارك الله فيك + في إنتطار البقية بالتوفيق,,
المشاركات : 378
المواضيع 44
:
: 6
الإنتساب : Feb 2008
كود :
2- الطول المدروس بين 256 محرف و 65535 لاحظ التويجه IFDEF UNICODE
لم افهمك انا استعمل دالفى 2007 دائما شرط UNICODE غير محقق و حتى ان تحقق فان المتغير PL سياخد عنوان قبل السلسلة النصية ب 2 بايت و ان لم يتحقق سياخد عنوان قبل السلسلة النصية ب 4 بايت
والنتيجة دائما قرائة 1 بايت من عنوان المتغير PL ... ???
كود :
حسب الحاجة byte / word .... فقط للتقليل من حجم الداكرة المخصص
كيف ذالك حسب الحاجة الدالة مخصصة للاتيان ب طول السلسة النصية و قيمة هذه الاخيرة يخزن فى 4 بايت ... كيف تقراء حسب الحاجة byte / word ... (لا بل DWORD او INTEGER ... )
مثلا طول سلسلة نصية 130000 محرف هل الدالة تعيد النتيجة صحيحة .
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
المشاركات : 84
المواضيع 6
:
: 0
الإنتساب : Aug 2009
لماذا طرحت 2 من المؤشر pl
هل في هذا العنوان يخزن طول السلسلة ؟
المشاركات : 628
المواضيع 72
:
: 211
الإنتساب : Jun 2010
السلام عليكم
تفضل محاولتي:
كود :
procedure TForm1.Button1Click(Sender: TObject);
var L: ShortString;
begin
L := 'delphi4arab delphi4arab delphi4arab delphi4arab';
ShowMessage(IntToStr([color=Red]Ord(L[0][/color])));
end;
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي