免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2978 | 回复: 6
打印 上一主题 下一主题

Inline::C的typedef struct 出错问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-21 23:53 |只看该作者 |倒序浏览
本帖最后由 aef25u 于 2010-05-22 00:04 编辑

script2.rar (474 Bytes, 下载次数: 22) script.rar (322 Bytes, 下载次数: 12) 在学习《谭浩强c语言》第11章11.7.3结构指针变量作函数参数时,想顺便学习Inline::C下使用struct。
结果发现定义结构时:
如果采用#define STU struct stu运行不出错
但是采用typedef struct{}STU;运行出错,想知道是什么原因,所以在这请大家帮忙。

以下是不出错的代码:
  1. #!usr/bin/perl-w
  2. fun_re();
  3. use Inline C => <<'END_C';
  4. #include <stdio.h>
  5. #define STU struct stu

  6. struct stu
  7. {
  8.     int num;
  9.     char *name;
  10.     char sex;
  11.     float score;}boy[5]={
  12.         {101,"Li ping",'M',45},
  13.         {102,"Zhang ping",'M',62.5},
  14.         {103,"He fang",'F',92.5},
  15.         {104,"Cheng ling",'F',87},
  16.         {105,"Wang ming",'M',58},
  17.       };
  18. void fun_re(){

  19.     STU *ps;
  20.     void ave(STU *ps);
  21.     ps=boy;
  22.     ave(ps);

  23. void ave(STU *ps)
  24. {
  25.     int c=0,i;
  26.     float ave,s=0;
  27.     for(i=0;i<5;i++,ps++)
  28.       {
  29.         s+=ps->score;
  30.         if(ps->score<60) c+=1;
  31.       }
  32.     printf("s=%f\n",s);
  33.     ave=s/5;
  34.     printf("average=%f\ncount=%d\n",ave,c);

  35. }

  36. }
  37. END_C
复制代码
出错的代码

script2.rar

474 Bytes, 下载次数: 14

论坛徽章:
0
2 [报告]
发表于 2010-05-24 18:45 |只看该作者
本帖最后由 toniz 于 2010-05-24 18:48 编辑

  首先,正确代码是错误的。
  1. fun_re(){
  2. void ave(STU *ps)
  3. {

  4. }
  5. }
复制代码
函数里的函数?!



其次,没有明白这句是什么意思:
  1. struct stu
  2. {
  3.     int num;
  4.     char *name;
  5.     char sex;
  6.     float score;}boy[5]={
  7.         {101,"Li ping",'M',45},
  8.         {102,"Zhang ping",'M',62.5},
  9.         {103,"He fang",'F',92.5},
  10.         {104,"Cheng ling",'F',87},
  11.         {105,"Wang ming",'M',58},
  12.       };
复制代码
所以你会写出这样的CODE:
  1. typedef struct
  2. {
  3.     int num;
  4.     char *name;
  5.     char sex;
  6.     float score;}boy[5]={
  7.         {101,"Li ping",'M',45},
  8.         {102,"Zhang ping",'M',62.5},
  9.         {103,"He fang",'F',92.5},
  10.         {104,"Cheng ling",'F',87},
  11.         {105,"Wang ming",'M',58},
  12.       }STU;
复制代码
照你的原意修改的代码:
  1. use Inline C => <<'END_C';
  2. #include <stdio.h>

  3. typedef struct
  4. {
  5.   int num;
  6.   char *name;
  7.   char sex;
  8.   float score
  9. }STU;


  10. void fun_re(){
  11.   STU boy[5]= {
  12.     {101,"Li ping",'M',45},
  13.     {102,"Zhang ping",'M',62.5},
  14.     {103,"He fang",'F',92.5},
  15.     {104,"Cheng ling",'F',87},
  16.     {105,"Wang ming",'M',58},
  17.     };
  18.   STU *ps;
  19.   void ave(STU *ps);
  20.   ps=boy;
  21.   ave(ps);
  22. }

  23. void ave(STU *ps)
  24. {
  25.   int c=0,i;
  26.   float ave,s=0;
  27.   for(i=0;i<5;i++,ps++)
  28.     {
  29.     s+=ps->score;
  30.     if(ps->score<60) c+=1;
  31.     }
  32.   printf("s=%f\n",s);
  33.   ave=s/5;
  34.   printf("average=%f\ncount=%d\n",ave,c);
  35. }

  36. END_C
  37. fun_re;
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-05-26 12:01 |只看该作者
回复 2# toniz


非常感谢!这么耐心指出了我的错误。

论坛徽章:
0
4 [报告]
发表于 2011-05-20 10:10 |只看该作者
请教, 有没有什么方式, 使C中的结构体,可以在perl中使用?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-05-20 10:16 |只看该作者
请教, 有没有什么方式, 使C中的结构体,可以在perl中使用?
dqjgood 发表于 2011-05-20 10:10



    通过 XS 扩展来实现,重点看 perlxs 的 typemap 那一节

论坛徽章:
0
6 [报告]
发表于 2011-05-20 11:06 |只看该作者
回复 4# dqjgood


    unpack

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2011-05-20 11:53 |只看该作者
请教, 有没有什么方式, 使C中的结构体,可以在perl中使用?
dqjgood 发表于 2011-05-20 10:10


有几种办法,其中一个就是上面牛人提到的typemap
对于结构体还可以用XS构造Perl对象,这样比较容易扩展和维护。我目前是采用这种方法。
typemap感觉太强大了,typemap不但可以对付结构体,指针也没问题。perldoc上的那点东西说的实在太不够了,看看CPAN上typemap实际的应用跟看天书一样。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP