Как заполнить va_list
У меня проблемы с поиском ответа на мою "проблему".
Я создал функцию, которая принимает различное количество целых чисел ('findMinVal(int x, ...)') и возвращает наименьшее число во всех сделанных вызовах. сейчас моя программа получает аргументы прямо через код:
int main(){
printf("\nThe minimal number in each call for \"findMin\" is : \n");
findMinVal(90,78,5,20,-1);
findMinVal(70,40,2,-1);
findMinVal(40,30,-1);
return 0;
}/* main */
Я хотел бы, чтобы он принимал переменные из файла, но я не знаю, как я могу это сделать..? Любая помощь будет оценена.
2 ответа
Единственный стандартный способ составить список переменных параметров - это вызвать функцию, которая принимает его, передавая все параметры за раз.
findMinValInArray(int n, int a[]) {
switch(n) {
case 1: return findMinVal(a[0], -1);
case 2: return findMinVal(a[0], a[1], -1);
case 3: return findMinVal(a[0], a[1], a[2], -1);
case 4: return findMinVal(a[0], a[1], a[2], a[3], -1);
case 5: return findMinVal(a[0], a[1], a[2], a[3], a[4], -1);
case 6: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], -1);
case 7: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], -1);
case 8: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], -1);
case 9: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], -1);
case 0xA: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], -1);
case 0xB: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[0xA], -1);
case 0xC: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[0xA], a[0xB], -1);
case 0xD: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[0xA], a[0xB], a[0xC], -1);
case 0xE: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[0xA], a[0xB], a[0xC], a[0xD], -1);
}
}
В любом случае следует избегать varargs, если это возможно.
Хотя вы могли бы использовать varargs
как описано в Vovanium, гораздо лучше просто поменять findMinVal
функция, чтобы принять массив вместо. Например:
int findMinVal(size_t length, int * values){
/* Find minimum value...
(Hint: start with min = values[0] and the loop iterator with 1) */
}
Тогда назовите это так:
/* allocate values and fill it */
int min = findMinVal(length, values);