Arduino/static

من موسوعة حسوب
مراجعة 08:18، 27 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (أنشأ الصفحة ب'تُستعمَل الكلمة المفتاحية <code>static</code> عند إنشاء متغيرات مرئيَّة لدالةٍ واحدة فقط من أجل الحف...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تُستعمَل الكلمة المفتاحية static عند إنشاء متغيرات مرئيَّة لدالةٍ واحدة فقط من أجل الحفاظ على محتواها بعد انتهاء تنفيذ تلك الدالة المستدعاة وحتى الاستدعاء التالي لها خلافًا للمتغيرات المحلية التي تُنشَأ وتدمَّر في كل مرة تُستدعَى فيها الدالة.

ستُنشَأ وتُهيَّأ المتغيرات الساكنة المصرَّح عنها ضمن الدالة مع الكلمة static المفتاحية أول مرة تُستدعَى فيها تلك الدالة فقط.

البنية العامة

static dataType var = val;

يمثِّل dataType نوع المتغير المراد تعريفه، و var اسم المتغير، و val القيمة المراد إسنادها إلى هذا المتغير الساكن. انتبه إلى أنَّه متى ما أُنشِئ المتغير var عند استدعاء الدالة أول مرة، لن يدمَّر عند انتهاء تنفيذ الدالة وسيحافِظ على القيمة المخزَّنة ضمنه حتى الاستدعاء التالي للدالة.

أمثلة

يعمل البرنامج التالي على توليد خطوات عشوائية محدودة بمجال معيَّن بالإضافة إلى تقييد بحجم الخطوات عبر المتغير stepsize المُمرَّر إلى الدالة randomWalk:

/* RandomWalk
* Paul Badger 2007
* RandomWalk wanders up and down randomly between two
* endpoints. The maximum move in one loop is governed by
* the parameter "stepsize".
* A static variable is moved up and down a random amount.
* This technique is also known as "pink noise" and "drunken walk".
*/

#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;

int thisTime;
int total;

void setup()
{
  Serial.begin(9600);
}

void loop()
{        // randomWalk اختبار الدالة
  stepsize = 5;
  thisTime = randomWalk(stepsize);
  Serial.println(thisTime);
   delay(10);
}

int randomWalk(int moveSize){
  static int  place;     // عُرِّف كأَّنه ساكن لذا يخزِّن القيم randomWalk متغير يخزِّن قيمة في الدالة 
                         // بين استدعاءات الدوال مع بقاء هذا المتغير محلي ولا يصل إليه سوى هذه الدالة

  place = place + (random(-moveSize, moveSize + 1));

  if (place < randomWalkLowRange){                              // التحقق من الحدود الدنيا والعليا
    place = randomWalkLowRange + (randomWalkLowRange - place);  // يعكس الرقم بالاتجاه المعاكس نحو الاتجاه الموجب 
  }
  else if(place > randomWalkHighRange){
    place = randomWalkHighRange - (place - randomWalkHighRange);  // يعكس الرقم بالاتجاه المعاكس نحو الاتجاه السالب
  }

  return place;
}

انظر أيضًا

مصادر