数据结构值堆栈的C语言实现

[复制链接]
3061|26
 楼主| 韩山童 发表于 2017-1-6 08:43 | 显示全部楼层
Simon21ic 发表于 2017-1-5 23:48
堆栈、fifo等基本功能,实现起来确实非常简单
但是单独拿出一个stack的实现,其实没啥意义

您这么说,我瞬间有兴趣听您的指点,请大神赐教,以前我基本上都是接触顶层的应用,大部分时间再用Java,最近才刚刚接触C语言。对C语言理解得不深,还需努力。
Simon21ic 发表于 2017-1-6 15:22 | 显示全部楼层
韩山童 发表于 2017-1-6 08:43
您这么说,我瞬间有兴趣听您的指点,请大神赐教,以前我基本上都是接触顶层的应用,大部分时 ...

做APP开发吗?做APP开发的话,为啥要接触C语言?
其实,不同的语言,对开发人员的逻辑能力要求都是类似的,java能力强的话,学习C语言也不会太难,只是需要一定时间积累经验而已
 楼主| 韩山童 发表于 2017-1-6 17:55 | 显示全部楼层
Simon21ic 发表于 2017-1-6 15:22
做APP开发吗?做APP开发的话,为啥要接触C语言?
其实,不同的语言,对开发人员的逻辑能力要求都是类似的 ...

做过APP。老板要搞嵌入式,所以的看看,请大神指点。
Simon21ic 发表于 2017-1-6 20:40 | 显示全部楼层
本帖最后由 Simon21ic 于 2017-1-6 20:43 编辑
韩山童 发表于 2017-1-6 17:55
做过APP。老板要搞嵌入式,所以的看看,请大神指点。

很少看到APP转嵌入式的,不过你如果有兴趣的话,我就贴一些代码
你能想到宏的方式,估计你也大概猜到会是这么实现了吧

好处是不需要黏贴复制,直接在C语言中使用类似模板的功能;坏处是,这些代码基本没办法调试
具体就不做说明了,只是简单的通用内存池的实现


  1. void vsfpool_init(struct vsfpool_t *pool)
  2. {
  3.         memset(pool->flags, 0, (pool->num + 31) >> 3);
  4. }

  5. void* vsfpool_alloc(struct vsfpool_t *pool)
  6. {
  7.         uint32_t index = mskarr_ffz(pool->flags, (pool->num + 31) >> 5);

  8.         if (index >= pool->num)
  9.         {
  10.                 return NULL;
  11.         }
  12.         mskarr_set(pool->flags, index);
  13.         return (uint8_t *)pool->buffer + index * pool->size;
  14. }

  15. void vsfpool_free(struct vsfpool_t *pool, void *buffer)
  16. {
  17.         uint32_t index = ((uint8_t *)buffer - (uint8_t *)pool->buffer) / pool->size;

  18.         if (index < pool->num)
  19.         {
  20.                 mskarr_clr(pool->flags, index);
  21.         }
  22. }


  1. // pool

  2. struct vsfpool_t
  3. {
  4.         uint32_t *flags;
  5.         void *buffer;
  6.         uint32_t size;
  7.         uint32_t num;
  8. };

  9. #define VSFPOOL_DEFINE(name, type, num)                        \
  10.         struct vsfpool_##name##_t\
  11.         {\
  12.                 struct vsfpool_t pool;\
  13.                 uint32_t mskarr[((num) + 31) >> 5];\
  14.                 type buffer[(num)];\
  15.         } name

  16. #define VSFPOOL_INIT(p, type, n)                        \
  17.         do {\
  18.                 (p)->pool.flags = (p)->mskarr;\
  19.                 (p)->pool.buffer = (p)->buffer;\
  20.                 (p)->pool.size = sizeof(type);\
  21.                 (p)->pool.num = (n);\
  22.                 vsfpool_init((struct vsfpool_t *)(p));\
  23.         } while (0)

  24. #define VSFPOOL_ALLOC(p, type)                                \
  25.     (type *)vsfpool_alloc((struct vsfpool_t *)(p))

  26. #define VSFPOOL_FREE(p, buf)                                        \
  27.         vsfpool_free((struct vsfpool_t *)(p), (buf))

  28. void vsfpool_init(struct vsfpool_t *pool);
  29. void* vsfpool_alloc(struct vsfpool_t *pool);
  30. void vsfpool_free(struct vsfpool_t *pool, void *buffer);
Simon21ic 发表于 2017-1-6 20:54 | 显示全部楼层
 楼主| 韩山童 发表于 2017-1-6 21:38 | 显示全部楼层
Simon21ic 发表于 2017-1-6 20:40
很少看到APP转嵌入式的,不过你如果有兴趣的话,我就贴一些代码
你能想到宏的方式,估计你也大概猜到会是 ...

老板逼的,没办法啊。哇塞 感谢。
 楼主| 韩山童 发表于 2017-1-6 21:39 | 显示全部楼层
Simon21ic 发表于 2017-1-6 20:54
再来一个更加过瘾的:
https://github.com/versaloon/versaloon/blob/master/dongle/firmware/Interfaces/A ...

哈哈,这得好好学学。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部