עבור לתוכן

טיפול במספר משתנה של ארגומנטים -- שפת C

Featured Replies

פורסם

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

  • תגובות 64
  • צפיות 5.9k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

ניסיתי משהו כזה:

#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;
}

int
main (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]

פורסם

שוב: בכל איטרציה של הלולאה, צריכה להיות רק קריאה אחת ל-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.

פורסם
  • מחבר

שים לב שכשאתה עושה דבר כזה:

  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)

:nixweiss:

פורסם
  • מחבר

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


#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;
}

int
main (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;
}

פורסם

אני חוזר ואומר:

קרא ל-va_arg רק פעם אחת בכל איטרציה.

פורסם
  • מחבר

אני לא יכול כי גם אם אני אציב את ה-

next_num = va_arg(mylist, int);

לפני ה- while במקום בתוכו, זה יעבוד טוב רק בפעם הראשונה ובשנייה כבר אקבל תוצאות שגויות לגמרי...

פורסם

לא הבנתי בדיוק למה התכוונת. תעלה את הקוד.

אין שום בעיה לקרוא ל-va_arg פעם אחת מחוץ ללולאה ועוד פעם אחת בכל איטרציה. הבעיה היא כשאתה קורא ל-va_arg כמה פעמים בכל איטרציה.

פורסם
  • מחבר

הקוד:


#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;
}

int
main (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;
}

פורסם

אוקי, ב-while אתה קורא את va_arg ובודק שהוא לא 1-.... אבל אז אתה זורק אותו לפח.

פורסם
  • מחבר

איך אני אמור להשתמש בו יותר ממה שאני משתמש בו עכשיו למטרת ריצה על הארגומנטים ברשימה שלי עד אותו ה- 1-?

פורסם

num = va_arg(mylist, int);
while (num != -1) {
// do something with num here
num = va_arg(mylist, int);
}

יש מבין?

פורסם
  • מחבר

שיניתי בהתאם והפעם עובד בשתי איטרציות אבל בשלישית נופל.. :nixweiss:


#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;
}

int
main (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]

פורסם

כשאתה עושה lowest_num=frst, אתה מאבד את הערך שלו מההפעלות הקודמות של הפונקציה. למעשה, זה כאילו לא הגדרת אותו להיות סטטי בכלל.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים