ההבדל הבסיסי ביותר הוא בהיקף.
במקרה הראשון, אתה מצהיר על משתנה גלובלי. זהו משתנה הנגיש בכל היקף לאחר הגדרתו.
setup void () {Serial.begin (9600);} void inc (); int count = 0; loop void ( ) {Serial.println (ספירה); ספירת ++; inc (); עיכוב (500);} void inc () // יכול לערוך את ערך הספירה {count = count + 1;};
במקרה השני, אתה מצהיר על משתנה סטטי עם היקף מקומי. המשתנה יימשך לאורך כל התוכנית המופעלת בדומה למשתנים גלובליים, אך יהיה נגיש רק בבלוק הקוד בו הוא הוכרז. זו אותה דוגמה, עם שינוי אחד בלבד. ספירה
מוכרז כעת כמשתנה סטטי בתוך loop
.
void inc (); loop loop () {static int count = 0 ; Serial.println (ספירה); ספירת ++; inc (); עיכוב (500);}
פעולה זו לא תתבצע הידור כיוון שלפונקציה inc ()
אין גישה ל- count
.
משתנים גלובליים, אם כי לכאורה שימושיים, מגיעים עם כמה מלכודות. אלה יכולים אפילו לגרום נזק כשמדובר בתוכניות כתיבה שיכולות לתקשר עם הסביבה הפיזית. זו דוגמה בסיסית מאוד למשהו שסביר להניח שיקרה ברגע שהתוכניות מתחילות להיות גדולות יותר. פונקציה עשויה לשנות בשוגג את מצבו של משתנה גלובלי.
הגדרת חלל () {Serial.begin (9600);} בטל עוד_פונקציה (); מצב int = 0; loop loop () { // המשך להחליף את המצב Serial.println (state); עיכוב (250); state = state? 0: 1; // פונקציה לא קשורה כלשהי קוראת ל- another_function ();} בטל function_ another () {// מבטל בשוגג את מצב המצב = 1;}
מקרים כאלה קשה מאוד לאתר. עם זאת, ניתן לגלות בקלות את סוג ה סוג הזה של הבעיה, פשוט באמצעות משתנה סטטי.
הגדרת חלל () {Serial.begin (9600);} בטל פונקציה אחרת (); loop loop () {state int state = 0; // המשך להחליף את המצב Serial.println (state);
עיכוב (250); state = state? 0: 1; // פונקציה לא קשורה כלשהי קוראת ל- another_function ();} בטל another_function () {// מביא לשגיאת זמן הידור. חוסך זמן. state = 1;}