Мне не совсем понятно, чего именно вы пытаетесь достичь, но ясно, что вы не совсем понимаете концепцию указателей / ссылок в C - поэтому я постараюсь уточнить, и, надеюсь, чтопоможет вам реализовать то, что вам нужно.
Во-первых, в Си нет такого понятия, как «ссылка». Единственная альтернатива передаче по значению - это передача указателя.Указатель - это просто адрес памяти, и вы можете получить указатель (адрес памяти) на переменную, используя оператор &
(address of).Передавая переменную-указатель в функцию, вы делаете что-то вроде следующего:
Дана функция, которая принимает указатель:
int foo(int* pointer);
Вы передадите памятьадрес переменной int
для этой функции, например, так:
int x = 10;
foo(&x);
Итак, сразу видно, что приведенное выше определение функции неверно:
void turn_servo(void (*servo)(int position), int ¤tLocation, int newLocation);
Этопросто синтаксическая ошибка.Он не скомпилируется, потому что int ¤tLocation.
Оператор &
используется для получения адреса переменной.Его нельзя использовать в параметре функции.Если вам нужна «ссылка» на currentLocation
, вам нужно передать указатель, поэтому параметры вашей функции должны быть записаны в виде:
void turn_servo(void (*servo)(int position), int* currentLocation, int newLocation);
Во-вторых, когда вы хотите изменить значение, на которое указываетуказатель currentLocation
, вам нужно использовать оператор *
, чтобы разыменовать указатель.Таким образом, строка, где вы устанавливаете currentLocation, неверна.То, что вы хотите сказать, это:
// set value by to origional servo#_location var. making sure.
*currentLocation = i;
И, конечно, строка:
for(uint16_t i=¤tLocation; i<newLocation; i=i+10)
должна быть:
for(uint16_t i= *currentLocation; i<newLocation; i=i+10)
Обратите внимание, что в исходном кодев обоих случаях вы используете оператор &
, который принимает адрес переменной.Поскольку currentLocation
уже является адресом памяти, это может привести к получению адреса адреса , также известного как указатель на указатель, что, безусловно, не то, что вам нужно.
Наконец, фраза «указатель или ссылка на макрос» совершенно бессмысленна.Макрос является , а не функцией.Это больше похоже на мета-функцию: по сути это шаблон, используемый препроцессором C для генерации дополнительного исходного кода.Препроцессор C вызывается перед фазой компиляции и в основном действует как механизм поиска / замены в исходном коде.Вы не можете иметь указатель на макрос, потому что для всех намерений и целей макросы даже не существуют на этапе компиляции.Они имеют значение только для препроцессора.
Здесь может быть что-то еще, но в конечном итоге у вас, похоже, есть фундаментальное недопонимание указателей (а также макросов) в C, и не хватает полного учебника, лучшегоЯ могу сделать, это указать на проблемы синтаксиса.Я настоятельно рекомендую вам прочитать хорошую вводную книгу по C , в которой наверняка будут рассмотрены указатели, макросы и функции.