
در آردوینو، کلمهی کلیدی static برای تعریف متغیرهایی استفاده میشود که محلی هستند (یعنی فقط در یک تابع قابل دسترسیاند)، اما مقدارشان بین فراخوانیهای متوالی تابع حفظ میشود.
بدون static، متغیرهای محلی هر بار که تابع فراخوانی میشود، دوباره ساخته و مقدار اولیهشان تنظیم میشود. اما با static، مقدار قبلی ذخیره میماند.
توضیح برای مبتدیها: تصور کنید یک دفترچه یادداشت شخصی دارید که فقط شما میتوانید به آن نگاه کنید (مثل یک متغیر محلی). بدون
static، هر بار که وارد اتاق میشوید، دفترچه را پاک میکنید و دوباره شروع میکنید. اما باstatic، دفترچه همانطور که بود باقی میماند — پس میتوانید از آخرین یادداشت خود ادامه دهید!
در بسیاری از پروژهها، نیاز داریم یک تابع بتواند «خاطرهای» از فراخوانی قبلی داشته باشد — مثلاً: — شمارش تعداد دفعاتی که یک تابع فراخوانی شده است.
— ذخیره آخرین وضعیت یک سنسور برای مقایسه با مقدار جدید.
— پیادهسازی تایمرهای ساده بدون استفاده از متغیرهای سراسری.
استفاده از static به شما امکان میدهد این کار را بدون ایجاد متغیر سراسری (که RAM را اشغال میکند و کد را شلوغ میکند) انجام دهید.
برای تبدیل یک متغیر محلی به متغیر static، کافی است قبل از نوع داده، کلمهی static را بنویسید:
void myFunction() {
static int counter = 0; // فقط یک بار مقداردهی میشود
counter++;
Serial.println(counter);
}
اولین بار که myFunction() فراخوانی میشود، counter برابر ۱ میشود.
دومین بار: ۲، سومین بار: ۳ و همینطور ادامه مییابد — چون مقدار قبلی حفظ شده است.
void checkSensor() {
static unsigned long lastCheck = 0;
static int callCount = 0;
callCount++;
unsigned long now = millis();
if (now - lastCheck > 5000) { // هر ۵ ثانیه یک بار
int value = analogRead(A0);
Serial.print("بررسی شماره ");
Serial.print(callCount);
Serial.print(" — مقدار سنسور: ");
Serial.println(value);
lastCheck = now;
}
}
void loop() {
checkSensor(); // هر بار که فراخوانی میشود، callCount افزایش مییابد
delay(100);
}
توضیح برای مبتدیها: بدون
static، هر بار کهcheckSensor()فراخوانی میشد،callCountدوباره صفر میشد و همیشه فقط «۱» چاپ میکرد. اما باstatic، این متغیر فقط یک بار ساخته میشود و مقدارش بین فراخوانیها زنده میماند.
| ویژگی | متغیر static (محلی) | متغیر سراسری |
|---|---|---|
| دامنه | فقط داخل یک تابع | در تمام کد قابل دسترسی |
| عمر (Lifetime) | تا پایان برنامه | تا پایان برنامه |
| مصرف RAM | مثل سراسری (در RAM ثابت) | در RAM ثابت |
| امنیت و سازماندهی | عالی — فقط تابع میتواند آن را ببیند | ضعیف — هر تابعی میتواند آن را تغییر دهد |
خط مقداردهی اولیه (مثل static int x = 0;) فقط اولین بار که تابع اجرا میشود، انجام میشود. در فراخوانیهای بعدی، این خط نادیده گرفته میشود — حتی اگر مقدار را تغییر داده باشید!
void test() {
static int x = 10; // فقط اولین بار اجرا میشود
x++;
Serial.println(x);
}
اولین فراخوانی: ۱۱
دومین فراخوانی: ۱۲
سومین فراخوانی: ۱۳
... و هرگز دوباره به ۱۰ بازنمیگردد.
بسیاری از مبتدیها برای ذخیره وضعیت، متغیرهای سراسری تعریف میکنند. این کار RAM را اشغال میکند و کد را شلوغ میکند.
اما با static، میتوانید همان کار را درون تابع انجام دهید — بدون اینکه نام متغیر در بقیه کد دیده شود. این روش، کد شما را ماژولار، ایمن و حرفهای میکند.
static متغیرهای محلی را «حافظهدار» میکنداین مطلب بر اساس مستندات رسمی Arduino از بخش static – Language Reference تهیه شده است، با توضیحات سادهشده، مثالهای کاربردی و نکات طلایی منحصربهفرد برای جامعه فارسیزبان.
برچسب های مهم