Arduino/static
تُستعمَل الكلمة المفتاحية 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;
}