Callback function与if-then-else

对function pointer的应用可以大致看出一个程序员对C的理解和驾驭能力。用function pointer甚至可以实现一部分OO才有的polymorphism,但钟情于使用function pointer会使程序的静态分析变得难以下手;类似于C++,过多的object互相纠缠,导致程序的运行期行为异常复杂。这时候,对程序的debug从流程切换到了单个class,从function call到了每个class必须具备的良好接口和实现。

就与network programming相关的程序来说,由于充斥着异步操作,state machine就成为了必然的选择。但如何实现这个state machine却有很多讲究。一般情况下,有if-then-else和callback function这两种实现手法。

if-then-else的实现对于小一点的state machine,可以起到简化程序的作用。几个state放在一起,在最顶层的function中一览无余;但只要程序稍微大一点,这种手法就会变得非常累赘。如果使用OO语言,GOF中的State(clause 5.8) pattern可以说是一个非常好的解决方法。如果没有OO语言可以用,或者使用OO有其他负担难以承受,function callback就成了救命稻草。

其实callback function就是在手工实现OO中的polymorphism罢了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
function sysCall_init() -- do some initialization here dirh={-1,-1,-1,-1} speedh={-1,-1,-1,-1} dirh[1]=sim.getObjectHandle('carwdfl') dirh[2]=sim.getObjectHandle('carwdfr') dirh[3]=sim.getObjectHandle('carwdbl') dirh[4]=sim.getObjectHandle('carwdbr') speedh[1]=sim.getObjectHandle('carwfl') speedh[2]=sim.getObjectHandle('carwfr') speedh[3]=sim.getObjectHandle('carwbl') speedh[4]=sim.getObjectHandle('carwbr') car_aim_h=sim.getObjectHandle('car_aim') car_now_h=sim.getObjectHandle('car_now') car_f_h=sim.getObjectHandle('car_f') car_w_speed={0,0,0,0} direrr=-math.pi/2 end function sysCall_actuation() -- put your actuation code here car_aim=sim.getObjectPosition(car_aim_h,-1) car_f=sim.getObjectPosition(car_now_h,-1) car_now=sim.getObjectPosition(car_f_h,-1) yerr=car_aim[2]-car_now[2] xerr=car_aim[1]-car_now[1] ycarf=car_now[2]-car_f[2] xcarf=car_now[1]-car_f[1] car_w_speed={0,0,1.5,1} aimangle=math.atan2(yerr,xerr) carangle=math.atan2(ycarf,xcarf) rerr=carangle-aimangle xyerr=yerr^2+xerr^2 print(xyerr) if xyerr>0.01 then vf=-1 else vf=0 end --[[ if math.abs(rerr)>0.01 then vr=1*rerr/math.abs(rerr) vf=0 else vr=0 end if 1 then car_w_speed[3]=vr+vf car_w_speed[4]=-vr+vf end --]] for ii=1,4,1 do sim.setJointTargetPosition(dirh[ii],-rerr+direrr) sim.setJointTargetVelocity(speedh[ii],vf) end end function sysCall_sensing() -- put your sensing code here end function sysCall_cleanup() -- do some clean-up here end -- See the user manual or the available code snippets for additional callback functions and details
05-22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值