بسم الله الرحمن الرحيم
نعيد ذكر تعريف البايت والإشارات :
بلغة باسكال:
Type
Byte = 0..255;
SignedByte = -128..127;
Ptr = ^SignedByte;
Handle = ^Ptr;
لإرجاع كتلة غير قابلة لإعادة التمركز نستخدم متغير المؤشر المعروف بـ Ptr كما هو معرف في الوصف السابق. والمؤشر ببساطة هو عنوان البايت الاعتباطي في الذاكرة، والمؤشر الذي يشير إلى كتلة غير قابلة لإعادة التمركز يشير إلى أول بايت في هذه الكتلة.
وتقوم بإرجاع الكتلة القابلة لإعادة التمركز باستخدام Handle كما هو معرف بالوصف السابق، و التعريف Handle يحتوي على عنوان المؤشر الرئيسي Master Pointer لنفس الكتلة.
طريقة وصف المتغيرات:
نصف المتغير بلغة باسكال على النحو التالي:
Var
MyVariable : Integer;
وبلغة C على النحو هذا:
int MyVariable;
لاحظ في الباسكال ضرورة وجود الأمر Var.. قبل التوصيف،
النمط الإجباري والقسري:
تضطر أحيانا في البرمجة بتخريج المتغيرات إلى غير مجموعاتها، أو إلى غير بنية المعلومات التي تنتمي إليها: فمثلا إليك التعريف التالي:
Type MyRecord = record 1
Item : Integer; 2
Name: Str255; 3
End; 4
MyRecPtr = ^MyRecord; 5
MyRecHandle = ^MyRecPtr; 6
MyData: MyRecHandle; 7
في السطر الأول وإلى السطر الرابع، قمنا بإنشاء بنية معلوماتية اسمها MyRecord
وبالسطر الخامس قمنا بتعريف مؤشر لها، والسطر السادس مقبض للبنية.. والسطر السابع تعريف متغير، من نوع كتلة MyRecHandle،
ولديك متغير اخر هو : myHandle: Handle; تلاحظ ان المتغير هذا ينتمي إلى بنية المقابض، فكيف سأجعله يشير إلى المجموعة ( أو الكتلة أو البنية) MyRecordHandle؟ وكلاهما مختلفين في النوع؟ ومن المعلوم انك تستطيع أن تعامل المتغيرات مع بعضها البعض التي تنتمي فقط لنفس المجموعة..
سنجبر المتغير myHandle بالإشارة الى MyData على النحو التالي:
MyHandle := Handle(MyData);
في هذا السطر قمنا بإجبار المتغير MyData على أن يخرج بصورة Handle ، ثم يخزن داخل المتغير MyHandle، ولهذه الطريقة أثر كبير في البرمجة.. إليك هذه الأمثلة:
Var 1
MyInt: Integer; 2
MyLong: LongInt; 3
MyPtr: Ptr; 4
MyHnd: Handle; 5
Begin 6
MyInt := 30; 7
MyPtr := @MyInt; 8
MyHnd^ := MyPtr; 9
MyLong := LongInt(MyHnd); 10
End; 11
من الأسطر 1 وحتى 5 تم تعريف متغيرات مختلفة،
وفي السطر 6 هو بداية تنفيذ الأوامر.. وفي السطر السابع تم تعيين القيمة 30 للمتغير MyInt ، وفي السطر الثامن تم إجبار المؤشر MyPtr ليشير إلى المتغير MyInt، عن طريق وضع العلامة @ قبل المتغير.. هذا النوع من الإجبار خاص بالمؤشر Ptr فقط.
وفي السطر التاسع تم جعل المقبض يشير إلى المؤشر رغم اختلاف النوعين.
وفي السطر العاشر تم إجبار المتغير (المقبض) من النوع Handle ليخرج بصورة LongInt. ثم يخزن داخل المتغير MyLong، وسنتخدم بكثرة جداهذا النوع من الإجبارات.. وكل الطرق السابقة ضرورية وسنستخدمها حسب الحاجة.
المجموعة Integer هي مجموعة الأعداد الصحيحة العادية (16 بتا)
المجموعة LongInt هي مجموعة الأعداد الصحيحة الطويلة (32 بتا)
من المعلوم أن المتغير يشغل حيزا في الذاكرة لتتخزن القيم فيه.، فمجموعة الأعداد الصحيحة العادية هي 16 بتا.. والبايت كما رأيناه سابقا هو 8 بتات فقط، إذن حجم أي قيمة تنتمي إلى هذه المجموعة تكون 2 بايت.
ومجموعة الأعداد الصحيحة الطويلة هي 32 بتا.. يكون حجم أي قيمة تنتمي إلى هذه المجموعة تكون 4 بايت.
وكل المؤشرات يكون حجمها بايت واحد فقط.
ملخص ومرجع:
أولا ملخص باسكال:
Pascal Summary
Data Types:
TYPE
SignedByte = -128..127;
Byte = 0..255;
Ptr = ^SignedByte;
Handle = ^Ptr;
ProcPtr = Ptr;
Size = LongInt;
ثانيا ملخص C:
C Summary
Data Types
typedef char SignedByte;
typedef unsigned char Byte;
typedef char *Ptr;
typedef Ptr *Handle;
typedef long (*ProcPtr)();
typedef long Size;
ثالثا: المثال السابق بلغة C
Int main ()
{
int MyInt = 30;
long MyLong;
Ptr myPtr;
Handle myHandle;
MyPtr = (Ptr) MyInt;
*MyHandle = MyPtr;
MyLong = (long) MyHandle;
}
أرجو تحويل النص إلى برنامج مثل الوورد وتحويل اتجاه النص البرمجي ليكون من اليسار إلى اليمين.. حتى يقرأ بشكل صحيح.
__________________
أبو بكر
|