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

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

[复制链接]
GKoSon 发布时间:2018-4-27 19:52
本帖最后由 与龙共舞 于 2018-5-3 11:01 编辑 9 `, d8 R% H+ A% @, F3 W) k8 G4 j

& q" @* M9 ?. N9 B  G最近到物联网公司,看到一份吊炸天的工程代码。说一下强烈的面向对象风格。* v( H  {! y6 j( v  {- i
  1. #include<stdio.h>2 R9 P. c. t8 m$ z: W

  2. ' U2 h" v& m' p% [5 W- v: I
  3. int fjia(int a,int b)
    - Y# S6 h) a5 r! D
  4. {& q' A: F3 p* H  h/ [% y+ H/ W
  5. return a+b;
    2 ?8 e1 b. O4 c
  6. }
    ' s6 X# M; d8 G; A) R6 }" g5 X
  7. int fjian(int a,int b) * O' n( O1 \0 Q4 b: C
  8. {
    , F  x8 p5 z! J' g
  9. return a-b;
    % R9 Y  S% \9 {" v' s
  10. }' p  |2 {4 z$ G1 W
  11. 5 h1 S. X& u  ?! f+ s2 C

  12. % ]0 c8 f; v1 y
  13. typedef struct
    ; I* {; f2 i& t/ `  B- y
  14. {
    * L% l+ c9 j1 C7 M
  15. int a;( c: p- b" i. u+ A$ j
  16. int b;% n. X# J5 }! ^
  17. }Var;
    ! N5 `" w( x/ v

  18. ! L& h, k+ a" T/ U/ ~
  19. typedef struct
    , C, {, o5 _6 y
  20. {
    * a% c: J8 A9 d: w
  21. int (*jia) (int x,int y);
    5 p; g3 ]/ {% h1 Z3 w$ K& n
  22. int (*jian)(int x,int y);
    $ @) v+ o. @. b& u2 S: @
  23. }Const;1 @2 V1 \! D  g

  24. ( s8 A' g2 I  S, P8 m" i3 S2 _
  25. typedef struct5 V- w' b8 U$ U  C% j7 T
  26. {" [4 P1 G1 `0 y5 r* }
  27.     Const  *TKConst;
    6 r6 d: b, {% v  \
  28.     Var    *TKVar;- s# ?+ Q+ i6 o% L" r' Z( |
  29. }_Handle , *Handle;& \1 q5 W) P& Z, ]
  30. 9 K: i/ a1 A& F* g3 `" C# A/ ]1 I) W
  31. + b. C. a: u  O) f
  32. / U+ @7 v# d# E5 y" z$ H
  33. void main()
    0 i  Z; l& m6 ^! ~1 b
  34. {
    : A& Z' u* X6 ]  r
  35. Const AA={.jia=&fjia,.jian=&fjian};
    7 K! K. Y; M: y  {, x. X. u
  36. Var   aa={3,2};
    9 k8 D( `; J0 R% h2 E/ W8 \9 M
  37. 0 P+ ?: P' D5 _5 @1 v
  38. _Handle H1={.TKConst=&AA,.TKVar=&aa};
    0 `  O  e1 o# P& W
  39. Handle H2=&H1;, v: I$ ~3 r$ m) [) R- V6 d

  40. ' J8 d& u/ I0 a2 \: o
  41. printf("%d\n",H1.TKVar->a);6 m$ r: I4 g7 y* B2 _
  42. printf("%d\n",H1.TKVar->b);! D* }* m2 m0 y3 I+ G' ~4 i& @
  43. printf("%d\n",H1.TKConst->jia(2,3));# U4 O$ L2 u5 M& l1 ?9 b
  44. printf("%d\n",H1.TKConst->jian(2,3));5 `, c5 p% M" H( y" \, U7 `

  45. : p' |7 }  G6 B( k! |5 R" H( g7 }

  46. 7 P7 U" t; m. \
  47. printf("%d\n",H2->TKVar->a);/ S6 h$ @+ J# e0 _' J
  48. printf("%d\n",H2->TKVar->b);" i: Q3 a% g. m% k/ o
  49. printf("%d\n",H2->TKConst->jia(2,3));
    4 R! I& L" A( b8 ~6 V5 q
  50. printf("%d\n",H2->TKConst->jian(2,3));: n2 z3 f, w- w1 t8 d" Q/ w
  51. printf("%d\n",AA.jia(3,3));& B) @: s* P9 f+ o9 W( `
  52. printf("hello GKoSon\n");# y& _5 t6 B, }. \, i
  53. }
复制代码
7 i. w" z9 ]9 e2 g
& N- `+ H! `  V, ?5 X  y1 s

8 R0 s% o- y1 @  J看上去是不是很犀利。数据+函数=类。3 @( b& i0 H1 J6 \* `
; `: f+ f2 Z3 b1 R% Y% b
维度下降一点:6 v2 @, c9 m2 Z7 G6 k, t
  1. #include<stdio.h>- \/ Q5 m6 K: n  x/ }0 E
  2. ( y2 e5 s) B5 k0 p$ {# T

  3. * c2 C0 @  e9 @8 G& |
  4. typedef struct ; i  d  |2 W7 y9 X
  5. {
    ( U$ `! m+ F6 R" Q
  6. int (*jia) (int x,int y);4 D! U4 M, q3 O0 n) @. G3 p- A
  7. int (*jian)(int x,int y);1 I4 |( ]7 T4 ]
  8. }Const;; w. e" C- L4 t6 k

  9. 7 v6 w8 X" L8 Z4 z, f$ p5 R2 A
  10. ) z+ _1 y5 Y% W* d
  11. int fjia(int a,int b)
    5 v+ Q1 m8 j7 p( J, }& j
  12. {2 w9 `# x' ?. Q1 j# B
  13. return a+b;
    , T+ s3 K6 g: B- X/ F( X$ R
  14. }
    ' Y) h; v! z9 p+ _5 n0 p; U
  15. int fjian(int a,int b)
    1 i3 l: V3 r! {2 l( x. r5 _
  16. {& f7 A) W, B4 u8 i! N  i, l0 u
  17. return a-b;! a- Q! a2 a$ ]) z/ N2 R0 f
  18. }- M; C6 g, ?# f  b' U1 J1 u& x
  19. 9 x: l# g- o! v* `7 Z

  20. : }! G* p1 G) b. o0 I
  21. void main()4 R0 b+ j. b0 n' u2 G& ^+ a
  22. {, n. l( v8 ^* r, Y9 O3 S6 K4 @
  23. Const A;+ Y' Y- C0 G/ x2 p4 J
  24. A.jia=fjia;
    4 D. c6 a% `. x% I3 r) p
  25. A.jian=fjian;
    5 a9 @  j, R( G, j( l
  26. printf("%d\n",A.jia(1,3));8 C* {6 T/ j/ \
  27. printf("hello GKoSon\n");
    ( h& z% g# A8 M- ^+ x. p  e* P
  28. }9 q" M, M7 R: {3 ~4 ^$ L
  29. ++++++++++++++++8 L: K/ `; l" o, s* |) X& g
  30. void main()# e7 ~. H( F* m: j9 b7 z
  31. {8 t+ c3 x8 J+ }9 b: P8 j
  32. Const A={&fjia,&fjian};; y; C4 V. i* t7 a: H6 K
  33. printf("%d\n",A.jia(6,3));; Y% Q, X5 l( n* F0 A/ H6 j! ]
  34. printf("hello GKoSon\n");, Q  j' U- B' K5 b. B- Z
  35. }
    $ A/ m# Y7 z5 r0 l. t2 J
  36. +++++++++++++++++: Q$ S' s3 `0 T' j0 }+ x8 i
  37. void main()
    ) `2 Z- W: N: s( c
  38. {
    ; Y; E, V  k5 i% |1 b
  39. Const A={.jia=&fjia,.jian=&fjian};( c; y) ~, m* S# u4 d
  40. printf("%d\n",A.jia(3,3));; o0 u& v  ]# z' V. S' T: [. |  J, ?7 B
  41. printf("hello GKoSon\n");7 c% L1 W0 {( n$ L7 N6 w& ?* D. W
  42. }
复制代码
上面的常用的地方是函数指针,改变功能。类似的是宏开关了。/ a6 h$ b* u& ^4 q
再来:
% |0 H9 |* P8 T
  1. 第三部struct和class直接只差一个typedef, s: b  }0 r2 [0 g" ?: ~4 K6 x
  2. #include<stdio.h>
    * {4 x% O4 }" e# P8 Q
  3. typedef int (*pfun) (int a,int b); //# j. ^( c! B- O* C
  4. typedef struct 3 o3 s+ q7 A) k" o
  5. {
    4 I7 P5 `9 }6 l. \: v/ R
  6.         int a;
    . h7 t+ E! @% j
  7.         int b;
    : p1 H. ?2 u5 k6 Z7 |
  8.         pfun f;
    . Y% b3 x6 K0 C8 m* R& ?  Q1 k  [
  9. }A;9 l" z8 P$ E& |2 H  u; ?# m
  10. int Val(int a,int b) 0 Y% B7 h5 ~' S& m- J9 W) t& V# s
  11. {
    2 ^# o! R5 \" X; D7 j* j/ U2 k7 P
  12.         return a+b;) w$ p! v. @# G8 G
  13. }4 Q5 O/ K+ ^& H1 s
  14. ! @3 u8 z2 S( d+ c* {
  15. void main()% V5 E0 u& A) ]$ @- ]) m$ S
  16. {7 S4 v6 ^% B* X3 ~7 h' ]
  17.         A data;
    5 ]# G/ `+ l/ F( H' {! G: E
  18. ( i$ P, z0 T0 ^3 G" b7 Y: B
  19.         data.a=2;- {% c, A9 \  }8 ]  ]8 w- c
  20.         data.b=4;. `' b* d0 {) h& b4 P% E
  21.         data.f=Val;% W# v; Y0 z. @

  22. - A% p# G0 ?8 }) P
  23.         printf("%d\n",data.f(data.a,data.b));
    0 T& t( s, T: G4 t: m* p
  24.         printf("hello GKoSon\n");
    & H$ P' ]/ y  |* {) J: b" o0 V9 D# F
  25. }
    8 i5 d6 o9 K) S4 h

  26. $ \; _' V2 `; f7 F
  27. 优化一下9 Z8 V; K! [5 q

  28. ; g4 K! ?  |3 L7 n
  29. #include<stdio.h>. V& G& a9 G( W" C( J; W
  30. typedef int (*pfun) (int a,int b); + |/ M; a* Q- x# r0 a0 J3 g
  31. typedef struct
      d8 G: P. M8 w& C5 |
  32. {
    " P7 P+ p) V) v, f0 I, G
  33.         int a;
    0 r. ?; \- O2 y, U8 k
  34.         int b;
      `5 f$ j: ^" H( Y  S
  35.         pfun f;# e# |' f/ H& z/ A2 K2 V! F' M
  36. }A;
    7 g- a$ @1 V  r/ m6 E0 d
  37. 6 B# |2 m  t7 X# P9 ?
  38. int Val(int a,int b) / N  K$ A/ T- r* r* K# F
  39. {8 l7 w" {. B) L7 y3 ?% D
  40.         return a+b;
    - A3 [' ?$ k* ~$ f( K* O
  41. }
    1 H7 D' r- a9 S

  42. ' M8 I( ^/ w$ _0 v" |
  43. void main()
    # ~- L4 q4 G& `1 Q5 J9 B" }
  44. {
    , i7 {: d! H. r; @  M
  45.         A data={2,3,&Val};//&Val  Val9 k7 p6 P; u( C$ g8 A! c+ U
  46.         printf("%d\n",data.f(data.a,data.b));! p" D. w& _+ m# m' b
  47.         printf("hello GKoSon\n");, |+ v! t: ?& X* O
  48. }
复制代码
上面的是我本人推荐的方法。; i, v" G5 v6 `( a
来个基本的:
6 ?. ]5 v5 G* n! l! P
  1. 第2部:函数指针出厂& n3 a/ u' Z8 Z: H! I; ]
  2. #include<stdio.h>  V, T' r, E8 d- s. C
  3. typedef struct
    3 ?/ c0 j" {& r5 K! q- J" V# h8 e
  4. {
    5 h6 R, ^5 c  w# K3 d( D" W& }; u7 v
  5.         int a;
    $ u/ \0 S. @2 I( G. e
  6.         int b;7 {- u' T2 {; W  A
  7. }A;) Q* g5 T) c! p6 D0 t8 |5 ?
  8. ! ]7 q( x9 r! c7 }
  9. int Val(int a,int b) 8 {' W: G& k" h* u" X
  10. {+ T/ J! Q2 ~8 N) I, N6 p4 f/ |' D
  11.         return a+b;
    3 ^* a" h$ W+ s3 d4 Z
  12. }( a$ [) W# K: K: n
  13. void main()
    ! I) R& K7 g2 b5 k* Y8 b
  14. {7 T% b8 n& _# i) l* b
  15.         A data;
    9 A; m* U  t$ V. C% s  k
  16.         int (*f) (int a,int b); . R- C( z3 t- g
  17.         data.a=2;. a. w5 T, [. b$ |# n
  18.         data.b=4;
    4 [* o+ a7 C( a- Z& D3 K/ D
  19.         f=Val;
    : b9 ~7 {3 J) s0 s9 E1 J+ [3 }

  20. / }4 R" p8 Y+ ~" ~
  21.         printf("%d\n",f(data.a,data.b));
    5 l$ N) m+ F$ F/ L
  22.         printf("hello GKoSon\n");
    8 c# I. `9 f9 W* H
  23. }
复制代码

4 N- s- Z# J2 c6 O0 t好了 最后基本的吧
' h1 s8 k" |8 ?& p! Q2 ^8 g# g
  1. #include<stdio.h>
    + h0 r0 n, R3 u' P
  2. typedef struct
    ' p# c: j# r8 }5 p) P7 K5 w
  3. {# n5 t" Z$ i) F  }5 P6 g8 C' z
  4.         int a;
    8 R+ N9 }  U9 X6 q
  5.         int b;
    # U6 k, o* u; |" E
  6. }A;
    3 ^7 B) }+ h5 q' w  n. z- A: Q

  7. ; B3 V* D& y& c) R' r% ^
  8. int Val(int a,int b) ' J; ^! ^# V& Z5 Q- w- c1 U! H. l
  9. {
    $ ]2 u# y4 P& D# \1 s
  10.         return a+b;
    9 ~% s4 ]  p2 y1 s6 c7 G
  11. }) f# v# g! ]/ Z  A( Y

  12. ! C3 }7 b/ Y; U  A. m
  13. void main()7 q6 u# i$ D$ k6 B
  14. {3 T! o4 l3 ]- T5 d8 Q
  15.         A data;
    # H0 P% C1 q, o# N+ t+ `- f$ ^
  16.         data.a=2;
    4 b8 C4 Q  F$ |
  17.         data.b=4;/ \8 L  `) d, G4 c% v
  18.         printf("%d\n",Val(data.a,data.b));9 G9 m2 L( `. V9 |  ~0 z
  19.         printf("hello GKoSon\n");# ?+ t  j: C$ z4 f; M; ~) i1 y
  20. }
复制代码
参考:一步步写操作系统  使用C语言的struct来实现C++的class
# }3 W2 w+ D) I9 Y% u& whttp://blog.csdn.net/stophin/article/details/78385239" ?6 P' ?9 m5 w$ G, `8 I3 ?
赞 收藏 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
貌似有那种 代码格式化 的程序,估计是可将代码规范的功能吧?!* n; r7 X/ |# O$ U
Inc_brza 回答时间:2018-4-28 09:59:25
没有觉得哪里是上位机风格,而且~这格式,除非是楼主你在写帖子的时候没有注意排版,如果原来就是这个排版,那么我觉得就是个垃圾,还有在结构体中定义a和b的,意思不明,抽象不够,没有觉得在哪里是面向对象了,连this都没有,更不是类所带有的方法等素材。
freeelectron 回答时间:2018-4-28 10:50:38
本帖最后由 freeelectron 于 2018-4-28 10:53 编辑
" p% u' R! o8 q2 j: M0 F" W- x
3 z2 |7 a( O# u4 o这不就是几个函数指针吗?
: k% H* [# A- `7 C" p+ x0 ^8 p& g: r
C的结构体成员里面增加函数指针和面向对象的类,差不多) G, @& b: q6 \

9 |$ @5 ~/ M# v- i上位机代码里面的重载,C也可以实现
; a% U7 i3 g/ T
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版