首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何将结构体数组赋初值为零? [已结贴,结贴人:matrix2009]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrix2009
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-06-06 20:04:24 楼主
    自己定义了一个结构体数组ShapeDist sdist[18];,结构体如下,我想知道如何给这个结构体数组赋初值为0,
    就是那几个float和int 成员。我知道普通数组可以用memset函数来赋初值,但是结构体数组怎么赋初值呢
    struct ShapeDist
    {
    CString name;
    CString route;
    float dx[100];
    float dy[100];
    float rx[100];
    float ry[100];
    float dcz;
    float rcz;
    float tcz;
    int dnum;
    int rnum;
    };
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-06-06 20:08:451楼 得分:0
    额...注意两个CString...
    memset((char*)&object + sizeof(CString) * 2, 0, sizeof(ShapeDist) - sizeof(CString) * 2);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 6

    发表于:2008-06-06 20:10:262楼 得分:0
    memset( &object.dx, 0, sizeof(ShapeDist) - sizeof(CString) * 2);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xielin660
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-06 20:11:143楼 得分:0
    用循环可以吗?就是好复杂.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • adlay
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-06 20:27:574楼 得分:0
    给 ShapeDist 一个构造函数,在构造函数里把成员设置为 0。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • limingjiu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-06 22:54:395楼 得分:0
    引用 4 楼 adlay 的回复:
    给 ShapeDist 一个构造函数,在构造函数里把成员设置为 0。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrix2009
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-06 23:35:356楼 得分:0
    怎么写构造函数呢
    尤其是几个数组成员 怎么写呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visame
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-06 23:59:347楼 得分:0
    引用 1 楼 baihacker 的回复:
    额...注意两个CString...
    memset((char*)&object + sizeof(CString) * 2, 0, sizeof(ShapeDist) - sizeof(CString) * 2);

    这个方法准确吗?保证没有系统填充的空格什么的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visame
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 00:02:048楼 得分:2
    要写构造函数,就用循环好了。
    struct ShapeDist
    {
    CString name;
    CString route;
    float dx[100];
    float dy[100];
    float rx[100];
    float ry[100];
    float dcz;
    float rcz;
    float tcz;
    int dnum;
    int rnum;
    //构造函数
    ShapeDist():dum(0),rnum(0)
    {
    for (int i=0;i <100;++i)
    {
    dx[i]=dy[i]=rx[i]=ry[i]=0;
    }
    }
    };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-06-07 00:12:319楼 得分:0
    引用 7 楼 visame 的回复:
    引用 1 楼 baihacker 的回复:
    额...注意两个CString...
    memset((char*)&object + sizeof(CString) * 2, 0, sizeof(ShapeDist) - sizeof(CString) * 2);

    这个方法准确吗?保证没有系统填充的空格什么的?


    嗯,我的有问题...见二楼
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrix2009
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 08:45:3710楼 得分:0
    二楼是把结构体初始化为零吧
    不是结构体数组吧

    似乎定义一个结构体的默认构造函数要方便些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 08:53:3011楼 得分:6
    C/C++ code
    struct ShapeDist { CString name; CString route; float dx[100]; float dy[100]; float rx[100]; float ry[100]; float dcz; float rcz; float tcz; int dnum; int rnum; ShapeDist(){ dx[100] = {0}; dy[100] = {0}; rx[100] = {0}; ry[100] = {0}; dcz = rcz =tcz = 0.0; dnum = rnum = 0; } };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanfustudio
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-06-07 09:08:5112楼 得分:2
    结构体数组也是一样的


    memset((void*)sdist, 0x00, sizeof(sdist) * 18);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 09:15:4313楼 得分:0
    ls是正确的,是c语言的风格,如果写了构造函数不能这样写。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrix2009
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 10:03:0214楼 得分:0
    struct ShapeDist
    {
    CString name;
    CString filepath;
    float dy[101];
    float ry[101];
    float dz;
    float rz;
    float tz;
    ShapeDist():dz(0.0f),rz(0.0f),tz(0.0f)
    {
    memset(dy,0.0f,101*sizeof(float));
    memset(ry,0.0f,101*sizeof(float));
    }
    };
    我重写了一下
    想用memset初始化数组成员,编译通过,但是有两个warnings,
    warning C4244: 'argument' : conversion from 'const float' to 'int', possible loss of data
    warning C4244: 'argument' : conversion from 'const float' to 'int', possible loss of data
    我看了一下memset函数的定义,发现是
    #include <string.h>
    void* memset( void* buffer, int ch, size_t count );
    主要是初始化字符数组的,似乎整形也可以
    其它的不知行不行
    运行程序时这两个warning会出现什么问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 10:04:4915楼 得分:0
    我觉得问题很小。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jamesfancy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 10:10:2016楼 得分:5
    memset(dy,0.0f,101*sizeof(float));
    memset(ry,0.0f,101*sizeof(float));

    不用0.0f,直接0就行了。
    用memset是直接设置的每个字节,根本不管你是什么类型。

    比如你的float型,4字字节,那
    memset(pointer, 0, sizeof(float));
    会把pointer指向的4个字节都设置成0。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jzww2003
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 12:47:2317楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrixdwy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-07 13:09:0118楼 得分:0
    引用 4 楼 adlay 的回复:
    给 ShapeDist 一个构造函数,在构造函数里把成员设置为 0。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrix2009
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-09 09:58:5819楼 得分:0
    引用 2 楼 akirya 的回复:
    memset( &object.dx, 0, sizeof(ShapeDist) - sizeof(CString) * 2);


    授人以鱼不如授人以渔
    为何要去掉两个CString成员的大小?
    这块小弟不是很明白
    能够给解释一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwwcs59
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-09 10:19:2020楼 得分:0
    关注中!!!!!!!!!!!!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lsldd
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-09 10:45:0821楼 得分:5
    memset((char*)&object + sizeof(CString) * 2, 0, sizeof(ShapeDist) - sizeof(CString) * 2);
    注意,第一个参数是从结构体首地址+sizeof(CString) * 2开始的,第三个参数所以要减去.
    但我也不是很明白直接实使用
    memset((char*)&object , 0, sizeof(ShapeDist) );
    会有什么后果呢?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ponymayan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-09 16:08:0322楼 得分:0
    seeing
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • abc_46664
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-09 16:58:5123楼 得分:0
    学习
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved