Вопрос про изменение переменных из подпрограммы

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я начинающий ардуинец.

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

int x=1,y=2,z=0;
...
void loop();
{
...
z=x;
change(z);
x=z;
...
z=y;
change(z);
y=z;
...
}

void change(int _z)
{
...// здесь меняется значение (кнопочками)
}

с таким вот z костылем все работает норм.

вот я бы хотел в основной проге задавать change(x); change(y); и чтобы после цикла change переменная возвращалась. Можно ли так сделать??? подскажите пожалуйста...

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Есть такая штука - указатель...

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

Можно вместо void вернуть int.
Хотя задача слишком абстрактна, чтобы давать решения.

vk007
Offline
Зарегистрирован: 16.06.2015

А как же http://arduino.ru/Reference/FunctionDeclaration ? Ознакомтесь - поможет.

P.S. Тут нет деления на функции и подпрограммы.

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

Mr.Privet, так они же у Вас все глобальные. Меняйте какую хотите и где хотите.

Кстати, тот скетч, что Вы показали - это плод Вашей фантазии? Реально Вы его не запускали и он не работает, правильно?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Работает, если внутри change() параметр _z написан с пропущенным подчерком, что "легко". :)

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

int x=1,y=2;
...
void loop();
{
...
x=change();

...

y=change();

...
}

void change()
{
int z;
...// здесь меняется значение z(кнопочками)
return z;
}

В общем все ок, как я и хотел...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Он и сейчас не рабочий.

Что у вас ОК - непонятно.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

там как бы троеточия намекают что он не завершенный... если уж хотите рабочий кусок пожалуйста:

int set_up	
(char vid[], char tip[],int min, int max,float step)
{float valum;
update_buttons();
bool press_1 = false;
bool press_2 = false;
screen_update= false;
while(!b_3.click_down)
	{
  		lcd.clear();
      	lcd.print(vid);
      	lcd.setCursor(0,1);
      	lcd.setCursor(4,1);
  		lcd.print(tip);
        lcd.print("=");
        lcd.print(int(valum));
  		lcd.print(".");
  		lcd.print(int(abs((valum-int(valum))*10)));
      	while(!screen_update)
        {
        	update_buttons();
            if (b_2.click_down)
            {
            	valum=valum+step;	
                if(valum>max){valum=max;}
                screen_update=true;
            }
            if (b_2.retention)
            {
              press_2=true;
            }
            if(press_2)
            {
            	valum=valum+step;	
                if(valum>max){valum=max;}
                delay(10);
                screen_update=true;
            }
            if (b_2.click_up)
            {
              	press_2=false;	
            }
            if (b_1.click_down)
            {
                valum=valum-step;
                if (valum<min)	
                {
                  	valum=min;
                }
                screen_update=true;
            }
            if (b_1.retention)
            {
              	press_1=true;
            }
            if(press_1)
            {
            	valum=valum-step;
                if(valum<min)
                {
                  	valum=min;
                }
                delay(10);
                screen_update=true;
            }
            if (b_1.click_up)
            {
              	press_1=false;	
            }
        if (b_3.click_down)
            {
          		screen_update=true;
            }
        }
        screen_update=false;
    }
screen_update=true;
 return valum;
}

эта функция при обращении на пример

x=int("temperature","min",-10,10,0.1)

вызывает экран изменения х со свойствами температура, минимальная, с макс и мин значениями -10, 10, с шагом 0.1

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Да зачем мне Ваш "рабочий" да еще и "кусок".

Я пытался до Вас донести, что описаная выше функция

void change()
{
  int z;
  //...// здесь меняется значение z(кнопочками)
  return z;
}

не может ничего вернуть по определению.

я думаю даже скомпилировать ее не получится.