传递函数指针& int引用另一个函数

时间:2010-12-14 08:54:27

标签: c function-pointers microcontroller

刚刚开始研究c项目。需要帮助传递函数指针/宏函数/等。我是一个php&蟒蛇OO家伙,但c新手。我试图概括这篇文章的例子。我有一个main.c,带有我正在使用的Axon微控制器的lib。像main.c.中的所有东西一样的魅力。随着代码的增长,我需要将一些功能从main转移到更有组织的lib文件。基本微控制器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);
  }
}

2 个答案:

答案 0 :(得分:2)

我并不是很清楚你到底想要达到的目标,但很清楚的是你并没有真正理解C中指针/引用的概念 - 所以我会试着澄清一下,并希望将帮助您实现您的需求。

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

给定一个带指针的函数:

int foo(int* pointer);

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

int x = 10;
foo(&x);

所以,你可以看到上面的函数定义是错误的:

void turn_servo(void (*servo)(int position), int &currentLocation, int newLocation);

这只是一个语法错误。它不会编译因为int &currentLocation. &运算符用于获取变量的地址。它不能用在函数参数中。如果你想要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_t i= *currentLocation; i<newLocation; i=i+10)

请注意,在原始代码中,您在两种情况下都使用&运算符,它采用变量的地址。由于currentLocation已经是一个内存地址,这将导致获取地址的地址,也称为指针指针,这当然不是你想要的

最后,短语“指针或对宏的引用”完全没有意义。宏一个函数。它更像是一个元函数:它本质上是C preprocessor用来生成更多源代码的模板。 C预处理器在编译阶段之前被调用,并且基本上充当源代码中的查找/替换机制。您不能将指针指向宏,因为对于所有意图和目的,宏在编译阶段甚至不存在。它们只对预处理器有意义。

这里可能还有更多,但最终你似乎对C中的指针(以及宏)有一个基本的误解,并且缺乏提供完整的教程,我能做的最好就是指出语法问题。我强烈建议你阅读一个good introductory book to C,它肯定会超越指针,宏和函数。

答案 1 :(得分:1)

我已经选择了代码的要点并在下面提供了此代码 您可能需要修改原始代码中的#define 请参阅下面的代码:(您也可以运行此代码)

void myFunc(int pos);
void myFunc2(int pos);

int main (int argc, const char * argv[]) {


    typedef void (*pFunc)(int);
    pFunc pfArr[2];
    pfArr[0] = &myFunc;
    pfArr[1] = &myFunc2;


    int x = 3;
    int newLoc = 4;
    turn_servo(pfArr[1], x, newLoc);
    turn_servo(pfArr[0], x, newLoc);


    return 0;
}



void turn_servo(void (*servo)(int position), int currentLocation, int newLocation)
{
    printf("\nturn_servo starts");
    printf("\nturn_servo currentLocation: %d", currentLocation);
    printf("\nturn_servo newLocation: %d", newLocation);
    servo(1);

}

void myFunc(int pos)
{
    printf("\nmyFunc starts");
    printf("\nmyFunc pos: %d", pos);
}

void myFunc2(int pos)
{
    printf("\nmyFunc2 starts");
    printf("\nmyFunc2 pos: %d", pos);
}

你的turn_servo()函数现在接受两个函数作为参数(myFunc()或myFunc2())。
只需获取此代码的要点并应用它。希望这会有所帮助。