C语言函数分类及应用场景:嵌入式算法开发必看

admin C语言 5


做嵌入式开发或者搞算法的朋友,是不是经常对着一堆函数犯迷糊?这个函数该放哪儿用?那个函数适合解决啥问题?其实啊,C 语言里的函数看着多,捋顺了分类,用起来就顺手多了。今天兔子哥就跟大家好好聊聊函数的分类,还有在嵌入式和算法开发里都咋用,保证你看完能明白不少。

按有没有返回值和参数分,最简单的分法


咱们先从最直观的分法说起,就是看函数带不带参数,有没有返回值。
  • 无参无返回值函数:这种函数就像个固定动作,不用给它啥东西,它也不给你啥结果,比如嵌入式里的 LED 闪烁函数,调用一下就闪,不用传参数,也不用返回啥。
  • 有参无返回值函数:需要你给点东西,但干完活不回东西,比如算法里的打印数组函数,得告诉它要打印哪个数组,它打印完就完事了。
  • 无参有返回值函数:不用你给东西,但能给你个结果,比如获取传感器当前温度的函数,调用它就返回个温度值,不用传参数。
  • 有参有返回值函数:又要你给东西,又给你结果,这在算法里特别多,比如算两个数的最大公约数,得传两个数进去,它返回结果。

你可能会问,这种分法有啥用啊?其实啊,在写代码的时候,先想好这个函数要不要参数,需不需要返回值,能少走很多弯路。比如嵌入式里操作硬件寄存器,很多时候就是有参无返回值,给个寄存器地址和值就行;算法里计算类的函数,大多是有参有返回值,毕竟要算结果嘛。

库函数和自定义函数,各有各的用处


这个分类也很常见,库函数就是 C 语言自带的,自定义函数就是咱们自己写的。
库函数那可太多了,stdio.h 里的 printf、scanf,stdlib.h 里的 malloc、free,math.h 里的 sin、cos 这些都是。它们的好处是:
  1. 不用重复造轮子,比如打印东西直接用 printf,不用自己写个打印函数。
  2. 经过了大量测试,比较可靠,出 bug 的概率小。
  3. 大家都熟悉,你写的代码别人看的时候,看到库函数就知道啥意思。

自定义函数呢,就是根据自己的需求写的,比如嵌入式里控制电机转动的函数,算法里实现快速排序的函数。兔子哥跟你说啊,自定义函数写得好不好,直接影响代码好不好维护。我一般写自定义函数的时候,会让它只干一件事,比如一个函数就负责电机正转,另一个负责反转,这样出问题了好排查。

递归函数,算法里的常客


递归函数就是自己调用自己的函数,听起来有点绕,对吧?但在算法里用得可不少,比如算阶乘、斐波那契数列,还有树的遍历这些。
不过递归函数有个坑,就是得有终止条件,不然会一直调用自己,最后内存不够程序就崩了。嵌入式开发里递归用得少,为啥呢?因为嵌入式设备内存一般不大,递归太深容易出问题。但也不是绝对的,简单的递归偶尔也能用用。
那递归和循环比,哪个好啊?不好说,递归写起来简洁,比如算斐波那契数列,递归几行代码就搞定,但效率可能不如循环;循环呢,代码可能长点,但效率往往更高。所以啊,得看具体情况选。

嵌入式和算法开发,函数用法大不同


虽然嵌入式开发里,函数讲究啥呢?讲究效率和资源占用。因为嵌入式设备一般 CPU 不强,内存也小,所以函数不能太复杂,调用层级不能太深。比如控制 GPIO 的函数,要尽量简短,执行速度要快,不然会影响硬件响应。
算法开发里的函数呢,更看重逻辑清晰和可读性。有时候为了让算法思路更清楚,多调用几个函数也没关系,哪怕稍微影响点效率。比如实现一个复杂的排序算法,可以拆成比较函数、交换函数、递归调用函数等,这样样别人看代码的时候能明白你的思路。
还有啊,嵌入式里经常会用到中断服务函数,这种函数比较特殊,执行时间要特别短,不能有复杂操作,也不能调用可能阻塞的函数,不然会影响中断响应。算法开发里基本用不到这种函数,对吧?

最后说点我的看法


函数分类不用死记硬背,关键是理解每种函数的特点,知道在啥场景下用合适的函数。嵌入式开发多关注函数的效率和资源,算法开发多关注函数的逻辑和复用性。
平时写代码的时候,多想想这个函数该不该这么设计,参数是不是太多了,返回值是不是合理。刚开始可能会觉得麻烦,写多了就有感觉了。兔子哥也是从新手过来的,慢慢摸索就会了。希望这些能帮到正在,有啥问题咱们可以再交流。

标签: 斐波那契 传感器

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~