我有一個可變引數的函式,在這個函式中需要根據傳入的引數計算出結果,然后再把結果傳個下一個可變引數。由于結果的個數不好確定,所以不知道該怎么傳遞到下一個函式。
以前有人說過類似的問題,但是那是直接把可變引數傳遞給下一個函式,所以和我這個問題有不同。
下面是寫的一個例子程式,請大俠幫忙看看,謝謝!
int SumEx(int iCnt, ...)
{
va_list pArgs;
va_start(pArgs, iCnt);
int iSum = 0;
for (int i = 0; i < iCnt; i++)
{
int iData = va_arg(pArgs, int);
iSum += iData;
printf("第%d個引數=%d\n", i, iData);
}
va_end(pArgs);
printf("引數個數=%d,和= %d\n", iCnt, iSum);
return iSum;
}
int Sum(int iCnt,...)
{
va_list pArgs;
va_start(pArgs, iCnt);
int *piSum = new int[iCnt];
memset(piSum, 0, sizeof(int)* iCnt);
for (int i = 0; i < iCnt; i++)
{
INT8 *pBufferNew = va_arg(pArgs, INT8*);
int iLen = va_arg(pArgs, int);
for (int j = 0; j < iLen; j++)
{
piSum[i] += pBufferNew[j];
}
}
va_end(pArgs);
//把piSum中的值一個一個的傳入Sum1
int iSum = SumEx(iCnt, );//這個地方的引數該怎么寫呢?
delete piSum;
piSum = NULL;
return iSum;
}
uj5u.com熱心網友回復:
你不一定非要用這種方式去給第二個可變引數的函式賦值,你可以定義一個容器,來容納它的不確定性,在第一個函式里把結果放到容器里,然后傳遞參考給下一個函式,這樣就不存在呼叫函式時需要給定引數個數的問題了,下一個函式直接遍歷容器就知道有幾個引數和值了。uj5u.com熱心網友回復:
這種方法也是可以的,但是我是想SumEx是已經寫好的函式,想直接重用,如果用你的方法的話,就得重新寫SumEx函式。
uj5u.com熱心網友回復:
把pArgs或者其備份作為引數傳到呼叫的函式里面怎么樣?uj5u.com熱心網友回復:
你這個不是使用可變引數的地方,而是使用陣列的地方,就是陣列的長度輸入而已吧uj5u.com熱心網友回復:
既然 piSum 是陣列, 當然就應該是一個 “以陣列為引數的函式”,二不是 “可變引數個數的函式”。
這兩者的區別是:
“可變引數個數的函式”是: 在函式定義的時候不知道有幾個引數, 但是在呼叫函式的地方明確知道有幾個引數。
“以陣列為引數的函式”是: 函式在定義的時候, 和呼叫的時候都不知道有幾個資料, 要運行的時候才知道有幾個資料。
而他本質上是整個不確定的資料打包成了一個 陣列引數。
這樣, 引數的個數確定了, 但是資料的個數是可變的。
uj5u.com熱心網友回復:
如果SumEx已經確定就是可變引數的形式(比如這個函式是別人開發的),那么你只能這樣
int iSum = 0;
switch(iCnt)
{
case 1: iSum = SumEx(iCnt, piSum[0]); break;
case 2: iSum = SumEx(iCnt, piSum[1]), piSum[1]); break;
case 3: iSum = SumEx(iCnt, piSum[1]), piSum[1], piSum[2]); break;
case 4: iSum = SumEx(iCnt, piSum[1]), piSum[1], piSum[2], piSum[3]); break;
// .......
}
uj5u.com熱心網友回復:
我的理解是你想傳可變引數是吧。va_list pArgs;用這個做為引數就可以了。uj5u.com熱心網友回復:
這個有難度, va_arg等宏是根據函式堆疊(第一個可變引數)的地址來計算出其余的可變引數的地址的,如果引數串列資訊不對(堆疊記憶體資訊不足),那根本沒法正確取得。所以呼叫者不能寫成正確的格式(正確的格式如6L所說,那得多累),va_arg是拿不到引數的。
所以這種情況還是重新寫個函式直接傳入你的陣列為好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71288.html
標籤:C++ 語言
