免费注册 查看新帖 |

Chinaunix

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

关于数组初始化的问题,问题相当有挑战!绝对不忽悠,请进! [复制链接]

论坛徽章:
0
71 [报告]
发表于 2011-08-27 22:47 |只看该作者
我觉得宏定义就OK了

论坛徽章:
0
72 [报告]
发表于 2011-08-28 09:00 |只看该作者
本帖最后由 uusky_cu 于 2011-08-28 09:06 编辑

呵呵。大家不要争执了。我已经发邮件到gcc邮件列表问了。跟一个老外搭上了,不过,他不是专家级别的,暂时还没有答案。希望能有一个给力的答案。如果有结果了,我会发帖告知大家。

实在不行,就发邮件给stallman了。而且我觉得“int a[5]={1,2,3,a[2],a[1]+a[0]};”这样初始化方式是有使用场合,而且也并非制造不可读代码,或者geek所为,只是让编译器帮我们程序员做一些更多的事情而已!

论坛徽章:
0
73 [报告]
发表于 2011-08-28 09:04 |只看该作者
呵呵。大家不要争执了。我已经发邮件到gcc邮件列表问了。跟一个老外搭上了,不过,他不是专家级别的,暂时还 ...
uusky_cu 发表于 2011-08-28 09:00



    51楼,可以达到目的吗?

论坛徽章:
0
74 [报告]
发表于 2011-08-28 09:07 |只看该作者
本帖最后由 uusky_cu 于 2011-08-28 09:10 编辑

回复 73# AD8018


昨天晚上发的邮件,他回复了。今天早晨,我又发了一封过去。等待吧……

不好意思,没有注意你的问题。哈哈……老婆叫我出去吃早饭了。有空再聊啊……

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
75 [报告]
发表于 2011-08-29 00:08 |只看该作者
我只讲实现思路与一点参考,实际应用数组大小可能是8能是9可能是n。但是即然是用数组在一般情况下 ...
ibmmaximo 发表于 2011-08-27 09:41



问题是这样的写法, 即便不存在所谓的初始化顺序问题, 就需要书写的代码长度与复杂度而言, 还不如宏呢。

论坛徽章:
0
76 [报告]
发表于 2011-08-29 05:57 |只看该作者
本帖最后由 uusky_cu 于 2011-08-29 06:18 编辑

To All:

我想这个问题,最后还是用宏定义解决是正解,至少是比较合理,可以移植。看一下Bob Plantz给我回复邮件的部分:
By the way, it is my personal programming philosophy that one should NOT do arithmetic operations during variable initialization.

Also, I like to use symbolic names and #defines. Again, it helps the maintenance programmer. (I have found that this is often me, a few weeks later.) So the above code might become something like (depending on what the numbers actually represent):

  1. #define nCats 1
  2. #define nDogs 2
  3. #define nBirds 3
  4. #define nWinged nBirds
  5. #define nFourLegged nCats+nDogs

  6. #include <stdio.h>
  7. int main()
  8. {
  9.      int myCreatures[5]={nCats, nDogs, nBirds, nWinged, nFourLegged};
  10.      int i;

  11.      for (i=0; i<5; i++) {
  12.           printf("\t%d\n", myCreatures[i]);
  13.      }
  14.      return 0;
  15. }
复制代码
呵呵,跟Bob plantz之间讨论,感觉他是一位非常热心和友善的IEEE专家,大家有啥问题,也可以发邮件给他试试。他的建议还是宏定义,他修改我的代码,如上。我的原始代码是下面这样:

  1.         #include <stdio.h>
  2.         int main()
  3.         {
  4.                 int a[5]={1, 2, 3, a[2], a[0]+a[1]};
  5.                 int i=0;

  6.                 for (i=0; i<5; i++) {
  7.                         printf("\t%d", a[i]);
  8.                 }
  9.                 return 0;
  10.         }
复制代码
我分析了生成的汇编,他在我分析的汇编上加了他的注释:

  1.      subl    $48, %esp                 # allocate space for array on stack
  2.      movl    32(%esp), %eax       # fetch value in a[2]  (which has not yet been initialized)
  3.      movl    24(%esp), %ecx       # fetch value in a[0]  (which has not yet been initialized)
  4.      movl    28(%esp), %edx       # fetch value in a[1]  (which has not yet been initialized)
  5.      leal    (%ecx,%edx), %edx   # compute a[0] + a[1]  (meaningless value)
  6. # Now the necessary arithmetic has been completed to evaluate the right hand side. The other three values are literals.
  7.      movl    $1, 24(%esp)         # a[0] = 1   (literal value, so no fetching or computation needed)
  8.      movl    $2, 28(%esp)         # a[1] = 2   (literal value, so no fetching or computation needed)
  9.      movl    $3, 32(%esp)         # a[2] = 3   (literal value, so no fetching or computation needed)
  10.      movl    %eax, 36(%esp)    # a[3] = a[2]   (previously computed above]
  11.      movl    %edx, 40(%esp)    # a[4] = a[0] + a[1]   (previously computed above]
  12.      movl    $0, 44(%esp)         # a[5] = 0
  13.      movl    $0, 44(%esp)         # a[5] = 0
  14. # I have no idea why 0 is stored beyond the end of the array or why it is done twice. But the
  15. # assignment to the elements of the array occur as I have always expected in C.
  16. # 小样,专家也有看走眼的时候?哈哈……那根本不是a[5]=0,是i=0。后来我给他指出来。他很开心。哈哈……呆!
复制代码
我就是想问他,为啥要把a[3]=a[2];a[4]=a[1]+a[0];汇编代码放在a[0]=1;a[2]=2;a[3]=3;前面,这不是违反了数组初始化的顺序了吗?他说他并不感觉到惊讶,因为C标准没有规定这些东西,所以如果这些代码在你的编译器上能工作也是正常的,不过请注意可移植性!

针对如果a数组是全局变量的话,要在.data段分配数据,像我的代码中的使用方式gcc会报错的,还是使用宏定义吧,至少可移植性,可维护性比较好一点!我那样使用会有副作用的。而且在内核,驱动里面,应该不会有很复杂的算术表达式,这样的查询表也不会特别长,顶多也就是百十个字节,太多的话,就需要考虑这部分是否可以放到用户空间去做了。

论坛徽章:
0
77 [报告]
发表于 2011-08-29 06:21 |只看该作者
Vc++,其他编译器,本人均没有尝试,我只有Gcc+gentoo的运行环境。

论坛徽章:
0
78 [报告]
发表于 2011-08-29 10:59 |只看该作者
为什么他用这么牛屄的变量命名呢? 哈哈哈

论坛徽章:
0
79 [报告]
发表于 2011-08-29 15:06 |只看该作者
回复 78# zqy1005

哈哈……不知道,我朋友说我的代码在VC++测试,居然结果是OK的!呆,莫非gcc这一点不如VC?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
80 [报告]
发表于 2011-08-29 16:38 |只看该作者
回复 79# uusky_cu


    哎………………
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP