قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:20 PM المشاركة 137   
افتراضي



15 المؤشرات Pointers
المؤشرات هى جزء هام من لغة السى لأنها تحفظ "عناوين الذاكرة" للمتغيرات . يتم تعريف المؤشرات بنفس طريقة المتغيرات الأخرى ولكن مع وضع الرمز ("*") أمام اسم المتغير . عموما , يمكن إنشاء موشرات للإشارة إلى (أو حفظ عناوين) المتغيرات .
المثال التالى يبين تعريف مؤشر يسمى pntمن نوع unsigned character :

unsigned char *pnt;





عندما يتم إنشاء مؤشر جديد فإن محتوياته فى البداية تكون غير محددة ولا يحفظ عنوان أى متغير . يمكننا تخصيص عنوان المتغير للمؤشر باستخدام الرمز (“&”) كما يلى :

pnt = &Count;








الآن المؤشر pnt يحفظ عنوان المتغير Count . يمكن تحديد قيمة للمتغير Count باستخدام الرمز (“*”) قبل مؤشره . على سبيل المثال يمكن تعيين العدد 10 للمتغير Count باستخدام مؤشره كما يلى :

*pnt = 10; // Count = 10







وهى نفس العبارة :


Count = 10; // Count = 10






أو يمكن نسخ قيمة المتغير Count إلى المتغير Cnt باستخدام مؤشره كما يلى :



Cnt = *pnt; // Cnt = Count




مصفوفة المؤشرات Array Pointers

فى لغة السى اسم المصفوفة هو أيضا مؤشر للمصفوفة . وبالتالى بالنسبة للمصفوفة :

unsigned int Total[10];




الاسم Total هو أيضا مؤشر لهذه المصفوفة ويحفظ عنوان أول عنصر بالمصفوفة .وبالتالى فإن العبارات التالية متساوية :


Total[2] = 0;
And

*(Total ‏ 2) = 0;







أيضا العبارة التالية صواب :

&Total[j] = Total ‏ j








فى لغة السى يمكننا تنفيذ العمليات الحسابية على المؤشرات والتى قد تنطوى على :
  • المقارنة بين مؤشرين .
  • جمع أو طرح مؤشر وقيمة عدد صحيح .
  • طرح مؤشرين .
  • تخصيص أحد المؤشرات لمؤشر آخر .
  • مقارنة المؤشر بالصفر .
على سبيل المثال , نفترض أنه تم تحديد المءشر P ليحتفظ بعنوان المصفوفة element Z[2] كما يلى :


P = &Z[2];









يمكننا الآن مسح clear العنصر 2 و العنصر 3 بالمصفوفة Z كما فى المثالين التاليين . المثالان متطابقان فيما عدا أنه فى المثال الأول المؤشر P يحفظ عنوان Z[3] فى نهاية العبارة ويحفظ عنوان Z[2] فى نهاية المجموعة الثانية من العبارات :
*P = 0; // Z[2] = 0
P = P ‏+ 1; // P now points to element 3 of Z
*P = 0; // Z[3] = 0

Or

*P = 0; // Z[2] = 0
*(P + 1) = 0; // Z[3] = 0





يمكن تخصيص مؤشر لمؤشر آخر . المال التالى يبين المتغير Cnt والمتغير Tot يتم تحيد كلا منهما بالقيمة 10 باستخدام مؤشرات مختلفة :


unsigned int *i, *j; // declare 2 pointers
unsigned int Cnt, Tot; // declare two variables
i = &Cnt; // i points to Cnt
*i = 10; // Cnt = 10
j = i; // copy pointer i to pointer j
Tot = *j; // Tot = 10






3-1-16 الهياكل Structures

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:21 PM المشاركة 138   
افتراضي


16 الهياكل Structures
يمكن استخدام الهيكل "لجمع" العناصر ذات الصلة ومن ثم تعالج "ككائن واحد".
بخلاف المصفوفة , يمكن للهيكل أن يحتوى على "خليط" من أنواع البيانات . على سبيل المثال , يمكن للهيكل تخزين التفاصيل الشخصية للطالب (الاسم , اللقب , السن , وتاريخ الميلاد ...ألخ) .
يتم إنشاء الهيكل باستخدام الكلمة struct يليها اسم الهيكل وقائمة بتعريفات العناصر . اختياريا , يمكن تعريف المتغيرات من نفس النوع فى نهاية الهيكل .
المثال التالى يعرف هيكل يسمى Person :

struct Person
{
unsigned char name[20];
unsigned char surname[20];
unsigned char nationality[20];
unsigned char age;

}








تعريف الهيكل "لا يشغل" أى حيز من الذاكرة بل أن المترجم يقوم بإنشاء قالب (نموذج) يصف أسماء وأنواع بيانات الكائنات أو العناصر والتى من شأنها فى نهاية المطاف يتم تخزينها داخل متغير هذا الهيكل . فقط عندما يتم إنشاء متغيرات من نفس النوع نفسه بوصفه هيكل فإن هذه المتغيرات تحتل حيز بالذاكرة .
يمكننا تعريف المتغيرات من نفس النوع باعتبارها هيكل بإعطاء اسم للهيكل واسم للمتغير. على سبيل المثال المتغيران Me و You من النوع Person يمكن تعريفها كما يلى :



struct Person Me, You;






يمكن أيضا إنشاء المتغير من نوع Person أثناء تعريف الهيكل كما يلى :


struct Person
{
unsigned char name[20];
unsigned char surname[20];
unsigned char nationality[20];
unsigned char age;
} Me, You;







يمكننا تخصيص قيم لعناصر الهيكل عن طريق تحديد اسم الهيكل يليه "نقطة" (“.”) واسم العنصر . فى المثال التالى يتم تخصيص القيمة 25 للعنصرageبمتغير الهيكل Me وتخصيص المتغيرM لقيمة العنصر age بمتغير الهيكل You :
Me.age = 25;
M = You.age;








يمكن تهيئة عناصر الهيكل إثناء تعريف الهيكل . فى المثال التالى يتم تهيئة العناصر radius و height بالهيكل Cylinde بالقيم 1.2 و 2.5 على الترتيب :


struct Cylinder
{
float radius;
float height;
} MyCylinder = {1.2, 2.5};







يمكن أيضا تعيين قيم لعناصر الهيكل باستخدام المؤشرات بتعريف أنواع المتغير كمؤشرات ظ. على سبيل المثال , إذا تم تعريف Cylinder كمؤشر للهيكل Cylinder عندئذ يمكن أن نكتب :
struct Cylinder
{
float radius;
float height;
} *TheCylinder;
TheCylinder -> radius = 1.2;
TheCylinder -> height = 2.5;





اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:22 PM المشاركة 139   
افتراضي


يمكن أيضا تعيين قيم لعناصر الهيكل باستخدام المؤشرات بتعريف أنواع المتغير كمؤشرات ظ. على سبيل المثال , إذا تم تعريف Cylinder كمؤشر للهيكل Cylinder عندئذ يمكن أن نكتب :
struct Cylinder
{
float radius;
float height;
} *TheCylinder;
TheCylinder -> radius = 1.2;
TheCylinder -> height = 2.5;








حجم الهيكل هو عدد البايتات الموجودة داخل الهيكل . يمكننا استخدام المعامل sizeof فى الحصول على حجم الهيكل . باعتبار المثال أعلاه , العبارة sizeof(MyCylinder) تعود بالقيمة 8 لأن كل متغير لعدد حقيقى يحتل 4 بايت بالذاكرة .
يمكن تعريف حقول البت Bit fields باستخدام الهيكل . بحقول البت يمكننا تخصيص معرفات لبتات المتغير . على سبيل المثال لتعريف البتات 0, 1, 2, 3 للمتغير على أنها LowNibble "النبل السفلى" وتعريف البتات الأربعة المتبقية على أنها HighNibble "النبل العلوى" يمكننا كتابة :

struct
{
LowNibble : 4;
HighNibble : 4;
} MyVariable;







يمكننا الوصول إلى نبلى المتغير MyVariable كما يلى :
MyVariable.LowNibble = 12;
MyVariable.HighNibble = 8;









فى لغة السى يمكننا استخدام العبارة typedef فى إنشاء متغيرات من أنواع جديدة . على سبيل المثال , يمكن إنشاء هيكل لنوع جديد من البيانات بالاسم Reg كما يلى :


typedef struct
{
unsigned char name[20];
unsigned char surname[20];
unsigned age;
} Reg;






يمكن بعد ذلك إنشاء متغيرات من النوع Reg بنفس طريقة إنشاء المتغيرات الأخرى . فى المثال التالى , يتم إنشاء المتغيرات MyReg, Reg1, Reg2 من بيانات نوع Reg :

Reg MyReg, Reg1, Reg2;





يمكن نسخ محتويات أحد الهياكل إلى هيكل آخر , شريطة أن يتم اشتقاق كلا من الهيكلين من نفس القالب (النموذج) . فى المثال التالى , يتم إنشاء متغيرات الهياكل P1 و P2من نفس النوع ويتم نسخ P2 إلى P1 :

struct Person
{
unsigned char name[20];
unsigned char surname[20];
unsigned int age;
unsigned int height;
unsigned weight;
}
struct Person P1, P2;
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
P2 = P1;






3-1-17 الاتحادات Unions


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:23 PM المشاركة 140   
افتراضي


الاتحادات Unions
تستخدم الاتحادات فى "تراكب" overlay المتغيرات . الاتحاد مماثل للهيكل وحتى أنه يتم تعريفه بطريقة مماثلة . كلاهما يستند على القوالب (النماذج) ويتم الوصول إلى عناصره باستخدام المعاملات “.” أو “->”. التحاد يختلف عن الكيكل فى أن جميع المتغيرات فى الاتحاد تحتل نفس منطقة الذاكرة . أى أنها تتشارك نفس المخزن .
مثال لطريقة تعريف الاتحاد :



union flags
{
unsigned char x;
unsigned int y;
} P;







فى هذا المثال , المتغير x والمتغير y يحتلان نفس منطقة الذاكرة وحجم "إتحادهما" بطول 2 بايت وهو حجم أكبر عضو فى الاتحاد .
عندما يتم تحميل المتغير y بالقيمة 2-byte فإن المتغير x سوق يكون به نفس قيمة "البايت السفلى" للمتغير y . فى المثال التالى , يتم تحميل المتغير y بالقيمة السداسية عشر ذات 16 بت 0xAEFA ويتم تحميل المتغير x بالقيمة 0xFA :


P.y = 0xAEFA;








حجم الاتحاد هو حجم ( عدد البايتات) أكبر عضو به .
مثال :


sizeof(P)
returns 2.






هذا الاتحاد يمكن تعريفه أيضا كما يلى :


union flags
{
unsigned char x;
unsigned int y;
}
union flags P;




3-1-18 العوامل فى لغة السى Operators in C


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:25 PM المشاركة 141   
افتراضي


العوامل فى لغة السى Operators in C
يتم تطبيق العوامل على المتغيرات والكائنات الأخرى فى التعبيرات "لتسبب حدوث ظروف معينة أو حسابات".



يدعم المترجم ميكروسى العوامل التالية :
  • المعاملات الحسابية Arithmetic operators .
  • معاملات العلاقات (الارتباط) Relational operators .
  • المعاملات المنطقية Logical operators .
  • معاملات البت الواحدة Bitwise operators .
  • معاملات التخصيص أو التعيين Assignment operators .
  • معاملات الشرط Conditional operators .
  • معاملات "قبل المعالج" Preprocessor .
المعاملات الحسابية Arithmetic Operators

تستخدم المعاملات الحسابية فى عمليات الحساب . ترتبط المعاملات الحسابية من اليسار لليمين وتعود بنتيجة عددية . الجدول 3-4 يبين قائمة بالمعاملات الحسابية للمترجم الميكروسى .









المثال التالى يوضح استخدام المعاملات الحسابية :

/* Adding two integers */
5 ‏+ 12 // equals 17
/* Subtracting two integers */
120 – 5 // equals 115
10 – 15 // equals -5
/* Dividing two integers */
5 / 3 // equals 1
12 / 3 // equals 4
/* Multiplying two integers */
3 * 12 // equals 36



















/* Adding two floating point numbers */
3.1 ‏+ 2.4 // equals 5.5
/* Multiplying two floating point numbers */
2.5 * 5.0 // equals 12.5
/* Dividing two floating point numbers */
25.0 / 4.0 // equals 6.25







/* Remainder (not for float) */
7 % 3 // equals 1






/* Post-increment operator */
j = 4;
k = j++‏‏; // k = 4, j = 5
/* Pre-increment operator */
j = 4;
k = ++‏‏j; // k 4 5, j = 5









/* Post-decrement operator */
j = 12;
k = j--; // k =12, j = 11
/* Pre-decrement operator */
j = 12;
k =--j; // k =11, j = 11






معاملات العلاقات (الارتباط) Relational operators


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:26 PM المشاركة 142   
افتراضي


عوامل العلاقات (الارتباط) Relational operators
تستخدم هذه العوامل فى "المقارنات" comparisons . إذا كان تقييم (نتيجة) تعبير المقاومة "صواب" true يكون عائدها بالواحد 1 وإن لم تكن يكون عائدها بالصفر 0 .
جميع عوامل العلاقات ترتبك من اليسار إلى اليمين . الجدول 3- 5 يبين قائمة بعوامل العلاقات للمترجم الميكروسى .







المثال التالى يوضح استخدام عوامل المقارنات :

x = 10
x > 8 // returns 1
x == 10 // returns 1
x < 100 // returns 1
x > 20 // returns 0
x != 10 // returns 0
x >= 10 // returns 1
x <=10 // returns 1



العوامل المنطقية Logical Operators


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:27 PM المشاركة 143   
افتراضي


العوامل المنطقية Logical Operators
تستخدم العوامل المنطقية فى"المقارنات الحسابية والمنطقية" ويكون عائدها "صواب " true(أى المنطق واحد 1) إذا كانت نتيجة التعبير "غير صفرى" وتكون النتيجة "خطأ" false (أى المنطق صفر 0 ) إذا كانت نتيجة التعبير "صفر" .
إذا تم استخدام أكثر من عامل منطقى فى التعبير , وإذا كانت "نتيجة الشرط الأول" خطأ false فلا يتم تقييم التعبيير الثانى .
الجدول 3-6 يبين قائمى بالعوامل المنطقية للميكروسى .








المثال التالى يوضح استخدام العوامل المنطقية :

/* Logical AND */
x = 7;
x > 0 && x < 10 // returns 1
x > 0 || x < 10 // returns 1
x >=0 && x <=10 // returns 1
x >=0 && x < 5 // returns 0

a = 10; b = 20; c = 30; d = 40;
a > b && c > d // returns 0
b > a && d > c // returns 1
a > b || d > c // returns 1







العوامل المختصة بالبت Bitwise Operators


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-10-2011, 02:28 PM المشاركة 144   
افتراضي


العوامل المختصة بالبت Bitwise Operators
تستخدم العوامل المختصة بالبت فى "تعديل" بتات المتغير . الدول 3-7 يبين قائمة بالعوامل المختصة بالبت بالميكروسى .







عامل الخانة AND "&" يعود بواحد إذا كان "كلا الخانتان بواحد" وإلا كان العائد بصفر .
عامل الخانة OR "|" يعود بالصفر إذا كان "كلا الخانتان بصفر " وإلا كان العائد بواحد .
عامل الخانة " ∧" XOR يعود بالواحد إذا كان "كلا الخانتان متكاملتان(أحدهما بواحد والآخر بصفر) " وإلا كان العائد بصفر .
عامل الخانة "المتكامل" أو "المعكوس" "~" "يعكس كل بت " .
عامل الإزاحة جهة اليسار "<<" وعامل الإزاحة جهة اليمين ">>" يحرك ( يزيح – ينقل) البتات جهة اليسار أو جهة اليمين على الترتيب .
المثال التالى يوضح استخدام العوامل المختصة بالبت :



i. 0xFA & 0xEE returns 0xEA
0xFA: 1111 1010
0xEE: 1110 1110
- - - - - - - - - - - -
0xEA: 1110 1010


ii. 0x01 | 0xFE returns 0xFF
0x08: 0000 0001
0xFE: 1111 1110
- - - - - - - - - - - -
0xFE: 1111 1111
iii. 0xAA ∧0x1F returns
0xAA: 1010 1010
0x1F: 0001 1111
- - - - - - - - - - - -
0xB5: 1011 0101


iv. ~0xAA returns 0x
0xAA: 1010 1010
~ : 0101 0101
- - - - - - - - - - - -
0x55: 0101 0101

v. 0x14 >> 1 returns 0x08 (shift 0x14 right by 1 digit)
0x14: 0001 0100
>>1 : 0000 1010
- - - - - - - - - - - -
0x0A: 0000 1010

vi. 0x14 >> 2 returns 0x05 (shift 0x14 right by 2 digits)
0x14: 0001 0100
>> 2: 0000 0101
- - - - - - - - - - - -
0x05: 0000 0101

vii. 0x235A << 1 returns 0x46B4 (shift left 0x235A left by 1 digit)
0x235A: 0010 0011 0101 1010
<<1 : 0100 0110 1011 0100
- - - - - - - - - - - - - - - - - - -
0x46B4 : 0100 0110 1011 0100

viii. 0x1A << 3 returns 0xD0 (shift left 0x1A by 3 digits)
0x1A: 0001 1010
<<3 : 1101 0000
- - - - - - - - - - - -
0xD0: 1101 0000













عوامل التخصيص (التعيين) Assignment Operators



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:22 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)