טיפול במספר משתנה של ארגומנטים -- שפת C - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


iem

Recommended Posts

  • תגובות 64
  • נוצר
  • תגובה אחרונה

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

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

קישור לתוכן
שתף באתרים אחרים

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

next_num = va_arg(mylist, int);

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

קישור לתוכן
שתף באתרים אחרים

הקוד:


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

קישור לתוכן
שתף באתרים אחרים

שיניתי בהתאם והפעם עובד בשתי איטרציות אבל בשלישית נופל.. :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]

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...