| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 998 人关注过本帖
标题:有没有办法得到结构体的元素数目?还有一个关于float的一个问题。
只看楼主 加入收藏
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
 问题点数:0 回复次数:7 
有没有办法得到结构体的元素数目?还有一个关于float的一个问题。

各位高手,大家好,我刚来这里,希望大家多多关照!这里有两个问题请高手帮忙解决下,谢谢!
1、有没有办法得到结构体中元素的个数的方法?今天被考了一道题,要求copy两个struct,当时没做出来,下来以后写了下面的程序(我把main函数中的printf给省了没写),这样以来如果我改动person中元素的数目,则必须也得去改动structcopy函数中i的值。还有就是为什么structcopy函数中i的值必须是<=4,如果是<4的话,sex就没有值,person中明明就只有4个元素么?
typedef struct str
{
int age;
float wage;
char name[8];
char sex[2];
}person;

typedef struct element
{
person zhang;
person wang;
}element;

int structcpy(element *list1, element *list2)
{
int i = 0;
int j = 0;
/*
for (i=0; i<=4; i++)
{
*(&((*list2).wang.age)+i) = *(&((*list1).wang.age)+i);
}

for (i=0; i<=4; i++)
{
*(&((*list2).zhang.age)+i) = *(&((*list1).zhang.age)+i);
}
*/
for (i=0; j<2; i++)
{
for (j=0; i<=4; j++)
{
*(&((*((&((*list2).zhang))+j)).age)+i) = *(&((*((&((*list1).zhang))+j)).age)+i);
}
}

return 0;
}

void main()
{
element people1;
element people2;

memset(&people1, 0, sizeof(people1));
memset(&people2, 0, sizeof(people2));

strcpy(people1.wang.name, "wang");
people1.wang.age = 38;
people1.wang.sex[0] = 'M';
people1.wang.wage = (float)1234.5;

strcpy(people1.zhang.name, "zhang");
people1.zhang.age = 40;
people1.zhang.sex[0] ='W';
people1.zhang.wage = (float)1556.7;

structcpy(&people1, &people2);
return;
}

2、在上面的程序中,为什么people1.wang.wage = (float)1234.5可以正常输出1234.500000,而people1.zhang.wage = (float)1556.7输出却是1556.699951?
本人菜鸟,但诚心学习,望高手指点,万分感谢!

[此贴子已经被作者于2007-9-4 17:49:24编辑过]

搜索更多相关主题的帖子: float 结构体 元素 办法 
2007-09-04 17:48
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

差点忘了,我的编译环境是vc6.0


2007-09-04 17:52
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
这个程序可以编译通过吗???


*(&((*((&((*list2).zhang))+j)).age)+i) = *(&((*((&((*list1).zhang))+j)).age)+i);
这个代码真是。。。。。
搞不懂你干什么



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]
2007-09-04 17:54
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

那就看注释里的代码,那个稍微简单些,我就是想完成struct的copy,把*list1拷贝到*list2


2007-09-04 18:04
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 
编译通过了,你可以试下
#include <stdio.h>
#include <string.h>
#include <malloc.h>
可以用下面的代码输出copy结果
printf("people2.wang.name is: %s\n", people2.wang.name);
printf("people2.wang.age is: %d\n", people2.wang.age);
printf("people2.wang.sex is: %s\n", people2.wang.sex);
printf("people2.wang.wage is: %f\n\n", people2.wang.wage);

printf("people2.zhang.name is: %s\n", people2.zhang.name);
printf("people2.zhang.age is: %d\n", people2.zhang.age);
printf("people2.zhang.sex is: %s\n", people2.zhang.sex);
printf("people2.zhang.wage is: %f\n", people2.zhang.wage);

2007-09-04 18:08
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 
是不是没办法啊?

2007-09-04 18:28
biubui
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-27
收藏
得分:0 

float精度本身有限,一般只有6位有效数字,所以可以认为1556.7和1556.699951是相等的。产生这种误差是因为使用了(float)强制转换。
PS:
1、以后可以使用double代替float
2、LZ这些代码确实有些晦涩……


2007-09-04 18:42
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 
谢谢biubui!代码中晦涩的地方主要是过多的用了&跟*,取来指去的,不好懂了,不好意思,我编程不多,可能有不少不太好的习惯,还请见谅,希望各位高手能给指出,我会努力改的!
解释下*(&((*((&((*list2).zhang))+j)).age)+i) :
(&((*list2).zhang))将取得结构体*list2的首地址,因为通过+j来取得这个结构体各个元素的地址,如果定义#define LIST2_ADDR (&((*list2).zhang))的话,(*(LIST2_ADDR+j)).age就是结构体person的第一个元素,取其地址便是person的首地址:&((*(LIST2_ADDR+j)).age),再通过+i来取得person各个元素的地址,通过循环完成元素copy。
我想知道有没有得到结构体中元素的个数的方法,这样代码中的i和j就可以通过计算得出了。还有我这样会不会有什么隐患,结构体copy是不是只有一个一个元素的copy才最好?请高手帮忙!

2007-09-05 09:11
快速回复:有没有办法得到结构体的元素数目?还有一个关于float的一个问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018215 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved