#1 2016-06-30 08:54:04

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Проблема с вызовом функций из секции setup

В ходе работы наткнулся на неприятность. Не работает такая конструкция:

void setup(){
.....
if (analogRead(ButonsPin) < 100) Set_Time_and_Date;
.....
}

void Set_Time_and_Date(){
.....
}

void loop() {
....
}

Если тело функции Set_Time_and_Date перенести в setup под оператор if - все работает. Так должно быть?

Неактивний

#2 2016-06-30 10:58:30

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Проблема с вызовом функций из секции setup

void Set_Time_and_Date(void);



void setup(){
.....
if (analogRead(ButonsPin) < 100) Set_Time_and_Date ();
.....
}

void Set_Time_and_Date(){
.....
}

void loop() {
....

}

[change]
Не работает такая конструкция? ) точки не правильно интерпретирует компилятор?
компилятор должен знать  что за функция Set_Time_and_Date,  объявите ее заранее,
бывает что не нужно, не в strict ANSI  такое нужно

[add]
действительно фигню написал непонятную )

Arduino IDE  ( Wiring ) это какой себе не строгий С++,
и можно себе позволить объявление функций в любом "месте" ( наверное, не проверял %) )

Остання редакція NoName (2016-07-11 09:34:15)

Неактивний

#3 2016-07-09 19:57:44

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Проблема с вызовом функций из секции setup

Не соглашусь с NoName. Тема видимости переменных и функций хорошо изложена в любом учебнике по Си. То есть если тело находится не внутри другой функции ( в т.ч. setup(), loop() ) она становится внешней и не важно где Вы ее используете до описания тела или после. Я например все внешние функции пишу после loop() и никогда не было проблем использования их в setup или loop. Вопрос в другом, язык wiring имеет некоторые особенности и как мне кажется в том числе синтаксические (в некоторых случаях фигурные скобки очень важны). Я ОЧЕНЬ бы не рекомендовал использовать  синтаксическую конструкцию:
if (условие) функция;
Думаю что эта "вольность" Си Вас и подводит. Напишите по "правильному":
if (условие){
функция;
......;
}
Тоесть:
if (analogRead(ButonsPin) < 100) {
Set_Time_and_Date ();
}

Остання редакція Nefreemen (2016-07-09 20:01:56)

Неактивний

#4 2016-09-17 21:10:26

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Проблема с вызовом функций из секции setup

Долго не отписывал, так так прибор находится в машине, времени на эксперименты не было, а машина без него не едет.
Вобщем работает все, независимо от того где располагать тело функции и как писать с {} или без них. Это я лоханулся при написании кода и на компиляцию пошел вариант как в 1-м сообщении (без скобок после Set_Time_and_Date), но самое интересное, что компилятор не ругнулся. Видимо имя Set_Time_and_Date где-то уже объявлено в недрах системных библиотек или х.з. чем Wiring нравится Set_Time_and_Date, что он молча проглотил все это. Специально убираю любую букву из Set_Time_and_Date и, вуаля, компилятор начинает ругаться.

Ось так от х@йня, малята.
(С) Дід Панас.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму