| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 614 人关注过本帖
标题:问个嵌套结构的问题
只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏
已结贴  问题点数:20 回复次数:10 
问个嵌套结构的问题
#define A 1024
#define B 512
#define C 16
#define Max_Size 256
#define Min_Size 32

struct Item
{
    char TestData[Max_Size];
    float TestResult;
};

struct SiteN
{
    int TestNum;
    char TestName[Max_Size];
    Item MyData[C];
};

SiteN TItem[B]={0};
--------------------------------------------------
如果Item MyData[C];要改成Item MyData[];
MyData[]的大小要在程式内另行定义的话要怎做?
2014-12-26 13:22
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
因为程式运行到某一阶段前,无法事先得知阵列大小,
若给最大值,如遇到较小的值,则运行后会产生一堆无用空间
图片附件: 游客没有浏览图片的权限,请 登录注册

不要選我當版主
2014-12-26 13:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
用malloc动态分配内存

DO IT YOURSELF !
2014-12-26 13:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
如果Item MyData[C];要改成Item MyData[];
------ 那你就这样改呀

看看C标准是怎么讲的:
After the declaration:
    struct s { int n; double d[]; };
the structure struct s has a flexible array member d. A typical way to use this is:
    int m = /*some value */;
    struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if
p had been declared as:
    struct { int n; double d[m]; } *p;
(there are circumstances in which this equivalence is broken; in particular, the offsets of member d might
not be the same).
2014-12-26 13:47
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
照着写却过不了?
图片附件: 游客没有浏览图片的权限,请 登录注册

不要選我當版主
2014-12-26 14:28
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这样能编译通过

程序代码:
int main()
{
    struct s
    {
        int a;
        double b[];
    };
    struct s *p=(s*)malloc(sizeof(s)+sizeof(double[5]));
    return 0;
}


但是会出现一个警告:

warning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组
               当 UDT 包含大小为零的数组时,无法生成复制构造函数或副本赋值运算符

DO IT YOURSELF !
2014-12-26 14:36
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
有点越来越模糊难以理解的感觉.

基本上的需求m必须是变量,由程式运行中取得,不能直接用数字(5).-> 要用malloc做的原因.

我再自己研究研究.

不要選我當版主
2014-12-26 14:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
我说的是C语言,你用的是C++
我说的是当今的C语言,你用的是不支持当今C语言的编译器
^_^
(看到编译信息,不是一回事,补充一点:C语言规定 flexible array member 属于 incomplete type,而不是 zero-sized array)

程序代码:
#include <stdlib.h>

int main()
{
    struct s
    {
        int a;
        double b[];
    };
    struct s *p = malloc(sizeof(struct s)+sizeof(double[5]));
}
我用 mingw4.8.1 编译结果如下:
gcc -c  "D:/sources/g001/main.c" -std=c11
0 errors, 0 warnings
2014-12-26 15:01
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我用vs2010 把点cpp 更改为点c 后  需要做如下改动 方可编译成功

程序代码:
#include <stdio.h>
#include <malloc.h>

int main()
{
    struct s
    {
        int a;
        double b[];
    };
    struct s* p=(struct s*)malloc(sizeof(struct s)+sizeof(double[5]));
    return 0;
}

DO IT YOURSELF !
2014-12-26 15:40
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
同事建议用new,经过瞎子摸象后,摸出来能过,但是却很怪,直接少一层阵列
可能又有哪里错了吧.
图片附件: 游客没有浏览图片的权限,请 登录注册

不要選我當版主
2014-12-26 16:54
快速回复:问个嵌套结构的问题
数据加载中...
 
   



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

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