免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 高峰
打印 上一主题 下一主题

大家在编程过程中有没有自己比较得意的代码,共享一下,我先来我的一个。 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2007-08-16 23:51 |只看该作者
一直没哟用过pack来编译,也没有动手试验过。倒真是可以动手一下的。也加深自己的印象:)

论坛徽章:
0
52 [报告]
发表于 2007-08-17 09:03 |只看该作者
例子不少,从设计到小技巧,我来发一个吧,前两天刚写的:
一个检查IP地址是否合法的代码,本来想用regex_t,但是试了一下,居然no match,惭愧...


  1. /**
  2. *\brief
  3. *check ip address
  4. */
  5. BOOL IsValidIP(char * _ipaddr)
  6. {
  7.         int i;
  8.         int ip[4];
  9.         char buf[16];
  10.        
  11.         /* ip address */
  12.         memset(buf, 0, sizeof(buf));
  13.         sscanf(_ipaddr, "%d.%d.%d.%d%s", &ip[0], &ip[1], &ip[2], &ip[3], buf);
  14.         if(buf[0] != 0)
  15.         {
  16.                 return FALSE;
  17.         }
  18.         for(i = 0; i < 4; i ++)
  19.         {
  20.                 if((ip[i] > 255) || (ip[i] < 0))
  21.                 {
  22.                         return FALSE;
  23.                 }
  24.         }
  25.         return TRUE;
  26. }
复制代码


见笑了。

论坛徽章:
0
53 [报告]
发表于 2007-08-17 09:09 |只看该作者
还是个挺好用的办法呢。呵呵。

论坛徽章:
0
54 [报告]
发表于 2007-08-17 09:29 |只看该作者
在下不才,写了个简单的小代码,感觉可以实现LZ所要的功能,也可以避免由于不同平台地址长短不同所造成的问题.
这段代码的思路取自 GTK+ 的思想.不过代码没经过编译,不过应该不会有错误的.


  1. /*
  2. 开发人:北斗星君
  3. 邮箱:Huangxiangkui@gmail.com
  4. */
  5. typedef struct _node node;
  6. struct _node{
  7.         node* next;
  8. };

  9. void free_node(node* n){
  10.         node* t=NULL;
  11.         while(n){
  12.                 t=n->next;
  13.                 free(n);
  14.                 n=t;
  15.         }
  16.         return;
  17. }

复制代码


自定义节点是如此定义的,还有她的释放方法.

  1. //自定义节点
  2. struct your_node{
  3.         node n;
  4.         //你的节点数据
  5. };

  6. //声明节点变量
  7. struct your_node* yn;

  8. //访问下一个节点
  9. (node*)yn->next;

  10. //释放节点
  11. free_node((node*)yn);
复制代码


我觉得,这个的通用性也比较高,而且代码的移植和可读性也不差.而且代码的执行效率和一般的节点访问,释放效率一样.
如果有什么不合适的地方,还请各位多多指出.

谢谢.

星君上

[ 本帖最后由 北斗星君 于 2007-8-17 09:30 编辑 ]

论坛徽章:
0
55 [报告]
发表于 2007-08-17 09:45 |只看该作者
原帖由 北斗星君 于 2007-8-17 09:29 发表
在下不才,写了个简单的小代码,感觉可以实现LZ所要的功能,也可以避免由于不同平台地址长短不同所造成的问题.
这段代码的思路取自 GTK+ 的思想.不过代码没经过编译,不过应该不会有错误的.


/*
开发人:北斗星 ...


你这个实现方法很大胆啊,方法是没有问题的,呵呵
如果是新开发的系统这种设计思想很好,如果要向前兼容就不好办了。
我们开发维护系统一般都是在前辈的基础上来完成的,前辈们的公共的东西已成定式,比如链表结构的定义方式,二叉树的结构等。
所以好多时候只能另外写东西去适应,而不是改以前的数据结构。

ps:风险很大的,呵呵

GTK+我没有看过,惭愧

论坛徽章:
0
56 [报告]
发表于 2007-08-17 10:07 |只看该作者
不过和这个类似的代码我测试过了,可以正常运行.风险的话,这个代码是没风险的.因为,系统释放内存的大小和位置是系统自己决定的.和程序本身传送过去的数据类型无关的.只要地址正确,系统就能释放.

不过,这个代码还有一个变通的处理机制.但是我知道由于教科书的效应,一般不会有人把指针节点放在 结构的最前端的 因为,教科书上一般都是先数据,后指针~.

比如,节点的结构如下

struct _ynode{
    struct _ynode* next;
    //你的数据
};

这样,也可以使用我上面的那个函数来释放资源的.因为,这样定义的结构,内存中的数据排列和我前面所定义的数据结构内存数据排列是一样的.

不知道各位如何看.

论坛徽章:
0
57 [报告]
发表于 2007-08-17 10:23 |只看该作者
没错!

next的位置不定的话比较麻烦

论坛徽章:
0
58 [报告]
发表于 2007-08-17 10:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
59 [报告]
发表于 2007-08-17 10:50 |只看该作者
如果. next 指针的位置不统一,也就没有高效通用的释放函数了.

论坛徽章:
0
60 [报告]
发表于 2007-08-17 10:56 |只看该作者
俺这malloc只会出现在init函数里,free通常没有。
为了插入删除的方便可以用链表,但链表的最大节点数是由产品规格确定的,索性一次全malloc出来。
还是不觉得每个节点都malloc/free有什么必要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP