标题: 关于C语言结构体内的函数指针的用法 [打印本页]

作者: Kituro    时间: 2021-10-9 23:06
标题: 关于C语言结构体内的函数指针的用法
项目需要控制多个步进电机, 我的想法是使用结构体来做多个步进电机的独立控制, 把控制函数的函数指针放在结构体中调用.在实际测试的时候发现这种方式(结构体)调用步进电机的函数没有反应, 不起作用(电机不转)

C语言代码大概如
  1. //为阅读方便, 将所有函数参数使用arg代替
  2. //*****************************main.c
  3. //尝试在main.c中控制步进电机

  4. #include "Stepper.h"

  5. void main(){
  6. Stepper stp;

  7. while(1){
  8.     //如果使用 "MotorClockwise(arg); "则电机正常工作
  9.     stp.MotorAntiClockwise(arg); //电机不工作
  10.     }
  11. }

  12. //***************************Stepper.h
  13. //定义了结构体

  14. extern void MotorAntiClockwise(arg);
  15. extern void MotorClockwise(arg);
  16. extern void MotorSetAngle(arg);

  17. typedef struct
  18. {
  19.     void (*MotorAntiClockwise)(arg);
  20.     void (*MotorClockwise)(arg);
  21.     void (*MotorSetAngle)(arg);
  22. }Stepper;

  23. //***************************Stepper.c

  24. void MotorAntiClockwise(arg){
  25.     //code
  26. }

  27. void MotorClockwise(arg){
  28.     //code
  29. }

  30. void MotorSetAngle(arg){
  31.     //code
  32. }
复制代码
求教大佬出现了什么错误? 应该如何解决?
非常感谢您的回复!


作者: npn    时间: 2021-10-10 08:26
这是什么平台的C语言程序? 请提供下 Stepper.h 里的内容。
作者: Kituro    时间: 2021-10-10 11:54
npn 发表于 2021-10-10 08:26
这是什么平台的C语言程序? 请提供下 Stepper.h 里的内容。

感谢回复, 平台是C51, Stepper.h的内容已经在帖子里了
作者: Y_G_G    时间: 2021-10-10 19:23
函数应该是不能作为结体体成员的,结构体是一种变量
作者: xstong    时间: 2021-10-10 19:49
结构体自身只是一个类型声明而已! 你必须对定义的类型实体变量初始化赋值才能调用!
比如:
const Stepper StepperInterface = {
    MotorAntiClockwise,
    MotorClockwise,
    MotorSetAngle,
};

作者: Kituro    时间: 2021-10-15 19:13
Y_G_G 发表于 2021-10-10 19:23
函数应该是不能作为结体体成员的,结构体是一种变量

那有没有什么方法能做到类似stp.MotorClockwise()这样的调用呢?,这样写简单直观, 我觉得比其他方法好的多
作者: Y_G_G    时间: 2021-10-15 23:56
Kituro 发表于 2021-10-15 19:13
那有没有什么方法能做到类似stp.MotorClockwise()这样的调用呢?,这样写简单直观, 我觉得比其他方法好的多

一个电机一个控制函数不就行了,有时候简洁不一定实用
作者: sinside    时间: 2021-10-16 17:00
你在结构体里面定义一个指向函数的指针, 在结构定义的时候, 把相应的处理函数传给它即可.
作者: Kituro    时间: 2021-10-16 21:44
Y_G_G 发表于 2021-10-15 23:56
一个电机一个控制函数不就行了,有时候简洁不一定实用

嗯嗯,谢谢!!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1