免费注册 查看新帖 |

Chinaunix

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

c++,结构体成员的编码名称作为函数参数,如何实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-29 21:41 |只看该作者 |倒序浏览
本帖最后由 caohui8666 于 2011-01-30 18:31 编辑

先用例子说明我想问的问题:

typedef struct{
    int aaa;
    int bbb;
    int ccc;
}test_stu;


int _fun(test_stu *_test, char *_str)
{
    /*从结构体_test中得到编码名称为_str的成员的取值*/
    return 0;
}

int main()
{
    test_stu test;
    memset(&test, 0, sizeof(test_stu ));

    test.aaa = 111;
    test.bbb = 222;
    test.ccc = 333;

    int result = _fun(&test, "aaa");

    printf("result[%d]\n", result);

    return 0;
}


总体描述的意思是,一个结构体(这个结构体成员的个数有可能还会增加,比如再增加一个int ddd),需要一个函数,给这个函数输入这个结构体的成员的变量名称,就能返回这个成员的取值。

如何实现?请求高手指导,在线等。

另外补充一点,offsetof是一个宏函数,第二个参数是成员的明细,不能是一个变量,无法最终实现需求。
我需要传给_fun函数一个字符串变量,变量值为“aaa”,然后返回aaa的取值即111;输入“bbb”,返回222;而不能写死的offsetof(test_stu , aaa).

论坛徽章:
0
2 [报告]
发表于 2011-01-29 21:52 |只看该作者
offsetof可以返回结构体成员的偏移,这样用首地址和这个偏移就可以计算出该成员的起始地址。但问题是成员的类型,如果能确定是一种类型,比如INT,那还是可以实现的,如果无法确定类型,就不好办了。

如果能确定类型的话(比如INT),可以这样写
int _fun(char *p, int a)
{
      return *((int *)(p + a));
}

然后用的时候,比如
int result  = _fun(&test, offsetof(test_stu, aaa));

论坛徽章:
0
3 [报告]
发表于 2011-01-29 21:54 |只看该作者
回复 2# liwangli1983
这个结构体的成员类型是不确定的,可能是各种类型,成员也有可能是其他的结构体

论坛徽章:
0
4 [报告]
发表于 2011-01-29 21:57 |只看该作者
回复  liwangli1983
这个结构体的成员类型是不确定的,可能是各种类型,成员也有可能是其他的结构体
caohui8666 发表于 2011-01-29 21:54


那就直接返回地址,然后用户根据需要转型吧。。。类型这东西是没法获得的。至少C应该是不可以。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2011-01-29 21:57 |只看该作者
先用例子说明我想问的问题:

typedef struct{
    int aaa;
    int bbb;
    int ccc;
}test_stu;
...
caohui8666 发表于 2011-01-29 21:41



    增加一個parseString來做這個事情。


  1. int parseString(const char* rhs)
  2. {
  3.   if        (strcmp(rhs, "a") == 0) return a;
  4.   else if   (strcmp(rhs, "b") == 0) return b;
  5.   else if   (strcmp(rhs, "c") == 0) return c;
  6.   else if   (strcmp(rhs, "d") == 0) return d;

  7.   return 0;
  8. }

复制代码
這僅僅是個例子

论坛徽章:
0
6 [报告]
发表于 2011-01-29 21:59 |只看该作者
回复 5# nizvoo


  感谢楼上的回复,这种枚举方式的实现我曾经想过,但是性能不好;因为我实际使用的结构体有几百个字段,这样每次都枚举的比较,性能跟不上。

论坛徽章:
0
7 [报告]
发表于 2011-01-30 01:17 |只看该作者
如果不考虑编译器移植的问题的话,应该是可以通过符号表来查询内存地址的。但vc编译器的符号生成规则不公开,gcc是公开的,但有没有提供接口我就不知道。

这应该是一个编译期与运行期的交叉处理问题,我觉得程序的局限性会很大

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2011-01-30 08:48 |只看该作者
结构的描述信息都没有了,运行期解决不了的。
LZ还是说说最原始的需求吧

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
9 [报告]
发表于 2011-01-30 08:57 |只看该作者
c++不是这么用的。
如果一定要这样的话,可以用hash map。

论坛徽章:
0
10 [报告]
发表于 2011-01-30 09:04 |只看该作者
mark
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP