我的程式中有一個函式double max(int count, ...)。這個函式應該回傳最大的數字,但它會報告-31 > 6. 我的錯誤在哪里?我正在努力學習va_。我怎樣才能解決這個問題?
double max(int count, ...)
{
double max = INT_MIN, test;
int i;
va_list values;
va_start(values, count);
for (i = 0; i < count; i)
{
test = va_arg(values, double);
if (test > max)
{
max = test;
}
}
va_end(values);
return max;
}
int main()
{
printf("%ld", max(5, 1, 6, -31, 23, 24));
return 0;
}
uj5u.com熱心網友回復:
您正在呼叫未定義的行為。您沒有將double值傳遞給max(),而是在傳遞int值。 int并且double在記憶體中的大小不同,并且va_arg()無法像讀取int引數一樣讀取引數 a double,反之亦然。您需要正確匹配型別。
在此示例中,將所有doubles 更改為ints,例如:
int max(int count, ...)
{
int max = INT_MIN, test;
va_list values;
va_start(values, count);
for(int i = 0; i < count; i)
{
test = va_arg(values, int);
if(test > max)
{
max = test;
}
}
va_end(values);
return max;
}
int main()
{
printf("%d", max(5,1,6,-31,23,24));
return 0;
}
在線演示
否則,將ints 改為doubles,例如:
double max(int count, ...)
{
double max = -DBL_MAX, test;
va_list values;
va_start(values, count);
for(int i = 0; i < count; i)
{
test = va_arg(values, double);
if(test > max)
{
max = test;
}
}
va_end(values);
return max;
}
int main()
{
printf("%lf", max(5,1.0,6.0,-31.0,23.0,24.0));
return 0;
}
在線演示
無論哪種方式,您都可能會考慮在處理max值的方式上稍微改變邏輯。您應該將其初始化為傳入的第一個值,例如:
<type> max(int count, ...)
{
if (count <= 0)
return <default value>;
va_list values;
va_start(values, count);
<type> max = va_arg(values, <type>), test;
for(int i = 1; i < count; i)
{
test = va_arg(values, <type>);
if (test > max)
{
max = test;
}
}
va_end(values);
return max;
}
另外,請注意,以上所有內容都是 C 處理事物的方式。但是您還將您的問題標記為 C ,而處理此問題的 C 方法是使用可變引數模板而不是省略號(即va_arg()不需要),或者采用 astd::initializer_list或至少一對iterators 以便您可以制作使用標準std::max_element()演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495532.html
