פורסם 2010 בינואר 2115 שנים פשוט תחזיק שני משתנים - אחד עבור הארגומנט הנוכחי, ואחד עבור הארגומנט הקודם, וכל איטרציה תקדם אותם בהתאם.
פורסם 2010 בינואר 2115 שנים מחבר ניסיתי משהו כזה:#include <stdarg.h>#include <stdio.h>int lowest_ever (int frst,...){ va_list mylist; int lowest_num; va_start (mylist, frst); /*Initialize the argument list*/ lowest_num =frst ; while(va_arg(mylist, int)!=-1) { if (lowest_num > va_arg (mylist, int)) lowest_num = va_arg (mylist, int); else va_arg (mylist, int); } va_end (mylist); /*Clean up */ return lowest_num;}intmain (void){ /*This call prints 3*/ printf ("%d\n", lowest_ever (3, 5, 5, 6, -1)); /*This call prints 1*/ printf ("%d\n", lowest_ever (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1)); return 0;}הבעיה שהיא עובדת מעולה אבל רק בקריאה הראשונה מה-main כי בקריאה השניה היא כבר מאבדת את עצמה (צירפתי קובץ), ואין לי מושג למה... :'([attachment deleted by admin]
פורסם 2010 בינואר 2115 שנים שוב: בכל איטרציה של הלולאה, צריכה להיות רק קריאה אחת ל-va_arg. כאן בכל איטרציה יש לך שלוש קריאות (אחת בתוך ה-while, אחת בתוך ה-if ואחת שמתבצעת אחרי ה-if).שים לב שכשאתה עושה דבר כזה: if (lowest_num > va_arg (mylist, int)) lowest_num = va_arg (mylist, int);אז הארגומנט שאתה משווה אליו את lowest_num והארגומנט שאתה שם את ערכו ב-lowest_num הם ארגומנטים שונים.אגב, שכחת לעשות את lowest_num שיהיה static.
פורסם 2010 בינואר 2115 שנים מחבר שים לב שכשאתה עושה דבר כזה: if (lowest_num > va_arg (mylist, int)) lowest_num = va_arg (mylist, int); אז הארגומנט שאתה משווה אליו את lowest_num והארגומנט שאתה שם את ערכו ב-lowest_num הם ארגומנטים שונים. לפי מה שאתה אומר, אסור לי לעשות השוואה של משהו עם va_arg (mylist, int) כי אז בעצם למרות שאני רק משווה לצורך בדיקה אני מפעיל את הפונקציה... אז כאילו שאין דרך לפתור את הבעיה הרי אני לא יכול לשאול האם האיבר הבא גדול \ קטן בלי להפעיל את הפונק' va_arg (mylist, int)
פורסם 2010 בינואר 2115 שנים מחבר בדיוק בזמן שרשמת את זה, זה עלה לי בראש אבל עכשיו בכלל אין הדפסה על המסך, למרות שאני מרגיש שהתקרבתי קצת באמת... #include <stdarg.h>#include <stdio.h>int lowest_ever (int frst,...){ va_list mylist; static int lowest_num, next_num; va_start (mylist, frst); /*Initialize the argument list*/ lowest_num =frst ; while (va_arg(mylist, int)!=-1) { next_num = va_arg(mylist, int); if (next_num >lowest_num) next_num = lowest_num; } va_end (mylist); /*Clean up */ return lowest_num;}intmain (void){ /*This call prints 3*/ printf ("%d\n", lowest_ever (3, 5, 5, 6, -1)); /*This call prints 1*/ printf ("%d\n", lowest_ever (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1)); return 0;}
פורסם 2010 בינואר 2115 שנים מחבר אני לא יכול כי גם אם אני אציב את ה- next_num = va_arg(mylist, int); לפני ה- while במקום בתוכו, זה יעבוד טוב רק בפעם הראשונה ובשנייה כבר אקבל תוצאות שגויות לגמרי...
פורסם 2010 בינואר 2115 שנים לא הבנתי בדיוק למה התכוונת. תעלה את הקוד.אין שום בעיה לקרוא ל-va_arg פעם אחת מחוץ ללולאה ועוד פעם אחת בכל איטרציה. הבעיה היא כשאתה קורא ל-va_arg כמה פעמים בכל איטרציה.
פורסם 2010 בינואר 2115 שנים מחבר הקוד:#include <stdarg.h>#include <stdio.h>int lowest_ever (int frst,...){ va_list mylist; static int lowest_num=0, next_num; va_start (mylist, frst); /*Initialize the argument list*/ lowest_num =frst ; next_num = va_arg(mylist, int); while (va_arg(mylist, int)!=-1) { if (next_num >lowest_num) next_num = lowest_num; } va_end (mylist); /*Clean up */ return lowest_num;}intmain (void){ /*This call prints 3*/ printf ("%d\n", lowest_ever (3, 5, 5, 6, -1)); /*This call prints 1*/ printf ("%d\n", lowest_ever (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1)); return 0;}
פורסם 2010 בינואר 2115 שנים אוקי, ב-while אתה קורא את va_arg ובודק שהוא לא 1-.... אבל אז אתה זורק אותו לפח.
פורסם 2010 בינואר 2115 שנים מחבר איך אני אמור להשתמש בו יותר ממה שאני משתמש בו עכשיו למטרת ריצה על הארגומנטים ברשימה שלי עד אותו ה- 1-?
פורסם 2010 בינואר 2115 שנים num = va_arg(mylist, int);while (num != -1) { // do something with num here num = va_arg(mylist, int);}יש מבין?
פורסם 2010 בינואר 2115 שנים מחבר שיניתי בהתאם והפעם עובד בשתי איטרציות אבל בשלישית נופל.. #include <stdarg.h>#include <stdio.h>int lowest_ever (int frst,...){ va_list mylist; static int lowest_num=0, next_num; va_start (mylist, frst); /*Initialize the argument list*/ lowest_num =frst ; next_num= va_arg(mylist, int); while (next_num!=-1) { if (next_num <lowest_num) lowest_num= next_num; next_num = va_arg(mylist, int); } va_end (mylist); /*Clean up */ return lowest_num;}intmain (void){ /*This call prints 5*/ printf ("%d\n", lowest_ever (90, 78, 5, 20, -1)); /*This call prints 2*/ printf ("%d\n", lowest_ever (70, 40, 2, -1));/*This call prints 2*/ printf ("%d\n", lowest_ever (40, 30, -1)); return 0;} [attachment deleted by admin]
פורסם 2010 בינואר 2115 שנים כשאתה עושה lowest_num=frst, אתה מאבד את הערך שלו מההפעלות הקודמות של הפונקציה. למעשה, זה כאילו לא הגדרת אותו להיות סטטי בכלל.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.