תכנון OOP

yair24

Member
תכנון OOP

שלום, אני צריך עזרה בתכנון של משהו פשוט: יש לי שדה מספרי על מסך TOUCH, כאשר המשתמש לוחץ על המסך מופיע לו לוח מקשים שהוא יכול להכניס מספר חדש וללחוץ ENTER. ברגע שהמשתמש לוחץ ENTER המסך שולח מחרוזת בRS232 בפרוטוקול מסוים המחרוזת מכילה את המספר החדש שהמשתמש הכניס. ככה זה עובד תמיד, כל פעם שמשנים את הערך של השדה ולוחצים ENTER המסך שולח מחרוזת. אוקי עכשיו מה שאני רוצה לעשות זה דבר כזה: אניצריך לקרוא את המספר החדש לשמור אותו באיזה משתנה וברגע שהמשתמש לוחץ על כפתור SAVE (גם כן במסך, דבר ששוב פעם גורר שליחת מחרוזת מסוימת מהמסך) אני צריך לשמור את הערך החדש לתוך זיכרון FLASH שיש לי. זה הכל, זאת הדרישה. איך אני עושה דבר כזה? בדרך כלל אני שם משתנה גלובאלי קורא לתוכו, וכשהמשתמש לוחץ SAVE אני שומר את המשתנה הגלובאלי. עכשיו, נמאס לי כבר לשים משתנים גלובאליים. ראתי פה מישהו שכתב שאפשר לעשות תכנון מונחה עצמים בC אני צריך רעיון איך אני שומר את הערך של השדה הזה בצורה כזו שהוא גם יישמר וכשילחצו SAVE יהיה לי מאיפה לקרוא אותו, מיותר לציין שאין לי מחלקות, ואין לי שום יכולת לתכנת בC++ הקומפיילר הזה לא יודע מה זה CLASS הוא לא יודע מה זה PUBLIC או PRIVTAE... יש פתרון? יאיר
 

nahsh

New member
סתם רעיון, תראה אם הוא מתאים לך

תיצור פונקציה בשם UpdateSomething ובתוכה משתנה סטטי Something. הפונקציה תנהל את השמירה לזכרון ועדכון המשתנה, שנמצא בתוך הסקופ שלה, אבל הוא לא "נעלם" ולא נדרס כשהפונקציה מסתיימת.
 

yair24

Member
רעיון יפה והאמת שחשבתי עליו

אולי יהיה לך פתרון לבעיה שנתקלתי בה: כשהמשתמש מעדכן את המספר הפונקציה קולטת את העידכון ועושה השמה למשתנה הסטטי. מה קורה כשהמשתמש לוחץ SAVE? איך המשתנה הסטטי הזה נשמר לFLASH? אני הרי לא יכול לגשת אליו מפונקציה אחרת... יאיר
 

nahsh

New member
תוסיף פרמטר בוליאני

void SaveNumber(unsigned char *NewNumber, Bool SaveInFlash) { static unsigner char TheNumber; ... .... if ( SaveInFlash ) { ...... } }​
 

yair24

Member
גם על זה חשבתי...

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

zagzagzag

New member
הצעה

// val.h void set(int val); int get(); // val.c #include "val.h" static int val; void set(int new_val) { val = new_val; } int get() { return val; }​
ועכשיו מי שרוצה להשתמש בערך הזה יעשה include לקובץ המתאים. אי אפשר לגשת ל-val בלי לבצע set או get. השאלה היא האם זה שווה את הטרחה. אם יש לך עוד כמה פעולות שאתה צריך לבצע על הערך הזה, או שאתה יודע שתצטרך כאלה בעתיד (למשל לשמור כמה ערכים ברשימה ממוינת), אולי כדאי לקבץ את כולן יחד ל-header הזה. אם לא, אני לא בטוח שזה באמת שווה את הטרחה...
 

yair24

Member
אוקי

אתה אומר בעצם שבגלל שאתה מגדיר את המשתנה בקובץ אחר אז אי אפשר לגשת אליו? האמת שיש לי די הרבה משתנים שצריך לשמור בפלאש ולבצע עליהם פעולות דומות למה שאמרתי ונראה לי שהרעיון שנתת יכול לעזור לי אני רק צריך לבדוק איך אני מממש את הדבר הזה כי הקומפיילר שלי לא יודע מה זה קבצי H יש לו קבצי LIB, ובהם אני חייב לעשות את המימוש של הפונקציות באותו קובץ. אין לי אפשרות לעשות PROJECT בקומיילר שלי אז אני לא יכול לעשות תוכנית שבנויה מכמה קבצי C המקסימום שאני יכול לעשות זה לעשות INCLUDE לקבצי LIB... הדרך שאתה מציע זה בעצם תיכנות מודולים בC לא? כאשר כל זוג של קובץ H וC ששיכים אחד לשני זה בעצם מודול? יאיר
 

DadleFish

New member
שים לב...

שהוא מוגדר static, ולכן אי אפשר לגשת אליו מתוך קובץ אחר.
 

DadleFish

New member
בוודאי

static על משתנה גלובלי אומר שהוא יהיה חשוף רק לקובץ בו הוא מוגדר, ואי אפשר יהיה לעשות מקובץ אחר extern ולהשתמש בו.
 
למעלה