Начал изучать подпрограммы (функции) и приехали...

pompx
Offline
Зарегистрирован: 04.12.2015

Всем, здравствуйте!

Начал изучать функции и...

В общем, не подскажете, почему не работает вот это?

int k=20;
int e;
int r;


void setup()
{
}


void fun(r) // функция (подпрограмма)
{
   e=r+1;
}



void loop()
{
   fun(k);
}

Ругается что-то в этом роде:

error: variable or field 'fun' declared void

'fun' was not declared in this scope

    fun(k);

         ^

exit status 1
variable or field 'fun' declared void

 

Замена типа функции "fun" с void на int (или любой другой) ничего не дает (мне, в принципе, нужен void). Стоит убрать аргументы (т.е. чтобы в скобках было пусто), все работает с любым типом функции.

 

Я, конечно понимаю, что вопрос идиотский, но что здесь не так? Никак не въеду... Подскажите новичку.

 

Спасибо!

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

void fun(int  r)

pompx
Offline
Зарегистрирован: 04.12.2015

Да, заработало... Но ведь я в третьей строке задал тип переменной "r". Получается, при работе с функциями тип переменной задается только таким образом?

Спасибо!

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
в третьей строке задал тип переменной "r"
Это разные переменные в 3 строке и в 11. По идее должно быть предупреждение компилятора о том, что переменная "r" в 3 строке нигде не используется.

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

pompx пишет:

Но ведь я в третьей строке задал тип переменной "r". 

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

Кстати, а по каким источникам изучаете? Если по примерам в сети и книгам типа "ардуино для чайников" - бесполезная трата времени. Берите серьёзную книгу по языку, например. такую.

pompx
Offline
Зарегистрирован: 04.12.2015

Благодарю!

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

Andy пишет:

По идее должно быть предупреждение компилятора о том, что переменная "r" в 3 строке нигде не используется.

А оно и есть, просто разработчики IDE по умолчанию поставили опцию "compiler.warning_level=none", чтобы "помочь начинающим", а то тех сильно болтовня компилятора смущает :))) Если заменить "none" на "all", можно узнать много интересного в т.ч. и о "стандартных" библиотеках.

pompx
Offline
Зарегистрирован: 04.12.2015

Еще раз спасибо, у меня все заработало! Книгу распечатаю и буду почитать...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Если заменить "none" на "all", можно узнать много интересного в т.ч. и о "стандартных" библиотеках.
не кажется ли Вам , сэр , что это новая тема для этюда очередного ?

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

SU-27-16 пишет:

Если заменить "none" на "all", можно узнать много интересного в т.ч. и о "стандартных" библиотеках.
не кажется ли Вам , сэр , что это новая тема для этюда очередного ?

Ну, там не так много материала.  А, главное, он не так уж и интересен. ну, понатыкали неиспользуемых параметров или там знаковые и беззнаковые переменные между собой сравнивают и что?

Я тут задолжал сообществу по памяти (обещал ведь продолжить и уж давненько не продолжаю). Вот как раз на этой неделе сделаю. Я буду в командировке, а по вечерам в гостинице делать нечерта (ну, не любитель я "пива до утра" и "платных подруг"). Возьму с собй "нанку", ноутбук всегда при мне - вот и займусь.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

командировка не в Питер ли ?

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

Почти :) Великий Новгород.

Кирилл Паника
Offline
Зарегистрирован: 29.08.2020

Здравствуйте. Не подскажите, что за книгу вы предложили? У меня ссылка не открывается.

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

Кернигана и Ритчи

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

На своём четвёртом году программирования в Arduino IDE решил попробовать передавать в функцию параметры, получил ошибку, загуглил и сразу набрёл на эту ветку:) 
В основном на РНР программирую и вот там такого делать не надо (объявлять в функциях тип входящих переменных). 

Кстати, если брать пример, описанный в 2016-том, то обычно передавал параметры в функцию так:

void loop()
{
r = k;  
fun();
}

и вполне себе всё устраивало. 

Green
Offline
Зарегистрирован: 01.10.2015

Ужас! Особенно к вам! Относительно вашего развития.(

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

Спасибо за столь оптимистичную оценку моих результатов. Сам я их оцениваю еще хуже.

На самом деле, зашёл просто спасибо написать за строчку:

Andy пишет:

void fun(int  r)


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

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

Weisnar пишет:
зашёл просто спасибо написать за строчку:
Andy пишет:

void fun(int  r)

Методом тыка до этого было бы проблематично догадаться.

А книжку по языку Си почитать - не ваш метод?

 

Цитата:
А вариант, как я передаю параметры в функцию через глобальные переменные - показал постом выше. Не знаю, насколько это нормально, но вполне себе работает.

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

Morroc
Offline
Зарегистрирован: 24.10.2016

Чтобы повторно код использовать. В простых реализациях бейсика тож такая фигня - подпрограмму вызвать можно, а вот передать/получить что нибудь через это нет.

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

Morroc пишет:

Чтобы повторно код использовать


Как раз размышлял над этим философским вопросом. Зачем функции, особенно, если они не изолированы.
В своё время программировал на ZX-Spectrum, так там ни функций, ни уж тем более объявления типа переменных. Бегаешь по программе с помощью GO TO и горя не знаешь. Зачем куда-то что-то передавать если и так всё глобальное.

Зачем функции... А просто, когда нету GO TO, то ничего другого и не остаётся, чтобы выполнять участки кода в произвольном порядке.

Относительно книг, обычно ищу решение какого-то конкретного вопроса. В Ардуино это не столько с Си связано, сколько с вопросами по использованию разных модулей. Как подключить, использовать и т.д.

nevkon
Offline
Зарегистрирован: 20.01.2015

Мне тоже после бейсика и паскаля си показался каким-то бешеным языком. Но ниче, разобрался немного.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Weisnar пишет:
Методом тыка до этого было бы проблематично догадаться.

Согласно известной теореме https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D1%85_%D0%BE%D0%B1%D0%B5%D0%B7%D1%8C%D1%8F%D0%BD%D0%B0%D1%85, шанс у вас есть.


Как тут ссылки под кат прятать? 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Weisnar пишет:
Зачем функции... А просто, когда нету GO TO

И это правильно! :-)

А на каком, простите, языке Вы сейчас пишете, что там goto нет?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Очевидно на русском :-)

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

Картинка из оф.мануала, между прочим:

https://www.php.net/manual/en/control-structures.goto.php

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

"... Если в течение продолжительного времени случайным образом стучать по клавиатуре, то среди набираемого текста будут возникать осмысленные слова, словосочетания и даже предложения".

Хорошая теорема, но мне обычно нужно или на сегодня или на вчера. В крайних случаях на завтра. В таких условиях, обычно, ничего нового не изучается и лепится из того, что знакомо. Но знаете, с практической точки зрения, такой подход очень эффективен.

А относительно языков программирования, всю аппаратную часть (ESP32, ESP8266, Atmega328, STM32f103) настраиваю через так называемый Wiring (Arduino IDE), серверная часть - PHP. Мобильные приложения конвертирую через JavaScript + PhoneGap. Для обработки больших массивов использую Excel и встроенный Visual Basic. Пару раз помогали студенты программисты, но они все, как один, хотят NodeJS (видать, в ВУЗах это сейчас ходовое).

P.S. Я вообще просто зашел написать спасибо, что тут отвечают на такие нубские вопросы вида "как вызвать функцию с параметрами". У меня лично больше вопросов нет. Всё работает, всем доволен.

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

Weisnar пишет:
мне обычно нужно или на сегодня или на вчера. В крайних случаях на завтра. В таких условиях, обычно, ничего нового не изучается и лепится из того, что знакомо. Но знаете, с практической точки зрения, такой подход очень эффективен.

не обманывайте себя. Таким подходом ничего. кроме костылей. примотанных изолентой - создать не получится... и называть такой подход "эффективным" - ну это себя не уважать.

И... если ситуация "решение нужно вчера" возникает регулярно - значит она предсказуема и изучить си явно было бы нелишне.

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

Абсолютли согласен. Всеми руками ЗА, чтобы специалисты именно так и делали. Основательно изучали свою сферу деятельности.

Про эффективность "костылей примотанных изолентой" спорить не стану. ИМХО вопрос философский. Для меня это основной жизненный принцип и "согласно известному закону, шанс у меня есть": https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9F%D0%B...

С вашего позволения, я ушел. А то не успеваю прибор на завтра скрутить-запрограммировать. Изолента то есть, но под солнцем отклеится. Придётся мудрить с пластиковыми стяжками;)

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

Weisnar пишет:
Придётся мудрить с пластиковыми стяжками;)

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

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

ua6em пишет:
чёрные, они ультрафиолет лучше держат и изоленту тоже чёрную, немецкую

Это не совсем по теме "Начал изучать программирование..." но по теме 

Уже слышал, что чёрный пластик проще сделать стойким к ультрафиолету. По этому, промышленные анемометры чёрные (к примеру). На практике же... Китайские серые комплектующие от домашних метеостанций простояли два сезона под открытым небом и вот уже третий используются, не рассыпались. С прошлого года печатаю прозрачным или белым PLA радиаторы для тех же датчиков температуры. Невероятно, но за прошлый сезон ничего с ними не случилось (если не считать, что бывают "умельцы", которые приделывают этим датчикам ноги). 

Нужно ли на улице использовать чёрный пластик и чёрную изоленту? ИМХО не принципиально в масштабах пары лет.