C 传递函数指针&;对另一个函数的int引用

C 传递函数指针&;对另一个函数的int引用,c,function-pointers,microcontroller,C,Function Pointers,Microcontroller,刚开始做一个c项目。需要传递函数指针/宏函数等方面的帮助。我是一个php和python OO人员,但对c来说是新手。我试图为这篇文章概括这个例子。我有一个main.c和一个库,用于我正在使用的Axon微控制器。这就像一个魔咒,所有的东西都在里面。随着代码的增长,我需要将一些功能从main移到更有组织的lib文件中。基本微控制器库创建一个宏功能,允许我向微控制器发送数据,使伺服向左或向右移动。我现在需要创建一个特定于伺服的文件(HS-422.c),该文件将允许我将引用/指针(?)传递到一个通用函数

刚开始做一个c项目。需要传递函数指针/宏函数等方面的帮助。我是一个php和python OO人员,但对c来说是新手。我试图为这篇文章概括这个例子。我有一个main.c和一个库,用于我正在使用的Axon微控制器。这就像一个魔咒,所有的东西都在里面。随着代码的增长,我需要将一些功能从main移到更有组织的lib文件中。基本微控制器库创建一个宏功能,允许我向微控制器发送数据,使伺服向左或向右移动。我现在需要创建一个特定于伺服的文件(HS-422.c),该文件将允许我将引用/指针(?)传递到一个通用函数,该函数将为每个伺服执行,以简化代码复制

请记住,我只关注将宏/函数/变量引用传递给其他函数,并让它们调用/set。我了解c语言的其他基础知识。我今天一定尝试了100种不同的方法,但没有成功。所以我写了一个简化的版本,希望你能了解我的想法

谢谢你的帮助

/*
 * main.h 
 * I'm trying to make a pointer or reference to the macro.  
 * The original file had:
 * #define servo1(position) servo(PORTE,2,position); 
 */

 // servo is a macro defined in another microcontroller file
 #define (void)(*servo1)(position) servo(PORTE,2,position); 
 #define (void)(*servo2)(position) servo(PORTE,3,position); 


/* main.c */

// init main functions
void servo_scan(void);

// init vars
int servo1_location = 0;
int servo2_location = 0;

int main(void)
{
  for(;;)
  {
     servo_turn();
  }
}

// get the servos to turn
void servo_turn(void)
{
  turn_servo( *servo1, &servo1_location, 200);
  turn_servo( *servo2, &servo2_location, 950);
}


/* HS-422.c */
void turn_servo(void (*servo)(int position), int &currentLocation, int newLocation)
{
  // turning
  for(uint16_t  i=&currentLocation; i<newLocation; i=i+10)
  {
    // turn servo
    // hoping the specifc passed servo# pointer gets called
    *servo(i);     

    // set value by reference to origional servo#_location var. making sure.
    &currentLocation = i; 

    // pause
    delay_ms(20);
  }
}
/*
*main.h
*我正在尝试创建宏的指针或引用。
*原始文件有:
*#定义伺服1(位置)伺服(端口,2,位置);
*/
//伺服是在另一个微控制器文件中定义的宏
#定义(无效)(*伺服1)(位置)伺服(端口,2,位置);
#定义(无效)(*伺服2)(位置)伺服(端口,3,位置);
/*main.c*/
//初始化主要函数
无效伺服U扫描(无效);
//初始化变量
int servo1_位置=0;
int servo2_位置=0;
内部主(空)
{
对于(;;)
{
伺服_-turn();
}
}
//让伺服装置转动
无效伺服旋转(无效)
{
转动伺服(*伺服1和伺服1位置,200);
转向伺服(*伺服2和伺服2位置,950);
}
/*HS-422.c*/
无效转向伺服(无效(*伺服)(内部位置)、内部和当前位置、内部新位置)
{
//转向

对于(uint16_t i=¤tLocation;i来说,我并不清楚您到底想要实现什么,但很清楚的是您并不真正理解C语言中指针/引用的概念-因此我将尝试澄清,希望这将帮助您实现所需

首先,C中没有“引用”这类东西。传递值的唯一替代方法是传递指针。指针基本上只是一个内存地址,您可以使用
&
(的地址)获取指向变量的指针(内存地址)运算符。将指针变量传递给函数时,可以执行以下操作:

给定一个带指针的函数:

intfoo(int*指针);

int
变量的内存地址传递给此函数,如下所示:

int x = 10;
foo(&x);
因此,您可以立即看到上面的函数定义是错误的:

void turn_servo(void (*servo)(int position), int &currentLocation, 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=&currentLocation; i<newLocation; i=i+10)

for(uint16\u t i=¤tLocation;i我并不清楚您到底想实现什么,但很清楚的是您并不真正理解C中指针/引用的概念-因此我将尝试澄清,希望这将帮助您实现所需的功能

首先,C中没有“引用”这类东西。传递值的唯一替代方法是传递指针。指针基本上只是一个内存地址,您可以使用
&
(的地址)获取指向变量的指针(内存地址)运算符。将指针变量传递给函数时,可以执行以下操作:

给定一个带指针的函数:

intfoo(int*指针);

int
变量的内存地址传递给此函数,如下所示:

int x = 10;
foo(&x);
因此,您可以立即看到上面的函数定义是错误的:

void turn_servo(void (*servo)(int position), int &currentLocation, 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=&currentLocation; i<newLocation; i=i+10)

for(uint16\u t i=¤tLocation;i我选择了您代码的要点,并将此代码放在下面。
您可能需要修改原始代码中的
#定义

请参阅下面的代码:(您也可以运行此)

您的turn_servo()函数现在将接受两个函数作为参数(myFunc()或myFunc2()。

只需获取此代码的要点并加以应用。希望这会有所帮助。

我已选择了您代码的要点,并将此代码放在下面。
您可能需要修改原始代码中的
#定义

请参阅下面的代码:(您也可以运行此)

您的turn_servo()函数现在将接受两个函数作为参数(myFunc()或myFunc2()。
只要掌握这段代码的要点并加以应用。希望这能有所帮助。

那些#定义的