C/C++ 结构体里面怎么声明两个变长数组

宏_ 2014-04-23 12:50:19
C++ code
typedef struct //网格模型数据
{
DWORD Vertices;
_Vertice _vertices[100];
DWORD nFaces;
_Face _faces[];
}Mesh
我想把_Vertice _vertices[100]; 也声明成变长数组该怎么办求大神指导!!!
...全文
324 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
宏_ 2014-04-23
  • 打赏
  • 举报
回复
首先谢谢大家为我解决问题, 我的问题用指针解决了,要读取要的数据是固定格式的,最开始就考虑的向量数据结构不行,向(楼上)找老师说的那样 “电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址” 只要妙用指针就Ok了,真心体会到C 指针的强大了!!!
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
引用 10 楼 u013685578 的回复:
[quote=引用 8 楼 lm_whales 的回复:] catch(bad_alloc&){ return NULL; }
感觉赵老师16进制玩的狠到位阿[/quote] 不是为玩而玩,是为了验证内存字节值的真相。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
蓝兔先生 2014-04-23
  • 打赏
  • 举报
回复
引用 8 楼 lm_whales 的回复:
catch(bad_alloc&){ return NULL; }
感觉赵老师16进制玩的狠到位阿
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
#pragma warning(disable:4200)
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int DWORD;
typedef int  _Vertice;
typedef char _Face;

#pragma pack(push,1)
typedef struct   //网格模型数据
{
    DWORD    Vertices;
    DWORD    nFaces;
    union {
        _Vertice _vertices[];
        _Face    _faces[];
    } u;
} Mesh;
#pragma pack(pop)

void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
int main() {
    Mesh *m1,*m2,*m3,*m4;
    int offset;

    m1=(Mesh *)malloc(sizeof(Mesh));
    m1->Vertices=0;
    m1->nFaces=0;
    HexDump((char *)m1,sizeof(Mesh)                                   ,(int)m1);
    printf("m1 end\n\n");

    m2=(Mesh *)malloc(sizeof(Mesh)+2*sizeof(_Vertice));
    m2->Vertices=2;
    m2->nFaces=0;
    m2->u._vertices[0]=1;
    m2->u._vertices[1]=2;
    HexDump((char *)m2,sizeof(Mesh)+2*sizeof(_Vertice)                ,(int)m2);
    printf("m2 end\n\n");

    m3=(Mesh *)malloc(sizeof(Mesh)+2*sizeof(_Face));
    m3->Vertices=0;
    m3->nFaces=2;
    m3->u._faces[0]=1;
    m3->u._faces[1]=2;
    HexDump((char *)m3,sizeof(Mesh)                   +2*sizeof(_Face),(int)m3);
    printf("m3 end\n\n");

    m4=(Mesh *)malloc(sizeof(Mesh)+2*sizeof(_Vertice)+3*sizeof(_Face));
    m4->Vertices=2;
    m4->nFaces=3;
    m4->u._vertices[0]=1;
    m4->u._vertices[1]=2;
    offset=m4->Vertices*sizeof(_Vertice)/sizeof(_Face);
    m4->u._faces[offset+0]=1;
    m4->u._faces[offset+1]=2;
    m4->u._faces[offset+2]=3;
    HexDump((char *)m4,sizeof(Mesh)+2*sizeof(_Vertice)+3*sizeof(_Face),(int)m4);
    printf("m4 end\n\n");

    free(m4);
    free(m3);
    free(m2);
    free(m1);

    return 0;
}
//00374d40 - 00 00 00 00 00 00 00 00 cd cd cd cd              ............
//m1 end
//
//00372c48 - 02 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00  ................
//00372c58 - cd cd cd cd                                      ....
//m2 end
//
//00372c90 - 00 00 00 00 02 00 00 00 01 02 cd cd cd cd        ..............
//m3 end
//
//00372cd8 - 02 00 00 00 03 00 00 00 01 00 00 00 02 00 00 00  ................
//00372ce8 - 01 02 03 cd cd cd cd                             .......
//m4 end
//
//
lm_whales 2014-04-23
  • 打赏
  • 举报
回复
catch(bad_alloc&){ return NULL; }
lm_whales 2014-04-23
  • 打赏
  • 举报
回复
有必要么??,C语言的话,按照字节数分配内存,然后数据放到对应位置就可以了. C++没有必要还这样吧,除非是某个固定格式. C :大概这么处理:
 typedef struct   //网格模型数据
 {
DWORD    Vertices;             
_Vertice _vertices[];      
    
}Mesh_header,Mesh;

typedef struct{
DWORD    nFaces;               
_Face    _faces[];      
}Mesh_mid;
Mesh * alloc_Mesh(int m,int n){
Mesh *p =NULL;
try{
p= (Mesh *)malloc(sizeof(Mesh_header) + sizeof(_Vertice)*m + sizeof(Mesh_mid) + sizeof(_Face)*n);
}
{
       catch(bad_alloc&)return NULL; 
}
if(!p)return NULL;
p-> Vertices =m;
mesh_mid *pMid = (mesh_mid *)((char *)p+sizeof(Mesh_header) + sizeof(_Vertice)*m);
pMid-> nFaces = n;
return p;
}

mesh_mid *getMid(Mesh *p){
if(p==NULL)return NULL;
return (mesh_mid *)( (char *)p+sizeof(Mesh_header) + sizeof(_Vertice)* p-> Vertices) ;
}
starytx 2014-04-23
  • 打赏
  • 举报
回复
使用stl中的vector容器
ztenv 版主 2014-04-23
  • 打赏
  • 举报
回复
char *或string或vector<>
dophiJing 2014-04-23
  • 打赏
  • 举报
回复
可以用STL代替自动增长机制
opencv2008 2014-04-23
  • 打赏
  • 举报
回复
楼上正解 自己增加元素数目字段
ri_aje 2014-04-23
  • 打赏
  • 举报
回复
用 std::vector<_Vertice>
highnewrain 2014-04-23
  • 打赏
  • 举报
回复

typedef struct   MESH_S//网格模型数据
{
	DWORD    dwVertices;      // 保存pVertic元素个数
	_Vertice*pVertic;     
	DWORD    dwFaces;         // 保存pFace元素个数  
	_Face*   pFace;        
	MESH_S()
	{
		memset(this,0,sizeof(*this))//初始化
	}
	~MESH_S()
	{
		if(pVertic!=NULL)
		{
			delete[] pVertic;
			pVertic=NULL;
		}
		if(pFace!=NULL)
		{
			delete[] pFace;
			pFace=NULL;
		}
	}
}Mesh;
xiao0 1.c //纵向乘法表 2.c //标准乘法表 3.c //冒泡排序 4.c //验证算式正确 5.c //判断几位数 6.c //实现求二维数组的最大值 7.c //实现猜数 8.c //实现各位相加 9.c //实现求字符个数 10.c //求单词个数 xiao1 11.c //实现密码验证 12.c //实现str算法 13.c //折半法找数 14.c //递归汉诺 15.c //选择法排序 16.c //局部变量的生存期 17.c //全局变量的作用域 18.c //神奇的 i++ 19.c //预编译处理 20.c //神奇的指针 xiao.txt //刷题思路 xiao2 21.c //数组指针 22.c //出题验证系统 23.c //二维数组指针 24.c //秀秀指针 25.c //多级指针的应用 26.c //位运算 27.c //结构体变量 28.c //结构体指针 29.c //静态链表 30.c //动态链表 xiao3 31.c //共用体 32.c //文件的打开与关闭 33.c //文件的读和写 34.c //文件的块读 35.c //逆序输出 36.c //用指针的数值传递 37.c //if(0.5);if中的局部变量 38.c //指针交换地址不改原值 39.c //指针实现逆序输出 40.c //结构体传值 xiao4 41.c //结构体传数组值 42.c //结构体的各种赋值 43.c //结构体函数 44.c //结构体二维数组 45.c //学生信息管理系统 46.c //结构体函数 47.c //二维数组转一维 48.c //if(1?i>j:ic++经典程序 xiao0 1.cpp //hello world 2.cpp //goto跳转 3.cpp //可变参数 4.cpp //重载函数 5.cpp //面向对象 6.cpp //std 7.cpp //一元二次方程求根 8.cpp //求利润 9.cpp //求圆周率pi的近似值 10.cpp //Fibonacci数列 xiao1 11.cpp //分数序列求和 12.cpp //有序插入 13.cpp //数组元素逆置 14.cpp //杨辉三角 15.cpp //解密 16.cpp //比较两个字符串大小 17.cpp //冒泡排序 18.cpp //矩阵转置 19.cpp //字符串求最大值 20.cpp //复制字符串中的元音字母 xiao2 21.cpp //计算若干整数的和 22.cpp //神奇的c++stl库函数 23.cpp //最大最小数 24.cpp //全排列 25.cpp //数组逆置输出 26.cpp //set(集合) 27.cpp //vector(不定长数组) 28.cpp //map(映射) 29.cpp //结构体swap 30.cpp //结构体sort xiao3 31.cpp //计算两日期间隔 32.cpp //加密4个数 33.cpp //计算日期星期 34.cpp //queue(队列) 35.cpp //stack(栈) 36.cpp //sort 37.cpp //结构体sort 38.cpp //奶牛日光浴 39.cpp //lower_bound 40.cpp //贪心看电视 xiao4 41.cpp //两边同时减 42.cpp //贪心安排会场 43.cpp //iterator 44.cpp //背包问题 45.cpp //取数排列 46.cpp //全排列 47.cpp //节点 48.cpp //节点 49.cpp //村庄修公路 50.cpp //差分数组 xiao5 51.cpp //最大子段和 52.cpp //map应用 53.cpp //ASCII码排序 54.cpp //我的排序 55.cpp //隐藏的时间 56.cpp //好年份 57.cpp //最大最小值 58.cpp //由两天推日期 59.cpp //目标和 60.cpp //统计字符 xiao6 61.cpp //计算天数 62.cpp //统计单词

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧