Функция с переменным количеством входных параметров?
- Войдите на сайт для отправки комментариев
Есть некая функция, которая используется во многих местах и нормально работает.
Пусть для примера:
void func(int Param1, int Param2) {
...
}
Но есть потребность ввести в эту функцию усовершенствование - обработку еще одного параметра (для всех мест, где функция используется - можно оставить как есть).
Как написать функцию, которая бы объявлялась так же, но с большим количеством параметров (пусть будет 3 параметра вместо двух),.. и если вызов фукнции осуществляется "по-старому" (с 2 параметрами) - то значение третьего параметра бы как-то внутри функции определялось (пусть "нулем" будет)?
Понятно, что можно написать другую фукнцию, но как-то этот подход не очень нравится.
Можно пробежаться по всему коду и там, где есть вызов функции - дополнить еще одним параметром, но этот вариант тоже как-то не по душе.
void func( int param1, int param2, int param3 = 0 )
это описание функции. Третий параметр, если не указан будет равен 0
Вот и я так предполагал. Но не работает:
void setup() { } void loop() { func(2, 3); } void func(int a, int b, int c = 5) { return a+b+c; }Компилятор ругается, что функция func не определена. Но ведь как-то же это делается...
Функция ДОЛЖНА быть описана ДО её вызова. Понятно, что ругается.
Всё получится ;)
Еще вариант, может где пригодится:
void func( intparam1, int param2, int param3 = 25 ); void setup() { Serial.begin( 57600 ); func( 2,3 ); } void func( intparam1, int param2, int param3 ) { if( 25 == param3 ) { Serial.println( "Yesss!" ); } }Т.е. Вы сначала объявляете функцию (какие у неё параметры и что она возвращает, тогда компилятор знает заранее, как вызывать эту функцию. А уж потом где нибудь, само тело функции, но в нем уже нельзя указывать int param3 = 25, компилятору не понравится.
Спасибо :) понял.
Ну, уж если извращаться, так до конца.
Попробуйте еще вот такой вариант (функция с неограниченным числом параметров):
float average (int counter, ...) { va_list ap; int next=0, sum=0, i=counter; if (counter==0) return 0.0; va_start(ap,counter) ; while (i--) { next = va_arg(ap,int) ; sum += next; } va_end (ap); return (float) sum/counter; } void setup() { float b; Serial.begin(9600); b = average(2,1,2); Serial.print("b[2]: "); Serial.println(b,4); b = average(3,1,2,3); Serial.print("b[3]: "); Serial.println(b,4); b = average(4,1,2,3,4); Serial.print("b[4]: "); Serial.println(b,4); b = average(5,1,2,3,4,5); Serial.print("b[5]: "); Serial.println(b,4); } void loop() { }Ого, как интересно :) Спасибо! Очень полезные знания.