помогите сообразить код...

igorlab
Offline
Зарегистрирован: 11.11.2015

привет всем!

сразу скажу - к сожалению, не программист :)

есть код обработчика энкодера,

val_change = encoder_selection(menu_number_1, menu_number_2, menu_items_limit); 

функции encoder_selection соотв следующий код:

boolean encoder_selection(int & x, int & y, int lim){ //main menu
  if (value > last) {
    x++;
    y++;
    if(x>lim)
    {
      x=0;
    }
    if(y>lim)
    {
      y=0;
    }
    last = value;
    return true;
  }else if(value < last){
    y = menu_number_1;
    x--;
    if(x<0)
    {
      x=lim;
    }
    last = value;
    return true;
  }else {
    return false;
  }

}

получается, что часть кода в объявлении функции - int & x - передает значение х в переменную menu_number_1, а int & y передает значение в переменную menu_number_2, в то же время функции передается параметр menu_items_limit в переменную int lim? правильно понял?

mixail844
Offline
Зарегистрирован: 30.04.2012

не совсем так , в теле функции , перемнная int & x являеться ссылкой(reference) на переменную которую передали функции в момент ее вызова(menu_number_1 ).

изменяя значиение х в теле функции encoder_selection, вы меняете значение переменной menu_number_1 вне функции потому что int & x являеться ссылкой(reference) на menu_number_1 .И если ,допустим, во время исполнения этой функции ,случичилось бы прерывание , в обработчике которого проверяется значение menu_number_1  ,то он(обработчик) "увидел" бы уже измененную переменную в теле функции encoder_selection.

п.с. понял на основаннии недолгого гугления, надеюсь меня поправят в случае неточностей.

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

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

mixail844
Offline
Зарегистрирован: 30.04.2012

sadman41 пишет:

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

указатли и ссылки,не одно и тоже

https://www.tutorialspoint.com/cplusplus/passing_parameters_by_reference...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

mixail844, а какая разница. Главное что ТС не программист. И скорее в программе отсутсвует какая то структура. Это как не строитель начал строить небоскреб и на каком-то этапе все сооружение превратилось в муравейник. Что делать дальше? Продолжать строительство или снести все на ***. И пригласить другого строителя с другим проектом здания.

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

mixail844 пишет:

sadman41 пишет:

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

указатли и ссылки,не одно и тоже

https://www.tutorialspoint.com/cplusplus/passing_parameters_by_reference...

Так я же и пишу - всё гораздо хуже. C++ в целом не пользуюсь, только честным Си, поэтому со ссылкой напутал. Вижу, что разыменования нет - сразу неонка в голове замигала.