עבודה עם ADDWATCH בשפת c

just accidental

New member
עבודה עם ADDWATCH בשפת c

שלום, אשמח לעזרה קלה ממישהו שמבין בתוכנה visual studio. זקוקה להסבר כיצד עוברים עם ADDWATH. צריכה לשנות ערך המוחזר מפונקציה (שאינו מוחזר כמשתנה) ועל כן אין לי אפשרות לשנותו דרך חלונית ה-Locals. הבנתי שאני צריכה להוסיף ADDWATCH על ה-return המתאים מהפונקציה אך בחלונית מופיעה לי שגיאה על ה-return שלא מראה לי את הערך המחושב ולא מאפשרת לי לשנותו . האם מישהו כאן יודע להסביר את סדר הפעולות ומה גורם לי לא להצליח לראות את הערך?

תודה מראש!
 

freak2100

New member
למה לשנות?

watch כשמו כן הוא - מטרתו לראות ערכים של דברים.
למה את רוצה לשנות את הערך המוחזר בזמן debugging? את עושה unit testing ידני? אם כן - אל תעשי את זה. תכתבי unit testing אמיתי עם framework נורמלי (כמו gtest), זה יעשה לך את החיים קלים.
 

ברנדל

New member
תשובה

1. את לוחצת עכבר ימני על המשתנה בתוך הקוד ובוחרת ב add watch מתוך התפריט.
2. נפתח לך חלון של watch עם כל המשתנים שהוספת בינתיים לחלון ה add watch מסודרים בתוך טבלה של name value
3. את הולכת למשתנה שהוספת בתוך הטבלה (מקליקה שם עם העכבר) ומשנה את הערך שלו בתוך ה value (עריכה פשוטה)
4. את לוחצת enter ואז הערך משתנה.
 

just accidental

New member
תודה רבה, אשמח לשאלה נוספת

מדובר בשאלה שצירפתי בתור קובץ. הפלטים המבוקשים הם עבור הזנת הערכים 1,4,10,25,42,66,100,150. החל מקלט 42 התוכנית פשוט נעצרת, ואני לא מקבלת את הערך המוחזר, יש אפשרות אולי להסביר לי מדוע לפונקציה יש בעיה עם הערכים 42,66,100,150?

אשמח לתשובה מכל היודע, תודה!!!
 

freak2100

New member
לדעתי, היא לא נעצרת,

פשוט לוקח לה המון (המון) זמן לרוץ. כמה זמן חיכית?
 

just accidental

New member
נכון!! תודה רבה! זו בהחלט הסיבה

הפלטים תקינים, בגלל הרקורסיה לוקח לפלט זמן מה להיות מחושב.. עבור 42 לקח לי כ-10 דק'.. שכחתי פשוט שהתוכנית עדיין רצה.
תודה רבה
 

just accidental

New member
תודה רבה

יש דרך לייעל את הקוד שלי? ועדיין להשאיר את רעיון הרקורסיה?
 

freak2100

New member
זה בדיוק מה שעשיתי בקוד שצירפתי...

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

just accidental

New member
וואו, איזה יעול של הקוד!

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

freak2100

New member
אם את כבר עוברת עליו,

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

just accidental

New member
תודה!!

הבנתי ש-enum הוא טיפוס חדש, שמוחלף בשם bool . ניסיתי לשנות את השם למשהו אחר, מדוע זה לא נתן לי?
אני לא רואה שימוש ב-bool בקוד, האם משפט ה-typedef כולו קריטי? הערך היחיד מ-bool הוא TRUE

/*isMemorized[n] = TRUE;*/
למה בעצם לא כתבת bool.TRUE?

בנוסף, האם בתיעוד אני יכולה לרשום ששני המערכים הסטטיים הם מערכי עזר שתפקידם לשמור את הערכים עבור האינדקסים הקודמים? כי ב-return השונים במהלך הקריאות (כשנפתחות הרבה קריאות) בעצם חוזרים לאינדקסים שכבר חישבנו להם את הערכים המתאימים בקריאות קודמות.
 

freak2100

New member
כן, זו בדיוק המטרה של מערכי העזר

אני משתמש ב-bool בשורה:

static bool isMemorized[MAX_MEMO] = {0};

עכשיו, שימי לב שאני משתמש ב"טריק" קטן, שהערך הראשון של ה-enum, אלא אם מגדירים אחרת, הוא 0, ו-0 הוא false בביטוי בולאני. בגלל זה ה-FALSE וה-TRUE שהגדרתי תופסים עבורים ביטויים בולאנים (בדיקה עם if, למשל).
לא כתבתי bool.TRUE כי לא ככה עובדים enum-ים בשפת C. יש שפות, כמו JAVA למשל, ששם זה באמת ככה.
 

just accidental

New member
אני עובדת עם visual studio

מכירה רק את שפת C

וממש תודה על הידע שהפגנת, למדתי עוד כמה דברים ודרכי התייעלות! לא הכרתי את העבודה עם enum עד עכשיו. אני אכתוב גם שכל תא שערכו TRUE במערך isMemorized הוא בעצם "דגל" להחזרת הערך שנמצא באינדקס המתאים במערך השני ששומר על הערכים שכבר חושבו.
עדיין לא הבנתי כל כך דבר אחד.. הטיפוס bool של איברי מערך isMemorized (שבקריאה ראשונה מאותחלים ל-0) בעצם מאפשר שאיברי המערך יהיו לאורך ריצת התוכנית רק TRUE או FALSE?
 

freak2100

New member
כן ולא.

המשמעות של bool, שהוא למעשה enum, היא בעיקר סמנטית. למעשה מדובר ב-int רגיל, אבל המתכנת יודע שזה bool ולכן הוא מציב בו רק TRUE או FALSE.
דרך התייעלות אפשרית, היא למשל להגיד שאם יש לנו רק שני ערכים אפשריים - TRUE שהוא בעצם 1 ו-FALSE שהוא בעצם 0 - אנחנו יכולים לשמור משתנה ב-bit אחד. זה אומר ש-int אחד שומר 32 משתנים כאלה, זה חסכון אדיר במקום. במקרה שלך לא היית מרגישה בכלל בהבדל, אבל לפעמים אלה דברים חשובים. לממש את זה זה קצת יותר מורכב.
בעצם, enum משמש רק לקריאות של הקוד. תסתכלי על שתי השורות הבאות ותגידי מה יותר יפה:

int today = 0;
// OR...
day today = SUNDAY;

באיזו אפשרות את מבינה מה המתכנת רצה לעשות?
 

freak2100

New member
בעקרון...

בשפת C++, ובשפת C החל מתקן C99, יש טיפוס מסוג bool, ומוגדרים הקבועים true ו-false.
ב-ANSI C, שזה ה-C הישן יותר, אין טיפוס כזה וקבועים כאלה, ולכן יוצרים אותם בצורה מלאכותית עם השורה הזו של ה-typedef וה-enum.
אני לא יודע באיזה קומפיילר את עובדת, הוספתי את זה ליתר ביטחון.
 
למעלה