الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المعجزات او الاخطاء التي

مغلق
بدأه romanof في 19 نوفمبر 2005 · 9 رد · 4,193 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

المقال مترجم من الروسية

http://www.citforum.ru/programming/delphi/miracles/

الكاتب : Максим Кузьминский

ماكسيم كوزمينسكي

هل تؤمن بالمعجزات ؟ انا ابضا اؤمن بالمعجزات ..بالتاكيد كل منا سيسلم ان شيئا من هذا القبيل يحدث مع اكواد برماجنا بل واحيانا يرفض البرنامج عملcompile له !؟ او ان البرنامج يظهر نتائج غيرمتوقعة..وهنا تراودك افكار عن مشاركة قوى خفيه في صنع هذه المعجزات

في هذا المقال سوف نتطرق الى 7 (من العديد ) من تلك المعجزات وسوف نحاول ان نزيل الغطاء السحري ونتاكد ان هذا ما هو الا خدعة...( Illusion) وهم ..

(Round Miracle) معجزة التقريب

انشي مشروعا جديدا سمه مثلا AllMiracles ضع مكونا من النوع button على الفورم.. الان بالضغط مرتين على الزر اكتب ماياتي

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( IntToStr( Round(3.5) - Round(2.5) ) );
end;

توقف قليلا وقل لي ما هي النتيجة المتوقعة ؟؟اتمنى ان لا تكون اجابتك بواحد والا لم تكن معجزة ..واذا كان حدسك ممتازا فستكون اجابتك 0 وهذا ابعد عن الحقيقة مقارنة عن ذي قبل واذا كنت مقامرا جيدا وتقرا الهلب جيدا فكنت ستجيب بالرقم 2!!

لاتصدق.. تضغط F9

هل تعرف لماذا؟؟؟

لو كنت قرات الهلب جيدا فانظر مالمكتوب عن الداله (التابع) Round :

Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number.

هل عرفت السبب !!! :P

الان اتمنى ان تملك تصورا عن ما اتحدث عنه اليوم ... في هذا المقال لايوجد ما صعب تعمدنا تبسيط الكود حتى تتضح المشكلة

(Absolute Miracle)

الان اضف زرا اخر الى الفورم .. الان بالضغط مرتين على الزر اكتب ماياتي

procedure TForm1.Button2Click(Sender: TObject);
var
i1: int64;
begin
  i1:= abs(low(integer));
  ShowMessage(IntToStr(i1));
end;

قبل ان تقوم بالضغط على F9 سنقوم بتحليل الموقف

من المعروف ان Low مع ال integer تعطي القيمة -2147483648 (انظر الهلب) كما ان الهلب لا تعطي معلومة جديدة عن الabs

Abs returns the absolute value of the argument X. X is an integer-type or real-type expression

المتغير i1 عبارة عن int64 ..طبعا هذا صحيح لان 2147483648 تخرج عن حدود الinteger وهذه القيمة هي القيمة التي ننتظرها اليس كذلك . اضغط F9 وتاكد !!! ماذا ..غير معقول ان تعيد الداله abs عددا سالبا ..فكيف حدث ذلك...

تعالوا نتامل الموضوع مره اخري سوف نرى العباره abs(low(integer)) .ماذا نستطيع ان نقول عن هذه العبارة رغم استدعاء دوال في هذه العبارة الا انها في الحقيقة قيمة ثابته

ماذا يقول الهلب الثوابت Constant expressions :

...Constant expressions cannot include variables, pointers, or function calls, except calls to the following predefined functions: Abs...Low...

سوف نعرف ثابتا لهذه الطريقة :

const
ci = abs(low(integer));
...

هل تمكنت من تشغيل برنامج يحتوي على هذه العبارة ؟؟ على ماذا يدل هذا؟ على انها قيمة ثابته ؟ من كان يصدق هذا!!

ولكن لم لا تعطينا العبارة abs(low(integer)) عددا سالبا وكيف السبيل لفعل العكس

انظر المثال التالي

procedure TForm1.Button3Click(Sender: TObject);
const
ci = abs(low(integer));
var
i1: int64;
begin
i1:= abs(int64(low(integer)));
ShowMessage(IntToStr(i1));
end;

جرب هل رايت ؟ حصلنا على العكس وعرفنا السر ! :P

معناها ان العدد abs(low(integer)) خارج نطاق integer ويدخل نطاق int64

يالمناسبه ايضا العبارة abs(int64(low(integer))); تعتبر قيمة ثابته .

(One more low integer miracle).

جرب هذا الكود

procedure TfrmAllMiracles.btnLowIntMrclClick( Sender: TObject);
var
lowInt: integer;
begin
lowInt := -2147483648;
ShowMessageFmt('%d',[lowInt]);
end;

مالمشكلة اجراء عادي جدا والقيمة قانونيه جدا؟؟ ومع ذلك لا نستطيع اجراء compile بحجة ان

Overflow in conversion or arithmetic operation

اضغط على F1 ماذا تلاحظ

The compiler has detected an overflow in an arithmetic expression: the result of the expression is too large to be represented in 32 bits

كيف overflow اذا كانت القيمة قانونية ؟ اذا لابد ان المترجم يقوم بانشاء قيمة موجبة ةعد ذلك يضربها في -1 :P

لكن كيف الخروج من هذه المحنه انظر الكود:

procedure TForm1.Button4Click(Sender: TObject);
var
lowInt: integer;
begin
lowInt := -int64(2147483648);
ShowMessageFmt('%d',[lowInt]);
end;

ربما كان المثال ساذجا لكنه يعطي تصورا حقيقيا لما يفعلة مترجم الدلفي لانشاء الثوابت ومنح القيم !

التالي

(String Trick)

سيدي العزيز انظر الى هذا المثال طبعا اضف زر الى الفورم بالضغط مرتين على هذا الزر

واكتب ماياتي

procedure TfrmAllMiracles.btnCopyMrclClick (Sender: TObject);
const
cs: array[0..1] of char='01';
begin
ShowMessage(copy(cs,0,1)+copy(cs,1,1));
end;

ما هي الاجابه بالنظر الى الكود السابق؟

هه خطا طبعا . الاجابه هي "00" هل تعرف لماذا عد الى الهلب وانظر الى الى تعريف ال copy

function Copy(S; Index, Count: Integer): string;
function Copy(S; Index, Count: Integer): array;

اعتقد ان الامر مفهوم الان...

في المره الاولي تم استدعاء copy لمعالجة (arry)مصفوفه ديناميكة تبدا بالعنصر ذو العنوان صفر!

في المراة الثانية تم استدعاء الداله وكانها string يبدا من العنصر ذو العنوان صفر!

(Is-Miracle)

اكتب في الجزء protected من الفورم الحقل FControl من النوع TControl

والان ضع في على الفورم زرا جديدا وفي الحدث onClick اكتب الكود

procedure TfrmAllMiracles.btnIsMrclClick(Sender: TObject);
begin
if (FControl is TControl) then
begin
if not Assigned(FControl) then
FControl := TControl.Create(Self);
end
else
ShowMessage('Not a Control');
end;

قم بعمل لاحظ انك مهما قمت بعمل compile فانك لن ترى غير الرساله 'Not a Control' والباني للصنف TControl

لن يستدعى ابدا!!

ماذا يقول الهلب لنا في هذا الامر

The expression object is class returns True if object is an instance of the class denoted by class or one of its descendants, and False otherwise. (If object is nil, the result is False.)

هل فهمت سر الموضوع ؟ الير يكمن في كون is كانت تتعامل مع متغير في الحقيقة لم يخصص لها اي ذاكرة يعني في الحقيقة ما هي الا مؤشر لا يشير الى شيء (null )

انوه الى كون اختيار الصنف Tcontrol كان اختياريا كان من الممكن ام يحصل نفس الشي مع اي صنف اخر سوف نرى شيئا مشابها في المثال القادم

(Is-Miracle II)

كون مكتبه dll وسمها يالاسم AllMirrLib

library AllMirrLib;
uses
Controls;

function IsControlLib(const anObj: TObject): boolean;
begin
Result := anObj is TControl;
end;

exports
IsControlLib;
end;

قم بعمل نفس الخطوات في المثال الماضي مع الحقل FControl ثم اضف مكون Button وفي الحدث onClick واكتب الاتي

procedure TForm1.Button2Click(Sender: TObject);
begin
    FControl := TControl.Create(nil);
     try
      if not IsControlLib(FControl) then
        ShowMessage('Not a Control');
      finally
        FreeAndNil(FControl);
    end;
end;

اضغط F9 ؟

ظهور الرساله مرة اخري ؟؟ معني هذا ان FControl =Null رغم اننا استدعينا الباني قبلا فما المشكلة اذن

سوف نعدل الكود في مكتية الdll الى الكود التالي

function IsControlLib(const anObj: TObject): boolean;
var p3,p4: pointer;
begin

   p3 := pointer(anObj.ClassType);
   p4 := pointer(TControl);
   Result := (p3=p4);
end;

لا تنسى ان تعمل Build لمكتبة الdll ثم عد الى البرنامج الاصلي

بينما في برنا مجنا الاصلي نعدل كالاتي في الحدث onClick من الزر اكتب

procedure TForm1.Button1Click(Sender: TObject);
var
p1, p2: pointer;
begin
    FControl := TControl.Create(nil);
    try
    p1 := pointer(FControl.ClassType);
    p2 := pointer(TControl);
        if (p1=p2)then showmessage('yes')
         else showmessage('No');
        if  IsControlLib(FControl) then
          ShowMessage('yes dll')
          else  ShowMessage('No dll')
          finally
        FreeAndNil(FControl);
    end;
end;

قم بالتشغيل والان اضغط الزر ماذا تلاحظ p1, p2 متساويان في البرنامج لذلك ترى الرساله yes

بينما ظهور ال NO dll في الرساله الثانية يدل على عدم تساوي هاتين القيمتين في Dll !!!

رغم انهما يشيران الى نفس الشي اين ترى اشارة الى هذا الشي في الهلب ؟؟

Use ClassNameIs when writing conditional code based on an object's type or to query objects across modules, or DLLs.

هذا في الحديث عن المنهج (method ) ClassNameIs

واضح انه في الdll نوعان من الTcontrol !!

***************

(Variant trick)

ماذا يقول الهلب عن Variants in expressions

...In a binary operation, if only one operand is a variant, the other is converted to a variant..

لايبدوا هذا مثير انك تستطيع ان تجمع كل شي مع ال variant ناتج الجاع يكون variant دائما

اتظر الى هذا الكود

procedure TForm1.Button3Click(Sender: TObject);
var
v: variant;
b: boolean;
i: integer;
s: string;
d: TDatetime;
x: Double;
begin
    v:=0;
    b := true;
    i := 2;
    s := '3';
    d := StrToDateTime('01.01.01');
    x := 5;
    v := v+i+s+d+x+b;
    ShowMessage(VarToStr(v));
end;

كيف ممكن ان تجمع كل هذه الاشياء ؟

الاغرب ان هذه الكود لا يكتفي بالعمل وبل يعطي ناتجا ايضا :P

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#2

السلام عليكم

موضوع ممتاز .

أتذكر اني دائما عندما اكتب " يرجى الرجوع الى delphi help اولا " قبل وضع اي سؤال وقراءته بتمعن أرى من المشاركين في الموضوع إما "تطنيش" أو "كلام قاسي" وإني شخص فاضي وأن وقتهم ثمين وبدهم مثال جاهز ...

أتذكر أني قبل فتره كتبت في قسم الفيجوال بيسك في موضوع عن احدى الدوال أنه يرجى الرجوع الى MSDN Help وقراءة كل كلمة كتبت هناك لأن MS رغم الشرح الموجز فانها تضع شرح دقيق جدا ورائع , لكن لا حياة لمن تنادي ...

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

ألاحظ أن مواضيع قسم الدلفي نائمة هالأيام ...

تم تعديل هذه المشاركة بواسطة cipher في 20 نوفمبر 2005 في 06:53

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#3

لاحياء الموضوع.

ما رأيك اخ romanof بوضع أمثلة لمشاكل مشابهه واجهتنا وكيف تم التغلب عليها ؟..

هنا سأضع كود يتبعه سؤال و أنتظر ممن له اهتمام الاجابة على السؤال ...

قبل سنتين أثناء استخدامي لإحدى دوال النظام من النوع Native API واجهتني مشكله فقمت بعمل هذاالمثال لأحل المشكله بعيد عن الأخطاء التي قد تنجم عن دالة النظام ..

_MyType=record
 a1,a2,a3:word;
end;
TMyType=_MyType;
PMyType=^TMyType;
....

function setvl(tr:PMyType;x:integer):PWord;
begin
try
 tr.a1:=(x*x)+(2*x)+3;
 tr.a2:=(4*x*x)+(3*x)+2;
 tr.a3:=(3*x*x)+(4*x)+5;
 result:=PWORD(tr);
except
 result:=nil;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
p1:PWORD;
tr:TMyType;
i:integer;
begin
  p1:=setvl(@tr,2);
  if p1<> nil then
 // هنا نضع الحل

end;

نريد باستخدام المؤشر p1 من النوع pword الحصول على قيم a1,a2,a3 التابعة لـ tr ...

يفضل الإعتماد فقط على دلفي والمعلومات الشخصية (ممنوع الغش) ...

تم تعديل هذه المشاركة بواسطة cipher في 20 نوفمبر 2005 في 12:40

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#4

تفضل اخي

.   .    .

 if p1<> nil then
  begin
   label1.Caption:='a1= '+(IntToStr(PMyType(p1)^.a1));
   label2.Caption:='a2= '+(IntToStr(PMyType(p1)^.a2));
   label3.Caption:='a3= '+(IntToStr(PMyType(p1)^.a3));
  end;

B) B)

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#5

حلوة

هي فعلاً طريقتك هنا هي الصحيحة . طبعاً في المشكلة التي واجهتني حينها لم يكن بالامكان استخدام هذه الطريقة

سأضيف شرط هو أن تكون قيمة p1^ بعد الحصول على جميع القيم هي قيمة a3 ..

غرضي من السؤال كيفية استخدام المؤشرات للتنقل داخل الـ record كما هو في مثالنا هنا أو داخل data ...

يعني ما بدي

اقتباس
p1^:=tr.a3

إن لم يكن مفهوما القصد فسأحاول أعمل مثال للغرض المقصود ..

تم تعديل هذه المشاركة بواسطة cipher في 21 نوفمبر 2005 في 12:50

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#6

لتوضيح أكثر

عند إستخدام المؤشرات في لغة السي بامكاننا عمل ما يلي

Anytype *p;
int x;
...
p=p+x;
...

حيث قيمة x نحددها بحيث تعود علينا بفائدة ما ..

كيف نقوم بذلك في دلفي ؟

تم تعديل هذه المشاركة بواسطة cipher في 21 نوفمبر 2005 في 17:04

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#7
procedure TForm1.Button1Click(Sender: TObject);
 var
p1,p3:PWORD;
tr:TMyType;
P2:^Pword;
i:integer;
begin
 p1:=setvl(@tr,2);
 p3:=nil;
 if p1<> nil then
  begin
   p2:=@p1;
   inc(P2^,2);
  end;
  ShowMessage('Show p1  '+IntToStr(P1^));
end;

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#8

سأضع مثال آخر لأني احتاج لمعرفة ما هي طريقة كل منا في تحويل الكود الآتي من لغة C الى دلفي مع وجود شرط

غرضي هو معرفة طريقة أفضل من التي أستخدمها حالياً

int arr[3];
int* getval()
{
	int i;
	for (i=0;i<3;i++)
  arr=i*i+2*i+4;
	return arr;
}
int main()
{

   int *p,i;
   p=getval();
   for (i=0;i<3;i++)
                  printf("%d\n",*p);
   getch();
   return 0;
}

نلاحظ أنه للحصول على قيم المصفوفة استخدمنا

*p

وفي الآخير تضل قيمة p هي عنوان المصفوفة arr أي لا تتغير

كان بامكاننا استخدام

*p++;

وفي هذه الحالة ستتغير قيمة p وسنضطر لتعريف متغير يحفظ أول قيمة لـ p وهذا ما لا نريده

منتظر أشوف حلول أخرى (احتاج ذلك في عملية تحويل كود من سي الى دلفي سأضعه قريباً)..

تم تعديل هذه المشاركة بواسطة cipher في 22 نوفمبر 2005 في 09:30

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#9

موضوع جميل أخي Romanof

أخي Cipher

مثالك الأخير بطريقة *p++

var
arr: array [1..3] of Word;

function getval:PWord;
var i: Word;
begin
   for i:=1 to 3 do
    arr:=i*i+2*i+4;
 Result:=@arr;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p : PWord;
  i : Word;
begin
  p:=getval;
  for i:=1 to 3 Do Begin
   ShowMessage( inttostr(P^) );
   inc(p);
  end;
  Dec(p,3); // rturn to original
end;

يكفي dec(p,3) للحصول على القيمة الأولى

لكن أظن لا تريد مثل هذا الحل

d4baa0.gif
#10

السلام عليكم

هي فعلاً ليست تلك الطريقة التي أريدها

الطريقة التي أستخدمتها هي :

var
arr: array [0..2] of Word;

function getval:PWord;
var i: Word;
begin
  for i:=0 to 2 do
   arr:=i*i+2*i+4;
Result:=@arr;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 p : PWord;
 i : Word;
begin
 p:=getval;
 for i:=0 to 2 Do Begin
  ShowMessage( inttostr(PWORD(ULONG(P)+i*sizeof(WORD))^ ) );
 end;
end;

اهم جزء في الكود هو

PWORD(ULONG(P)+i*sizeof(WORD))^

طبعا استخدام ULONG في الكود السابق له سبب ...

لا أعلم ان كان هناك طريقة أخرى ..

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

هذا الموضوع مغلق.

مواضيع مشابهة