你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

学习机器风格的单片机程序(1)

[复制链接]
GKoSon 发布时间:2018-4-27 19:52
本帖最后由 与龙共舞 于 2018-5-3 11:01 编辑

最近到物联网公司,看到一份吊炸天的工程代码。说一下强烈的面向对象风格。
  1. #include<stdio.h>

  2. int fjia(int a,int b)
  3. {
  4. return a+b;
  5. }
  6. int fjian(int a,int b)
  7. {
  8. return a-b;
  9. }


  10. typedef struct
  11. {
  12. int a;
  13. int b;
  14. }Var;

  15. typedef struct
  16. {
  17. int (*jia) (int x,int y);
  18. int (*jian)(int x,int y);
  19. }Const;

  20. typedef struct
  21. {
  22.     Const  *TKConst;
  23.     Var    *TKVar;
  24. }_Handle , *Handle;



  25. void main()
  26. {
  27. Const AA={.jia=&fjia,.jian=&fjian};
  28. Var   aa={3,2};

  29. _Handle H1={.TKConst=&AA,.TKVar=&aa};
  30. Handle H2=&H1;

  31. printf("%d\n",H1.TKVar->a);
  32. printf("%d\n",H1.TKVar->b);
  33. printf("%d\n",H1.TKConst->jia(2,3));
  34. printf("%d\n",H1.TKConst->jian(2,3));


  35. printf("%d\n",H2->TKVar->a);
  36. printf("%d\n",H2->TKVar->b);
  37. printf("%d\n",H2->TKConst->jia(2,3));
  38. printf("%d\n",H2->TKConst->jian(2,3));
  39. printf("%d\n",AA.jia(3,3));
  40. printf("hello GKoSon\n");
  41. }
复制代码



看上去是不是很犀利。数据+函数=类。

维度下降一点:
  1. #include<stdio.h>


  2. typedef struct
  3. {
  4. int (*jia) (int x,int y);
  5. int (*jian)(int x,int y);
  6. }Const;


  7. int fjia(int a,int b)
  8. {
  9. return a+b;
  10. }
  11. int fjian(int a,int b)
  12. {
  13. return a-b;
  14. }


  15. void main()
  16. {
  17. Const A;
  18. A.jia=fjia;
  19. A.jian=fjian;
  20. printf("%d\n",A.jia(1,3));
  21. printf("hello GKoSon\n");
  22. }
  23. ++++++++++++++++
  24. void main()
  25. {
  26. Const A={&fjia,&fjian};
  27. printf("%d\n",A.jia(6,3));
  28. printf("hello GKoSon\n");
  29. }
  30. +++++++++++++++++
  31. void main()
  32. {
  33. Const A={.jia=&fjia,.jian=&fjian};
  34. printf("%d\n",A.jia(3,3));
  35. printf("hello GKoSon\n");
  36. }
复制代码
上面的常用的地方是函数指针,改变功能。类似的是宏开关了。
再来:
  1. 第三部struct和class直接只差一个typedef
  2. #include<stdio.h>
  3. typedef int (*pfun) (int a,int b); //
  4. typedef struct
  5. {
  6.         int a;
  7.         int b;
  8.         pfun f;
  9. }A;
  10. int Val(int a,int b)
  11. {
  12.         return a+b;
  13. }

  14. void main()
  15. {
  16.         A data;

  17.         data.a=2;
  18.         data.b=4;
  19.         data.f=Val;

  20.         printf("%d\n",data.f(data.a,data.b));
  21.         printf("hello GKoSon\n");
  22. }

  23. 优化一下

  24. #include<stdio.h>
  25. typedef int (*pfun) (int a,int b);
  26. typedef struct
  27. {
  28.         int a;
  29.         int b;
  30.         pfun f;
  31. }A;

  32. int Val(int a,int b)
  33. {
  34.         return a+b;
  35. }

  36. void main()
  37. {
  38.         A data={2,3,&Val};//&Val  Val
  39.         printf("%d\n",data.f(data.a,data.b));
  40.         printf("hello GKoSon\n");
  41. }
复制代码
上面的是我本人推荐的方法。
来个基本的:
  1. 第2部:函数指针出厂
  2. #include<stdio.h>
  3. typedef struct
  4. {
  5.         int a;
  6.         int b;
  7. }A;

  8. int Val(int a,int b)
  9. {
  10.         return a+b;
  11. }
  12. void main()
  13. {
  14.         A data;
  15.         int (*f) (int a,int b);
  16.         data.a=2;
  17.         data.b=4;
  18.         f=Val;

  19.         printf("%d\n",f(data.a,data.b));
  20.         printf("hello GKoSon\n");
  21. }
复制代码

好了 最后基本的吧
  1. #include<stdio.h>
  2. typedef struct
  3. {
  4.         int a;
  5.         int b;
  6. }A;

  7. int Val(int a,int b)
  8. {
  9.         return a+b;
  10. }

  11. void main()
  12. {
  13.         A data;
  14.         data.a=2;
  15.         data.b=4;
  16.         printf("%d\n",Val(data.a,data.b));
  17.         printf("hello GKoSon\n");
  18. }
复制代码
参考:一步步写操作系统  使用C语言的struct来实现C++的class
http://blog.csdn.net/stophin/article/details/78385239
收藏 2 评论9 发布时间:2018-4-27 19:52

举报

9个回答
maxtch 回答时间:2018-4-28 03:20:00
上面那个只能算是小儿科。这个更强:http://www.cs.rit.edu/~ats/books/ooc.pdf
anobodykey 回答时间:2018-4-28 09:13:19
cube库不都是这种风格的吗?
x5y4z3 回答时间:2018-4-28 09:33:29
貌似有那种 代码格式化 的程序,估计是可将代码规范的功能吧?!
Inc_brza 回答时间:2018-4-28 09:59:25
没有觉得哪里是上位机风格,而且~这格式,除非是楼主你在写帖子的时候没有注意排版,如果原来就是这个排版,那么我觉得就是个垃圾,还有在结构体中定义a和b的,意思不明,抽象不够,没有觉得在哪里是面向对象了,连this都没有,更不是类所带有的方法等素材。
freeelectron 回答时间:2018-4-28 10:50:38
本帖最后由 freeelectron 于 2018-4-28 10:53 编辑

这不就是几个函数指针吗?

C的结构体成员里面增加函数指针和面向对象的类,差不多

上位机代码里面的重载,C也可以实现
maomao321 回答时间:2018-4-28 15:30:48
这招我也玩过,在结构体里面定义一个函数指针嘛
Cortexxx 回答时间:2018-4-28 17:10:46
官方的库 和 厂商给的code 大多都是这样的。 封装再封装  
dorisheng 回答时间:2018-5-3 22:47:55
谢谢,学习学习
jiangqunlin 回答时间:2018-5-3 23:36:49
利害,顶起!

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版