如何在我的 Max(int num, ...) 中實作任意數量的引數,只有需要在 C 中比較的引數?我va_list從 C 庫中使用stdarg.h
我已經閱讀了 C programmng 中的 Variable number of arguments,但遺憾的是似乎沒有任何答案可以幫助我。由于是2018年的帖子,不知道4年后我的問題是否有解決方案。
我正在使用va_listC 庫stdarg.h中的來實作Max(). 在尋找最大值時,我必須使用for 回圈來檢索從第一個到最后一個的引數。這就是我卡住的地方。
我的目標是Max()僅使用需要比較其值的引數來實作。但是我找不到一種方法來阻止我的 for 回圈在到達最后一個引數后執行。網上最常見的打破for 回圈的解決方案是:
- 添加一個額外的引數,表示您傳入的引數數量,它告訴for 回圈回圈該次數
- 傳入一個數字,for 回圈的條件部分變為
false-> 跳出回圈(在下面的代碼中,我將引數-1作為最后一個引數傳遞給我的函式。當 for 回圈看到該值時,它就知道了已經到了爭論的結尾)
但是上述解決方案都需要額外的引數,我無法實作我的目標。那么有什么解決方案可以幫助我解決我的問題嗎?任何回應表示贊賞:)
#include <stdio.h>
#include <stdarg.h> // this library is required for infinite number of arguments
int Max(int num, ...){
va_list ap;
int temp;
va_start(ap,num);
int maximum = num;
for(temp = va_arg(ap,int); temp!= -1/*put condition here */; temp = va_arg(ap, int)){
if(temp > maximum){
maximum = temp;
}
}
va_end(ap);
return maximum;
}
int main(){
int maximum;
printf("the input vals are: 1 3 4 6 3 78 100\n");
maximum = Max(1,3,4,6,3,78,100, -1);
printf("maximum val: %d\n",maximum);
}
uj5u.com熱心網友回復:
C 標準沒有提供任何方法讓函式知道傳遞了多少個引數或哪個是最后一個。此類資訊必須由程式員提供。
您可以使用預處理功能來執行此操作。我們可以定義一個計算其引數的宏:
#define Max(...) \
Max(sizeof (int []) {__VA_ARGS__} / sizeof (int), __VA_ARGS__)
這將創建一個int用宏引數初始化的陣列型別的復合文字。然后它通過將陣列的大小除以一個元素的大小來計算引數的數量。然后它將這個大小和引數傳遞給Max函式。(注意,宏在自己的替換串列中是不會被替換的,所以Max宏的替換可以呼叫Max函式,不會造成重復替換。)
然后該函式必須將以下引數的數量作為其第一個引數:
int Max(size_t N, ...)
{
// Initialize "maximum seen so far" to identity element of max operation.
int maximum = INT_MIN;
va_list ap;
va_start(ap, N);
for (size_t i = 0; i < N; i)
{
int t = va_arg(ap, int);
if (maximum < t)
maximum = t;
}
va_end(ap);
return maximum;
}
注意在源代碼中函式定義必須出現在宏定義之前,這樣Max函式定義中就不會發生宏的替換。
必須至少給出一個值。可以使宏支持零引數,并對它和函式進行一些更改。
uj5u.com熱心網友回復:
在 的定義之后的某處添加這一行Max:
#define Max(...) Max(__VA_ARGS__, -1)
它將添加-1到引數串列的末尾,因此您不必這樣做。
作為旁注,-1對于像這樣的函式來說,這不是一個好的哨兵,Max因為-1它只是一個整數,不比任何其他整數更好或更差。如果我想找到Max(-5,32,8,-1,77,-11,141)怎么辦?我會讓你思考這個問題的可能解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523716.html
標籤:C功能可变函数
上一篇:創建函式以在R中繪圖
