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

الرجاء شرح هذه الدوال بشكل عاجل لان عندي امتحان قبول في احدى الجامعات

بدأه memento في 22 يوليو 2009 · 10 رد · 2,668 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أسعد الله ايامكم بكل خير

الرجاء توضيح لي ماهو الفرق بين Keyword في لغة برمجة C مع إعطائي بعض الأمثله عليها لأن الموضوع أصبح فيه التباس كبير علي

ماهو الفرق بين Static , Extern , Register عندما تكتب في Function أو تعريف المتغيرات،،، الرجاء توضيحها بشكل مفصل

ولكم جزيل الشكر والامتنان

#2

السلام عليكم...

هذه الكلمات الثلاث تسمى storage specifiers... بمعنى أن استخدام إحدى تلك الكلمات في تعريف إحدى المتغيرات يخبرنا بموقع المتغير..

أول كلمة, register ... تعني أن المتغير يجب وضعه في register في المعالج و ليس في مكان في الذاكرة الرئيسية RAM... أعتقد أنك تعرف قليلاً من الـ assembly و إلا لما كانت لك حاجة بهذه الـ keywords.

فمثلاً :

post-89451-1248261636_thumb.png

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

post-89451-1248261642_thumb.png

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

الكلمة الثانية, Extern ... و تعني أننا نريد استيراد متغير من module آخر... في Java مثلاً لديك package و في C أيضاً يوجد هذا المفهوم و لكنه مربك كثيراً.

الملف الذي تقوم بكتابته مع جميع الملفات التي عملت لها include و الملفات التي تم عمل include لها في الملفات التي قمت بتضمينها أصلاً, يتم جمعها على شكل ملف واحد أو ما يسمى module.

في الـ module الواحد يمكنك الوصول إلى أي جزء من المجال العام global... و لكن عندما تريد استخدام متغير موجود في مكتبة أخرى كيف ستقوم باستدعائه ؟

باستخدام extern ..

لاحظ المثال التالي, لدينا ملفان الأولى يسمى first.c و الثاني يسمى second.c... و لاعلاقة لهما ببعض. و لنفترض أن first على الشكل التالي ..

post-89451-1248261630_thumb.png

يمكنك "استعمال المتغير الموجود في first عن طريق استيراده باستخدام extern في أي module آخر كـ second.

post-89451-1248261655_thumb.png

مثلاً يمكنك ترجمة الـ two modules باستخدام gcc كالتالي ::

g++ first.c second.c -o test.exe

أعيد فقط للتذكير بأنك لم تقم بعمل include لـ first في second أي أنهما ليسا module واحدة.

أخيراً static و هذه لها معاني عدة سأتطرق لها في رد قادم إن شاء الله, فهي قد تأتي لتنظيم الـ modules كما في extern أو كطريقة لتحديد عمر المتغير, و كلاهما مفهومان مختلفان لنفس الكلمة في مواقع مختلفة :)

أحتاج بعض الوقت فقط,

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 22 يوليو 2009 في 14:24

#3

بارك الله فيك وجزاك الله كل خير ،،،، وانتظر منك شرح static

#4

السلام عليكم...

حسناً:

ساحاول ايصال فكرة كلمةstatic و الموجودة داخل الداول مع المتغيرات المحلية local variables. بطبيعة هذا النوع من المتغيرات المحليّة داخل الدوال فإنها تفقد قيمتها و تتلاشن بمجرد انتهاء عمل الدالة و رجوعها. و لكن عندما نضع الكلمة static ببداية جملة التعريف لمتغير محلّي سيكون هذا المتغير محتفظاً بآخر قيمة له حتى بعد انتهاء الدالة من عملها. هذا يعني, عند نداء هذه الدالة مرة تانية ستكون قيمة المتغير مستقرة static بآخر قيمة كانت عليه ليستفيد البرنامج من تلك القيمة و التعامل مرة أخرى مع المتغير.

المسال التالي يقوم بشرح هذه الفكرة ببساطة...

  1.  
  2. int func()
  3. {
  4. static int b = 0; //هذا المتغير نعطيه قيمة استهلالية و هو مستقر
  5. b++; // عملية زيادة قيمة المتغير المستقر بواحد
  6.  
  7. return b;
  8. }
  9.  
  10.  

حسناً لو فرضنا أننا قمنا بنداء الدالة func كالتالي: (النداء الأول)

  1.  
  2. func();
  3.  

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

لو لم ننشيء هذا المتغير بكلمة static فإن البرنامج في كل مرة سيقوم باسترجاع العدد 1 لأن في كل مرة تنتهي الدالة ستتبخر كل المتغيرات المحلّية الموجودين بالدالة. و لكن في هدا البرنامج العملية ليست كذلك...ففي النداء التاني للدالة func ستقوم بتذكر قيمة b السابقة و بتتجاهل السطر الأول تبع التعريف و من ثم تقوم فقط بزيادة القيمة b مع القيمة السابقة فتصبح 2 و تسترجع القيمة 2...و هكذا في كل مرة

هيك بكل بساطة...

آسفة لتقصيري

موفق يارب

bye

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#5

آسفة لمداخلتي...ما لمحت ان بيناتكم موعد!!!

ولكن هذا ما يتعلق بالسؤال ببساطة بخصوص المتغيرات المستقرة المحليّة Static Local Variables. تجعلها و كأنها متغيرات من نوع Global Variables.

موفقين يارب

bye

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#6
/index.ph...Static+Function

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#7

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

كلمة static يمكن فهم وظيفتها من خلال ثلاثة محاور

1- الإعلان عن متغير

2- وجودها داخل كلاس أمام الإعلان عن عضو

3- وجودها أمام داله عضو من كلاس

---------------------------------

اولا فى حالة الإعلان عن متغير داخل داله سيتم انشاء هذا المتغير الإستاتيك مره واحده حتى ولو نادينا على الداله الف مره شوف المثال التالى


using namespace std;
void print()
{
static int a=1;
int b=1;
cout<<"a = "<<a<<" ";
cout<<"b = "<<b<<endl;
a++;b++;
}
void main()
{
print();
print();
print();
cin.get();
}
#include<iostream>

وعند وجود هذه الكلمه داخل الكلاس وأمام عضو من أعضاء الكلاس اقصد طبعا المتغيرات

فيتم انشاء نسخه واحده من هذا المتغير حتى لو انشأنا الاف الكائنات من هذا الكلاس

ويكون بمثابة عامل مشترك بين جميع الكائنات من هذا النوع

ويستخدم أحيانا فى عد الكائنات المنشأه من كلاس معين

وطريقة عمل ابتداء له قد تفضل بها أخ بمشاركه سابقه

الان لو وضعنا هذه الكلمه static أمام داله عضو فى كلاس

فمن خلال هذه الداله يمكننا التعامل مع المتغيرات الستاتيك

وكذلك يمكن الوصول الى هذه الدوال مباشرة من خلال اسم الكلاس دون انشاء كائن عن طريق معامل المدى ::

وهنا مثال يوضح


using namespace std;
class test
{
private:
static int a;
public:
static int geta()
{
return a;
}
};
int test::a=10;

void main()
{
cout<<test::geta()<<endl;
cin.get();
}
#include<iostream>

لاحظ كيف وصلنا الى الداله geta بدون انشاء كائن

وهى ميزه فى الدوال الإستاتيكيه

تحياتى

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#8

طيب أنا عندي سؤال في الكود الأخير:

اقتباس
cout<<test::geta()<<endl;

cin.get();

ما فائدة النقتطتان الرأسيتان::

وأيضًا ما معنى cin.get()؟

هل هي فانكشن؟؟؟

أم ماذا؟ :)

أستغفر الله العظيم الذي لا إله إلا هو الحي القيوم وأتوب إليه

#9
اقتباس
ما فائدة النقتطتان الرأسيتان::

في المثال السابق تم استخدامها للوصول إلى أعضاء الصنف class الساكنة static

اقتباس
وأيضًا ما معنى cin.get()؟

هل هي فانكشن؟؟؟

نعم, هي دالة قياسية تستخدم لإستقبال محرف character من جهاز الإدخال القياسي (لوحة المفاتيح)

قام الأخ amin_mu123 باستخدامها حتى لا يُغلق البرنامج إلا بعد الضغط على المفتاح Enter

تحياتي

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#10

جزاكم الله خيرًا... :)

أستغفر الله العظيم الذي لا إله إلا هو الحي القيوم وأتوب إليه

#11

بارك الله فيكم وجزاكم الله كل خير وجعله في ميزان حسناتكم وادخلكم الفردوس الاعلى وجعلكم من جيران الحبيب المصطفى ورزقه رؤيه وجه القهار الرحمن الرحيم

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…