Функция с переменным количеством входных параметров?

ustas
Offline
Зарегистрирован: 12.03.2012

Есть некая функция, которая используется во многих местах и нормально работает.

Пусть для примера:

void func(int Param1, int Param2) {
   ...
}

Но есть потребность ввести в эту функцию усовершенствование - обработку еще одного параметра (для всех мест, где функция используется - можно оставить как есть). 

Как написать функцию, которая бы объявлялась так же, но с большим количеством параметров (пусть будет 3 параметра вместо двух),.. и если вызов фукнции осуществляется "по-старому" (с 2 параметрами) - то значение третьего параметра бы как-то внутри функции определялось (пусть "нулем" будет)?

Понятно, что можно написать другую фукнцию, но как-то этот подход не очень нравится.

Можно пробежаться по всему коду и там, где есть вызов функции - дополнить еще одним параметром, но этот вариант тоже как-то не по душе. 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

void func( int param1, int param2, int param3 = 0 )
это описание функции. Третий параметр, если не указан будет равен 0

ustas
Offline
Зарегистрирован: 12.03.2012

Вот и я так предполагал. Но не работает:

void setup() {
}

void loop() {
  func(2, 3);
}

void func(int a, int b, int c = 5) {
  return a+b+c;
}

Компилятор ругается, что функция func не определена. Но ведь как-то же это делается...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Функция ДОЛЖНА быть описана ДО её вызова. Понятно, что ругается.

Всё получится ;)

Еще вариант, может где пригодится:


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, компилятору не понравится.

 

ustas
Offline
Зарегистрирован: 12.03.2012

Спасибо :) понял. 

step962
Offline
Зарегистрирован: 23.05.2011

Ну, уж если извращаться, так до конца.

Попробуйте еще вот такой вариант (функция с неограниченным числом параметров):

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() {
}

 

ustas
Offline
Зарегистрирован: 12.03.2012

Ого, как интересно :) Спасибо! Очень полезные знания.