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

اختبر مهاراتك في المؤشرات (الحلقة الأولى)

مغلق
بدأه khaled_prg في 18 فبراير 2012 · 38 رد · 3,805 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

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

في هذه السلسة سنستعرض العديد من الأفكار التي نستخدم فيها المؤشرات من أجل تطوير مهاراتنا في التعامل مع المؤشرات و النصوص.

هذه السلسلة تعتمد بشكل رئيسي على تفاعلكم و نشاطكم فمن خلال النقاش سيتم عرض العديد من الرؤى و الأفكار التي تساعد المبتدئين مثلي على تخطي عقبة المؤشرات.

سنبدأ بتمرين بسيط لكي يستفيد و يشارك الجميع و سيزداد الأمر تعقيدا بعد كل حلقة إن شاء الله.

التمرين :

أكمل الجدول التالي بتعيين قيمة كل متغير بعد انتهاء التعليمة الموجودة في كل سطر :

post-225348-009804900 1329570150_thumb.p

  • قم بكتابة الإجابة على الصورة من خلال برنامج Paint مثلا ثم أرفق الصورة الجديدة
  • اكتب كرد تعليق صغير تشرح فيه وجهة نظرك حول كل خطوة.

ملاحظة :


  • لا يُسمح باستخدام المترجم أثناء الإجابة.
  • الحل يُرسل على الخاص.

تحياتي.

المرفقات
Ptr.png
1
#2
اقتباس
سنبدأ بتمرين بسيط لكي يستفيد و يشارك الجميع و سيزداد الأمر تعقيدا بعد كل حلقة إن شاء الله.

أن شاء ليس تمرين بسيط أى ليس مستوى مبتدأ فبكل جرأة هو فنى للغاية وفكرة ممتازة أشاركك فيها الرأى.

أخى خالد ممكن توضيح:

ما المقصود بـــ x فى الصف الثانى ؟ أقصد هى تعنى صفر أو ﻻ شئ.

معروف ان المتغيرات تحمل عناوين أى قيمها عناوين متغيرات أخرى كيف لى اكتب قيمة عنوان فى مربع المثال؟

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

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

اقتباس
أن شاء ليس تمرين بسيط أى ليس مستوى مبتدأ فبكل جرأة هو فنى للغاية وفكرة ممتازة أشاركك فيها الرأى.

ِِأشكرك أخي محمد, إذا كان لديك اقتراح (فكرة أو تمرين) أبسط من التمرين المطروح الآن فأرسل لي فكرتك على الخاص و سأضعها بعد هذا التمرين إن شاء الله :)

اقتباس
ما المقصود بـــ x فى الصف الثانى ؟ أقصد هى تعنى صفر أو ﻻ شئ.

  • قمت بوضع تلك العلامة لأن المتغيرات لم تحوي قيمة فعلية بعد. في الجافا تكون القيمة الإبتدائية لمتغيرات الفئة "صفر" و قيمة العناوين الإبتدائية هي NULL.
  • سبق و أن تناقش الأعضاء حول هذه النقطة و كان السؤال كالتالي :
    ماذا يحدث للمتغيرات التى تم التصريح عنها و لكن لم يتم ادخال لها قيمه ؟
    و الجواب هو :
    هذه المتغيرات يقوم المترجم بإعطائك تحذير عنها و هو unreferenced local variable و فى حالة نسخ الـ debug من البرنامج يتم حجز مساحة لها داخل الـ stack و لكن يترك مكانها كما هو بالقيمه التى يحتوى عليها و تسمى القيمه التى يحتوى عليها فى هذا الوقت بــ junk اى قيم غير صحيحه.
  • أما بالنسبة للقيمة الإبتدائية للعناوين فالمؤشر NULL يملك عنوان 0x00000000 وفي العادة هذا العنوان يكون invalid memory address في أغلب نظم التشغيل لكن ليس دائما وليس في كل الحالات ، يستخدم الـ null pointer للدلالة على أن المؤشر فارغ أي لم يتم حجز ذاكرة له بعد.
  • السؤال الآن مالفرق بين الــ null pointer و المؤشر الذي لم يُعط له عنوان بعد ؟؟

اقتباس
كيف لى اكتب قيمة عنوان فى مربع المثال ؟

لا يمكننا معرفة العنوان الحالي للمؤشر لأن العنوان يتعلق بالذاكرة و ربما يتغير عند كل تنفيذ للبرنامج كما قد يتغير بتغير نظام التشغيل, لذا يمكنك كتابة أي شيء يُشابه للعنوان, مثل 0022FF18

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 20 فبراير 2012 في 21:49

#4
اقتباس
أكمل الجدول التالي بتعيين قيمة كل متغير بعد انتهاء التعليمة الموجودة في كل سطر :

قبل ما أحاول الرد على سؤال حول الفرق بين null Pointer و المؤشر الذي لم يُعط له عنوان بعد اريدك ان تجاوبنى على السؤال؟

ما تقصد " كل متغير بعد انتهاء التعليمة الموجودة فى كل سطر؟

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

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#5
اقتباس
ماذا تقصد بــ"كل متغير بعد انتهاء التعليمة الموجودة فى كل سطر ؟"

في كل سطر من سطور الجدول يجب أن تذكر قيمة a,b,c,*p1,*p2 و العناوين أيضا p1,p2 (افترض عنوان للمؤشر p1 و آخر للمؤشر p2 و التزم بتلك العناوين في بقية الجدول)

اقتباس
هل تقصد هناك تعليمات يمكن ان تعمل فى سطر الكود الحالى ويكون تأتيرها فى سطر برمجى اخر وليس السطر الذى نفذت فية ؟

نعم أخي محمد, هنا تكمن فكرة التمرين :)

بالإضافة إلى السؤال السابق :

اقتباس
مالفرق بين الــ null pointer و المؤشر الذي لم يُعط له عنوان بعد ؟؟

سأضيف السؤال الآتي :

ماالفرق بين تحرير و تصفير الذاكرة ؟؟ :wink:

تحياتي.

#6

السلام عليكم ورحمه الله وبركاتة

مرحب بيك أخ خالد ومرحب بالأخ محمد أبو زايد ... أرجو أن تكونوا بصحة طيبة إن شاء الله ...

اقتباس

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

شكراً لك لتجميعنا مجدداً فى الحوار سوياً وتحيه لأسلوبك المميز ...

اقتباس
أكمل الجدول التالي بتعيين قيمة كل متغير بعد انتهاء التعليمة الموجودة في كل سطر :

ما فهمته من هذا الكلام هو أن يتم كتابه ما تحتوية المتغيرات الصحيحة والمؤشرات بعد تنفيذ السطر البرمجى على إعتبار تلك السطور البرمجية تتم بالترتيب من أعلى لاسفل داخل البرنامج أى نريد تتبع ما تحتوية المتغيرات والمؤشرات بعد تفيذ كل سطر برمجى.

- ولى رآى أن تضع عناوين إفتراضية للمتغيرات الصحيحة a,b,c فى البدايه " يعنى تشتغل إنت مكان البروسيسور وتحجز ليها عناوين قبل ما نبدأ :happy: " حتى تكون الإجابات متشابهه

- أعزرنى أخ خالد لن أرسل لك إجابة :lol: أن تريدنى أقوم بجمع وضرب وقسمة العناوين وهذا مالا أطيقه :wacko: هتفكرنا ليه بمقرر نظم الحاسب :lol:

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#7

مرحبا بك مجددا أخي أحمد :)

اقتباس
شكراً لك لتجميعنا مجدداً فى الحوار سوياً وتحيه لأسلوبك المميز ...

شكرا لك, الطيور على أشكالها تقع و مع أضرابها تحلق :happy:

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

أحسنت, هذا بالضبط ما أريده.

اقتباس
ولى رآى أن تضع عناوين إفتراضية للمتغيرات الصحيحة a,b,c فى البدايه " يعنى تشتغل إنت مكان البروسيسور وتحجز ليها عناوين قبل ما نبدأ :happy: " حتى تكون الإجابات متشابهه

لك ما أردت.

لنفترض أن عنوان a هو 0022FF09 و عنوان b هو 0022FF52 و عنوان c هو 0022FF17.

اقتباس
أعزرنى أخ خالد لن أرسل لك إجابة :lol: أن تريدنى أقوم بجمع وضرب وقسمة العناوين وهذا مالا أطيقه :wacko: هتفكرنا ليه بمقرر نظم الحاسب :lol:

مبرمجوا السي/السي++ هم الأجدر على حمل راية المؤشرات لأنهم وبكل بساطة .. كانوا أحق بها و أهلها, تلك هي المسؤولية التي تركها على عاتقهم الفقيد البرمجي Dennis Ritchie و العم الأكبر Bjarne Stroustrup :cool:

فقط, ضع محاولتك .. المهم أن نتحاور سوية في هذا الموضوع.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة khaled_prg في 21 فبراير 2012 في 00:17

#8
اقتباس
لنفترض أن عنوان p1 هو 0022FF09 و عنوان p2 هو 0022FF52 .

أنا أردت أن تضع عناوين إفتراضية للمتغيرات الصحيحة a,b,c وليس للمؤشران p1,p2 لأنهم بالتبعيه سوف يحتوى فى البداية على عنوانى المؤشرين a,c .

اقتباس
مبرمجوا السي/السي++ هم الأجدر على حمل راية المؤشرات لأنهم وبكل بساطة .. كانوا أحق بها و أهلها, تلك هي المسؤولية التي تركها على عاتقهم الفقيد البرمجي Dennis Ritchie و العم الأكبر Bjarne Stroustrup :cool:

فقط, ضع محاولتك .. المهم أن نتحاور سوية في هذا الموضوع.

يا مستر خالد أنا بكلمك على الجمع فى نظم الحاسب مش فى المؤشرات على العموم ولا أزعلك هبعتلك الحل بس إن كده هتخلينى أروح أشوف بجمع وأضرب وأطرح إزاى فى أنظمة الحاسب من جديد :lol: ولا يهمك :lol:

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#9
اقتباس
أنا أردت أن تضع عناوين إفتراضية للمتغيرات الصحيحة a,b,c وليس للمؤشران p1,p2 لأنهم بالتبعيه سوف يحتوى فى البداية على عنوانى المؤشرين a,c .

مجرد غلط :)

تم تحرير المشاركة.

اقتباس
يا مستر خالد أنا بكلمك على الجمع فى نظم الحاسب مش فى المؤشرات على العموم ولا أزعلك هبعتلك الحل بس إن كده هتخلينى أروح أشوف بجمع وأضرب وأطرح إزاى فى أنظمة الحاسب من جديد :lol: ولا يهمك :lol:

يمكنك مراجعة الأرشيف لمدة 5 دقائق .. فقط :D

#10
اقتباس
يمكنك مراجعة الأرشيف لمدة 5 دقائق .. فقط :D

ليه شايفنى الحسن بن الهيثم خليها 5 أيام يااخى فكها شويه :D

أنا شايف إن الأخ محمد علاء الدين موجود فى الموضوع فضلاً أخ علاء أنتظر ردك على الموضوع الذى أرسلته لك عبر البريد الإلكترونى الخاص بك ... دمت بود

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 21 فبراير 2012 في 14:05

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#12
اقتباس
مالفرق بين الــ null pointer و المؤشر الذي لم يُعط له عنوان بعد ؟؟

يُطلق على هذا النوع من المؤشرات "المؤشرات البدائية أو الغير مُهيأة" بمعنى أنه لم تتم تهييأتها بعد, أو بصفة أكثر دقة لا يوجد عنوان محدد للمؤشر البدائي, ربما يتسبب مثل هذا النوع من المؤشرات في تعطيل برنامجك إذا لم تقم بتهيأته لأنه و بكل بساطة يُشير إلى عنوان غير متوقع في الذاكرة. انظر المثال :

char *p1 = malloc(sizeof(char)); /* (undefined) value of some place on the heap */
char *p2;       /* wild (uninitialized) pointer */
*p1 = 'a';      /* This is OK, assuming malloc() has not returned NULL. */
*p2 = 'b';      /* This invokes undefined behavior */

ربما تشير p2 إلى أي مكان في الذاكرة، لذا فإن هذه الخطوة :

*p2 = ‘b’

ستفسد منطقة غير معروفة من الذاكرة و ربما تحتوي على بيانات حساسة.

أحد الفروق بين الــ null pointer و المؤشر الذي لم يُعط له عنوان بعد, يكمن في المقارنة .. حيث يمكننا أن نقارن الــ null pointer مع عنوان أي مؤشر آخر بينما لا يمكننا فعل ذلك مع المؤشرات الغير مُهيأة.

اقتباس
ماالفرق بين تحرير و تصفير الذاكرة ؟؟

تحرير الذاكرة يعني إلغاء حجز العنوان الذي كان يشير إليه المؤشر. حيث يصبح ذلك العنوان حرا و بإمكان نظام التشغيل أن يحجزه لبرنامج آخر من جديد.

بالنسبة لمصطلح التصفير فيجب التفريق فيه بين شيئين :

  1. ذاكرة عنوانها صفر = العنوان الذي يشير اليه المؤشر يساوي صفر.
  2. ذاكرة مصفرة = البيانات التي تحتويها قيمتها أصفار .

و لكن, إذا كان المؤشر يشير إلى ذاكرة عنوانها صفر ألا يعني هذا أن قيمة الخانة المُؤشر عليها تساوي صفر أيضا !؟ :wink:

لا. في العادة الـnull pointer يشير الى ذاكرة غير صالحة للاستخدام invalid memory address :D

يتواصل النقاش ... :cool:

#13

السلام عليكم ورحمة الله وبركاته

مرحباً مجدداً أخ خالد

اقتباس
* ذاكرة عنوانها صفر = العنوان الذي يشير اليه المؤشر يساوي صفر.

* ذاكرة مصفرة = البيانات التي تحتويها قيمتها أصفار .

أولا : كيف نجعل العنوان الذي يشير اليه المؤشر يساوي صفر.

ثانياً : تصفير القيم فى حالة المؤشرات التى تشير لقيم أعداد صحيحة أو كسرية أو كركترية :D يمكن فكيف الحال لو كان المؤشر يشير لتركيب أو تعريف مؤشر من نوع تركيب فبه خليط من الأنواع فكيف الحال إذاً فى عمليت تصفير القيم :ph34r:

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#14
اقتباس
أولا : كيف نجعل العنوان الذي يشير اليه المؤشر يساوي صفر.

هكذا :

#include<stdio.h>

int main() {
    int x = 9,*p = &x;
    printf("Adresse de p = %p\n", p);
    p = NULL;
    printf("Adresse de p = %p", p);
    return 0;
}

اقتباس
ثانياً : تصفير القيم فى حالة المؤشرات التى تشير لقيم أعداد صحيحة أو كسرية أو كركترية :D يمكن فكيف الحال لو كان المؤشر يشير لتركيب أو تعريف مؤشر من نوع تركيب فبه خليط من الأنواع فكيف الحال إذاً فى عمليت تصفير القيم :ph34r:

بالهداوة يا أحمد :D !, احنا لسه في الحلقة الأولى :lol:

تم تعديل هذه المشاركة بواسطة khaled_prg في 22 فبراير 2012 في 01:31

#15
اقتباس
#include<stdio.h>

int main() {
    int x = 9,*p = &x;
    printf("Adresse de p = %p\n", p);
    p = NULL;
    printf("Adresse de p = %p", p);
    return 0;
}

بصراحة أول مرة أطبع فيها قيمة العنوان عندما يشير المؤشر لل null ده صح قيمتة طلعت بتساوى صفر :D

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#16

عُدنا :D

أخي أحمد, يبدو أنك المشارك الوحيد في الحلقة الأولى ! :blush:

نظرا لأنني متشوق للإعلان عن الحلقة الثانية :D سأقوم بوضع محاولتك غدا إن شاء الله و محاولتي أيضا :)

سنتحاور غدا في المحاولات.

الحلقة الثانية ستكون مشوقة بإذن الله .. تابعونا :wink:

تحياتي.

#17

السلام عليكم و رحمة الله و بركاته

كيف أصبحتم يا مبرمجي السي/السي++ ؟ كيف كانت وجبة الفطور ؟؟ :D

ندخل بالموضوع :), نبدأ بمحاولة الأخ ahmedsaoud31 :

post-225348-060641900 1329904348_thumb.p

تفضلوا الآن بالجلوس .. حان موعد النقاش :D :

الخطوة الأولى :

a=1, b=2 ,c=3 ;

المتغيرات a, b, c قيمها على التوالي 1, 2, 3 أما المؤشران p1 و p2 فلا زالا غَيْرَ مُهيأين (يشيران إلى عناوين غير محددة).

الخطوة الثانية :

p1=&a, p2=&c ;

قيم المتغيرات a, b, c لم تتغير. كلما ما في الأمر أن المؤشر p1 أصبح يشير إلى a و p2 يشير إلى c.

الخطوة الثالثة :

*p1 = (*p2)++ ;

أخطأ أخي أحمد في الخطوة الثالثة لأنه نسي الجزء الثاني من المعادلة, فالكتابة السابقة تُكافئ الكتابتان :

*p1 = *p2 ;
*p2 = *p2 + 1 ;

و هنا نجد أن قيمة a ستتغير إلى 3 كما ستتم زيادة قيمة c بواحد لتصبح 4.

الخطوة الرابعة :

p1 = p2 ;

أصبح المؤشران p1 و p2 يشيران معا إلى المتغير c, هذا يعني أنه لهما نفس العنوان 0022FF17 و يحملان نفس القيمة 4. (المؤشر p1 لم يعد له علاقة بالمتغير a)

الخطوة الخامسة :

p2 = &b ;

انتقل المؤشر p2 من عنوان المتغير c إلى عنوان أخوه الأصغر b, إذا قيمة p2 أصبحت هي نفسها b و عنوانه 0022FF52.

الخطوة السادسة :

*p1-=*p2 ;//*p1 = *p1 - *p2

يتم طرح قيمة c من b.

الخطوة السابعة :

++*p2 ;//*p2 = *p2 + 1

تتم زيادة قيمة b بواحد.

الخطوة الثامنة :

*p1*=*p2 ;//*p1 = (*p1) * (*p2)

يتم إسناد جداء قيمة c و b إلى المتغير c.

الخطوة التاسعة :

a=++*p2**p1 ;//a  = ( (*p2 = *p2 +1) * (*p1) ) ;

تمت زيادة المتغير b بواحد. المتغير a سيحمل ناتج جداء b و c.

الخطوة العاشرة:

p1=&a ;

ببساطة, لا جديد سوى أن المؤشر p1 تصالح مع المتغير a و عاد إليه من جديد ! :D

الخطوة الحادية عشر و الأخيرة:

*p2=*p1/=*p 2 ;// *p2 = ( *p1 = *p1 / *p2 );

أخطأ أخي أحمد في هذه الخطوة !, هذا النوع من الإسناد يُسمى بالتخصيص المتسلسل حيث يتم حساب قيمة آخر متغير على اليمين و إسناد القيمة إلى جميع المتغيرات.

عند حساب هذه العبارة :

*p1 = *p1 / *p2 ;

نجد أنه سيتم إسناد قسمة a على b إلى المتغير a, إذا a = 6.

نعود إلى العبارة الأصلية و نعوض فيها بقيمة *p1 لنجد :

*p2=*p1=6

إذا سيكون الحل النهائي هكذا :

post-225348-044368600 1329904603_thumb.p

و هذا تصحيح محاولة الأخ أحمد :

post-225348-094518300 1329904664_thumb.p

تحياتي.

المرفقات
ahmedsaoud31.pngCorrig !.pngNew_ahmedsaoud31.png
#18

بالمناسبة, خطرت ببالي فكرة و أنا أكتب حل التمرين !! :cool:

الفكرة كانت كما يلي :

أكتبُ كود يحتوي على مؤشرات (و بالتالي حجز عناوين في الذاكرة) ثم أقوم بتنفيذ الكود داخل Code::Blocks و أتركه قيد التنفيذ ثم أذهب إلى Netbeans و أقوم بتنفيذ نفس الكود.

المنطق يقول أن العناوين التي استخدمها Code::Blocks يجب أن تكون مخالفة للعناوين التي سيستخدمها Netbeans لأن العناوين الأولى ما زالت قيد الاستعمال. لكن انظر إلى النتيجة :

في Code ::Blocks :

post-225348-014770500 1329907531_thumb.p

و في Netbeans :

post-225348-037225300 1329907577_thumb.p

ما تفسيركم للأمر ؟؟ :wink:

سنختم الحلقة الأولى بهذا السؤال الإضافي البسيط :happy: :

مالفرق بين

*(p2++)

و

*(p2)++
المرفقات
CodeBlocks_BLEM.pngNetbeans_BLEM.png
#19

أخطأ أخي أحمد في الخطوة الثالثة لأنه نسي الجزء الثاني من المعادلة

*p1 = (*p2)++ ;

كما أعلم أن مؤشر الزيادة بعد القيمة يقوم يإستخدام القيمة القديمة فى الكود البرمجى الحالى ثم زيادة القيمة فى الأمر البرمجى التالى لهذا الأمر لذلك لم أقوم بزيادتها فى السطر البرمجى الحالى.

اقتباس

أخطأ أخي أحمد في هذه الخطوة !, هذا النوع من الإسناد يُسمى بالتخصيص المتسلسل حيث يتم حساب قيمة آخر متغير على اليمين و إسناد القيمة إلى جميع المتغيرات.

دائماً بالجديد أخ خالد أول مرة يمر على الكود البرمجى هذا "التخصيص المتسلسل" فأفترضت تساوى القيمتين :happy: ... معلومة جيدة :thumb_up: سأجربها لاحقاً

اقتباس

سنختم الحلقة الأولى بهذا السؤال الإضافي البسيط :happy: :

مالفرق بين

*(p2++)

*(p2)++

الكود الأول يقوم بإزاحة العنوان للعنوان التالى له

الكود الثانى يقوم بزيادة القيمة الموجوة داخل المؤشر بمقدار الواحد

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#20
اقتباس
بالمناسبة, خطرت ببالي فكرة و أنا أكتب حل التمرين !! :cool:

الفكرة كانت كما يلي :

أكتبُ كود يحتوي على مؤشرات (و بالتالي حجز عناوين في الذاكرة) ثم أقوم بتنفيذ الكود داخل Code::Blocks و أتركه قيد التنفيذ ثم أذهب إلى Netbeans و أقوم بتنفيذ نفس الكود.

المنطق يقول أن العناوين التي استخدمها Code::Blocks يجب أن تكون مخالفة للعناوين التي سيستخدمها Netbeans لأن العناوين الأولى ما زالت قيد الاستعمال. لكن انظر إلى النتيجة :

في Code ::Blocks :

مرحبا بك أخى خالد مجدداً ومقدرين مجهودك العظيم مقدمين لك وافر التحية واﻻحترام

تفسيرى المنطقى هو ان البرنامج اﻻول عندما تم تنفيذة فانة قد وصل الى الكود return 0; أى ان البرنامج تم ترجمة وتشغيلة وانتهائة وما يتم عرضة فقط هى نتائج ﻻغير أنما لم يبقىالبرنامج فى الذاكرة اﻵن.

وهكذا فأن البرنامج الثانى اﻵن من المنطقى عندما يخاطب نظام التشغيل بنفس المكتبات القياسية الخاصة بلغة سي++ فأنة سوف تقريبا يصل الى نفس النتيجة.

لكن السؤال اﻵن يتوقف على نوع الذاكرة المستخدمة فى البرنامجين فأنها من نوع ذاكرة واحدة وهى الذاكرة التى يتم تخزين بها المتغيرات المحلية وهى ذاكرة Stack .

ولكى نختبر دقة تجربتك عليك بأستخدم الذاكرة heap وﻻ تنهى البرنامج بل اتركة يتوقف عند نقطة cin>>intvar; حينها حتما البرنامج الثانى سوف يحجز مكان آخر غير هذا المكان ...

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#21
اقتباس
الكود الأول يقوم بإزاحة العنوان للعنوان التالى له

الكود الثانى يقوم بزيادة القيمة الموجوة داخل المؤشر بمقدار الواحد

أحسنت أخي أحمد :cool: و لكي يكون الكلام أكثر دقة نقول :

الكتابة الأولى تعني القيمة التي يشير إليها العنوان الموالي للمؤشر الحالي :)

اقتباس
مرحبا بك أخى خالد مجدداً ومقدرين مجهودك العظيم مقدمين لك وافر التحية واﻻحترام

تسلم أخوي محمد, منكم نتعلم.

اقتباس
تفسيرى المنطقى هو ان البرنامج اﻻول عندما تم تنفيذة فانة قد وصل الى الكود return 0; أى ان البرنامج تم ترجمة وتشغيلة وانتهائة وما يتم عرضة فقط هى نتائج ﻻغير أنما لم يبقىالبرنامج فى الذاكرة اﻵن.

وهكذا فأن البرنامج الثانى اﻵن من المنطقى عندما يخاطب نظام التشغيل بنفس المكتبات القياسية الخاصة بلغة سي++ فأنة سوف تقريبا يصل الى نفس النتيجة.

مهلا :blink: , البرنامج لم يصل بعد إلى return 0, ألا ترى

x = _

في واجهة البرنامج ؟, قمت بطلب الإدخال من المستخدم لأنني لا أريد أن أنهي عمل البرنامج و هنا تكمن الغرابة .. كيف استخدم Netbeans عناوين لمؤشرات لا تزال قيد التنفيذ ؟؟

اقتباس
لكن السؤال اﻵن يتوقف على نوع الذاكرة المستخدمة فى البرنامجين فأنها من نوع ذاكرة واحدة وهى الذاكرة التى يتم تخزين بها المتغيرات المحلية وهى ذاكرة Stack .

ولكى نختبر دقة تجربتك عليك بأستخدم الذاكرة heap وﻻ تنهى البرنامج بل اتركة يتوقف عند نقطة cin>>intvar; حينها حتما البرنامج الثانى سوف يحجز مكان آخر غير هذا المكان ...

سواء كانت الذاكرة Stack أو heap, لا يحق لنظام التشغيل أن يحجز عناوين غير حرة !

#22
اقتباس
سنختم الحلقة الأولى بهذا السؤال الإضافي البسيط :happy: :

مالفرق بين

*(p2++)

و

*(p2)++

فكرة هذا السؤال تعتمد على فهمك لأولوية تنفيذ المعاملات بمعنى اذا كان لدينا فى سطر كود واحد عملية جمع وعملية ضرب مثل: 10+20*2= فهل يتم تنفيذ الضرب أوﻻ ام الجمع أوﻻ اى هل يضرب 20*2 اوﻻ ثم + 10 عليمهم أم العكس.

ناتى الى الكود اﻻول حيث انة سوف يزداد العنوان الموجود بداخل p2 الى بمقدار حجم ذاكرة لمتغير واحد الى اﻻمام ثم عرض قيمة المتغير المشار الية. وذلك بسبب ان ما بداخل اﻻقواس سوف يتم تنفيذة اوﻻ وبذلك فان اﻻقواد لها اولوية تنفيذ أكبر من النجمه

الكود الثانى بينما فى الكود الثانى سوف يتم عرض القيمة المشار الية ثم زيادة العنوان المشار الية بمقدار وحدة ذاكرة مساوية للمتغير بقدار واحد متغير.

تقبل مرورى والله ولى التوفيق

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#23
اقتباس
فكرة هذا السؤال تعتمد على فهمك لأولوية تنفيذ المعاملات بمعنى اذا كان لدينا فى سطر كود واحد عملية جمع وعملية ضرب مثل: 10+20*2= فهل يتم تنفيذ الضرب أوﻻ ام الجمع أوﻻ اى هل يضرب 20*2 اوﻻ ثم + 10 عليمهم أم العكس.

ناتى الى الكود اﻻول حيث انة سوف يزداد العنوان الموجود بداخل p2 الى بمقدار حجم ذاكرة لمتغير واحد الى اﻻمام ثم عرض قيمة المتغير المشار الية. وذلك بسبب ان ما بداخل اﻻقواس سوف يتم تنفيذة اوﻻ وبذلك فان اﻻقواد لها اولوية تنفيذ أكبر من النجمه

الكود الثانى بينما فى الكود الثانى سوف يتم عرض القيمة المشار الية ثم زيادة العنوان المشار الية بمقدار وحدة ذاكرة مساوية للمتغير بقدار واحد متغير.

أحسنت, بارك الله فيك.

بقيت إجابة سؤال واحد قبل أن نُنهي الحلقة الأولى :wink:

#24
اقتباس
سواء كانت الذاكرة Stack أو heap, لا يحق لنظام التشغيل أن يحجز عناوين غير حرة !

فى ذهنى اجابها لعلها صحيحة تقول:

فكرة بناء المترجمان واحة وانهما يملكان نفس استراتيجية ادارة ترجمة وتشغيل البرنامج على المستخدم اى ان هذة البيئة البرمجية التى يشتغل فيها برنامجنا هى بيئة مخصصة ومحددة المعالم بحيث احتمال ظهور نفس النتائج للعناوين هو احتمال تخيلي وليس فعلى .

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#25
اقتباس
فكرة بناء المترجمان واحدة وانهما يملكان نفس استراتيجية ادارة ترجمة وتشغيل البرنامج على المستخدم اى ان هذة البيئة البرمجية التى يشتغل فيها برنامجنا هى بيئة مخصصة ومحددة المعالم بحيث احتمال ظهور نفس النتائج للعناوين هو احتمال تخيلي وليس فعلى .

هل تعني أن العناوين الذي تم إظهارها ليست العناوين الفعلية للمؤشرات ؟؟ :huh:

ماذا تقصد بالإحتمال التخيلي ؟؟ :wacko: :blink:

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

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