שְׁאֵלָה:
מה הדרך הטובה ביותר להגדיר סיכת קלט / פלט?
Joris Groosman
2015-04-27 11:11:54 UTC
view on stackexchange narkive permalink

קראתי הגדרות כמו

  const int ledPin = 9;  

וגם

  #define ledPin 9 

אני יודע שהגדרה כמו

  int ledPin = 9;  

היא נוהג רע אם אתה ' אני לא מתכוון לשנות את זה (שבדרך כלל לא), אם כי ראיתי את זה כמה פעמים בתוכניות ארדואינו. איזו אחת מהשניים האחרים מעדיפה?

ארבע תשובות:
user8688
2015-04-27 12:06:32 UTC
view on stackexchange narkive permalink
עדיף

#define ledPin 9 . על ידי ביצוע int ledPin = 9; תקצה זיכרון int שערכו משמש בכל פעם שאתה משתמש ב- ledPin . #define שונה במובן שהוא לא מקצה זיכרון. אין זיכרון שנקרא ledPin . לפני הידור כל ה- "ledPin" בקוד (למעט מחרוזות) מוחלפים ב 9 . אז בעצם

digitalWrite(ledPin);

הופך

  digitalWrite (9);  

יתרונות #define : שומר זיכרון ומכיוון שכל ledPin מוחלף ב 9 לפני הביצוע , זה חוסך זמן מעבד.

לא ממש משנה בקודים קטנים ...

האם מהדרים משובצים באמת כל כך גרועים שהם לא עושים קיפול מתמיד כאשר משתמשים ב- 'const int'?
@chuu עד כמה שידוע לי Arduino משתמש ב- gcc עבור avr. אז זה בהחלט צריך להיות מותאם במיוחד. התשובות כאן לא מראות הרבה הבנה של תרגול טוב ב- C ++
ב- C ++, עדיף 'const int ledPin = 9;' על פני שתי אפשרויות אחרות. זה לא יקצה זיכרון עבור 'int' אלא אם תגדיר לו מצביע איפשהו, שאיש לא יעשה.
Const int מקצה זיכרון @jfpoilpret. #define לא תופס שום זיכרון כי זה רק שם סמלי של ביטוי ולא שם של זיכרון ...
בדוק קישור זה http://www.cplusplus.com/forum/beginner/28089/ וראה בעצמך. אחרת פשוט בצע את הבדיקה עם Arduino IDE: בדוק את גודל הנתונים עם const ועם #define.
#define הוא אפילו לא סוג נתונים לתפוס מקום. הקישור לא אומר שום דבר על הזיכרון. בכל מקרה זה מציין את היתרון של const מבחינת היקף ...
Peter Bloomfield
2015-04-27 14:19:19 UTC
view on stackexchange narkive permalink

בקפדנות, הגישה #define תשתמש במעט פחות זיכרון. ההבדל הוא בדרך כלל זעיר. אם אתה צריך להפחית את השימוש בזיכרון, ככל הנראה אופטימיזציות אחרות יהיו יעילות בהרבה.

טיעון לטובת שימוש ב- const int הוא סוג בטיחות . בכל מקום שאתה מתייחס למספר הסיכה הזה לפי משתנה, אתה יודע בדיוק איזה סוג נתונים אתה מקבל. ניתן לקדם / להמיר אותו באופן מרומז או מפורש על ידי הקוד המשתמש בו, אך עליו להתנהג בדרכים ברורות מאוד.

לעומת זאת, הערך ב #define פתוח. לפרשנות. ברוב המכריע של הזמן, זה כנראה לא יגרום לך בעיות בכלל. אתה רק צריך להיות קצת זהיר אם יש לך קוד שמניח הנחות לגבי סוג הערך או גודלו.

באופן אישי, אני כמעט תמיד מעדיף בטיחות סוג, אלא אם כן יש לי צורך רציני מאוד לחסוך בזיכרון.

הייתי במחנה #define עד שקראתי את התשובה של פיטר. מניח שאני יודע מי ישחזר קוד בסוף השבוע. ;)
rykien
2015-04-27 22:28:15 UTC
view on stackexchange narkive permalink

כנראה שהדרך הטובה ביותר תהיה
const uint8_t LED_PIN = 9; // עשוי לדרוש #include <stdint.h>
או
const byte LED_PIN = 9; // ללא צורך לכלול
const un חתום char LED_PIN = 9; // באופן דומה
השם נמצא באותיות גדולות לפי הנוהג הכללי ב- C ++ (ואחרים) לשם קבוע. זה לא אמור להשתמש בשום זיכרון RAM בפני עצמו, ולהשתמש בערך בת אחד של זיכרון תוכנית לשימוש. קודמו למספרים שלמים חתומים גדולים יותר (לא בטוחים לחלוטין בנושא זה), אם כי סביר להניח שזה לא יקרה עם מספרי סיכה.

JRobert
2015-04-27 19:30:32 UTC
view on stackexchange narkive permalink

לא רק

  const int ledPin = 9;  

יקח זיכרון RAM, אך במקרה זה, ישתמש בזיכרון רב יותר מהנדרש כ digitalWrite (uint8_t, uint8_t) זקוק רק לארגומנטים של בת אחד, ו- int הוא בדרך כלל שני בתים (תלוי מהדר, אך אופייני). שים לב שאתה יכול לתת לסוג המילולי סוג מפורש ב- #define:

  #define ledPin ((int) 9) 

אם כי בהקשר כזה כטיעון פונקציה שבו נדרש סוג ספציפי (מכיוון שהפונקציה עשתה אב טיפוס כהלכה!) הוא אוויק באופן מרומז או יקבל הודעת שגיאה אם ​​הסוגים אינם תואמים.

@DrivebyDownvoter, היית מגיב על הסיבות שלך?


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...