Функция с параметром по умолчанию

Senovik
Offline
Зарегистрирован: 06.10.2018

Добрый день!

Подскажите, можно ли реализовать функцию с параметром по умолчанию, который не обязательно передавать в функцию?

Сейчас есть такая функция для счётчика - передаю текущее значение и максимальное. Функция "щёлкает" до максимума, а потом начинает с нуля:

uint8_t nextCount(uint8_t Count, uint8_t MaxCount) {
  Count++;
  if (Count > MaxCount) Count = 0;
  return Count;
}
//пример вызова
  if (RightButton) Count = nextCount(Count, MaxCount);


Хочу добавить возможность передачи параметра - по сколько "щёлкать". ЧТобы в некоторых случаях можно было бы прибавлять по 3, 5, 10, 42...

При этом оставить текущее использование по умолчанию. То есть, при вызове nextCount с двумя параметрами - щёлкать по единичке. При вызове с тремя параметрами - прибавлять третий параметр.

Заранее спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

а чего бы не набрать  это самое в гугле? - "функция с параметров по умолчанию в Си"

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а если включить в тело функции:
 

if(step_count) {myStepCoun = step_count;step_count =0;}else{myStepCoun = 1;}

Оказалось всё ещё проще )))

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

а чего бы не набрать  это самое в гугле? - "функция с параметров по умолчанию в Си"

https://www.youtube.com/watch?v=aw10753OJyg

Senovik
Offline
Зарегистрирован: 06.10.2018

b707 пишет:

а чего бы не набрать  это самое в гугле? - "функция с параметров по умолчанию в Си"

Не хватает понимания отличий С, С++ и ObjC :) Это же ветка для новичков. 

Гугл пишет, что в С++ можно, в С и ObjC нельзя. При этом часто упоминаются ещё и разные компиляторы. Для ардуино же используется собственный компилятор, поэтому и решил спросить, точно ли нельзя? :) Поэтому и формулировка вопроса "... можно ли...?". 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

b707 пишет:

а чего бы не набрать  это самое в гугле? - "функция с параметров по умолчанию в Си"

https://www.youtube.com/watch?v=aw10753OJyg

как же тут не есть, после шести )))
https://youtu.be/Hexja4WoJ1s

Senovik
Offline
Зарегистрирован: 06.10.2018

ua6em пишет:

а если включить в тело функции:
 

if(step_count) {myStepCoun = step_count;step_count =0;}else{myStepCoun = 1;}

Оказалось всё ещё проще )))

Как переделать, используя третий аргумент функции - понятно. Просто не красиво почти везде вызывать эту функцию с передачей единички, чтобы в одном месте вызвать с другим значением.  

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

uint8_t nextCount(uint8_t Count, uint8_t MaxCount, uint8_t defCount = 1)

При вызове с двумя параметрами defCount будет иметь значение 1, при вызове с тремя - указанное в вызове значение.

Senovik
Offline
Зарегистрирован: 06.10.2018

v258 пишет:

uint8_t nextCount(uint8_t Count, uint8_t MaxCount, uint8_t defCount = 1)

При вызове с двумя параметрами defCount будет иметь значение 1, при вызове с тремя - указанное в вызове значение.

Спасибо большое, попробую!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

v258, таки избавили лодыря от необходимости запрос в гугле набрать :-)

Senovik
Offline
Зарегистрирован: 06.10.2018

ЕвгенийП пишет:

v258, таки избавили лодыря от необходимости запрос в гугле набрать :-)

Почему лодыря? Гугл 80% ответов ведёт на С++. Я не знаю, насколько советы по С++ применительны к ардуино.

Ещё введёт на вот такую вот ветку: https://ru.stackoverflow.com/questions/21128

Где чёткие ответы: "Нельзя.", "Вообще то дело не в коде, эта фича делается на этапе компиляции.", "во всех компиляторах, что есть у меня выдают ошибку. Единственный компилятор, что не не дал ошибку - это LC (он же LCC). Программа отработала верно при этом.". 

И прочие ответы из серии "на ObjC нельзя, можно на C++" и тд. Многие описания функций С (в тч на этом сайте) даже примерно не упоминают о такой возможности.

И как эти ответы отнести к ардуино я не знаю. 

По всем этим причинам формулировка вопроса была не "напишите как", а "можно ли?"

sadman41
Offline
Зарегистрирован: 19.10.2016

У Ардуино нет своего языка и компилятора. Присмотритесь - там GCC.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ЕвгенийП пишет:

v258, таки избавили лодыря от необходимости запрос в гугле набрать :-)

Это я сегодня после ночной, невыспатый )))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Senovik пишет:

Почему лодыря? Гугл 80% ответов ведёт на С++. Я не знаю, насколько советы по С++ применительны к ардуино.

На этом сайте, раздел Программирование, первый же абзац

Язык программирования устройств Ардуино основан на C/C++. Он прост в освоении, и на данный момент Arduino — это, пожалуй, самый удобный способ программирования устройств на микроконтроллерах.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Волшебное слово "пожалуй". Как много можно за ним скрыть. Наша фирма, пожалуй, лучший в мире поставщик... Вот кажется и не обманул. Даже если не лучшая, то пожалуй всё скрасит. Так с компилятором. Самый обычный GCC с дописанными процедурами вдруг стал языком ардуино.   

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Senovik пишет:

Почему лодыря?

Ну, откуда мне знать, почему Вы лодырь? Может воспитание такое, может ещё чего.

Senovik пишет:

Гугл 80% ответов ведёт на С++.

А на каком языке по-Вашему в Ардуино IDE люди программируют?

Senovik пишет:

Я не знаю, насколько советы по С++ применительны к ардуино.

Потому и не знаете, что лодырь - лень читать и учиться

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Потому и не знаете, что лодырь - лень читать и учиться

а мне было не лень, увидев пос b707 залез и прочитал, а ведь когда-то ранее читал жеж, но так как надобности не было, забыл, поэтому и пост #2 дополнил )))