请教:多维数组内存分配问题

maofly 2007-01-25 10:30:34
定义一个指针数组DOT *array[100][100][100]用来存储三维点数据,数组中的元素为指针,指向一个三维点坐标(采用指针的原因是可以缩小存储空间,因为点太多:))。另外,有一个void指针指向这个三维指针数组。现在的问题是,一个void指针要指向一个不同的指针数组,需要给这个指针数组分配内存空间(new),具体怎么分呢?同时需要void指针指向对应指针数组的首地址!
找了很多地方都没有对应的资料,关键是指针数组,如果单纯用三维数组则需要大量内存,不可取!!(x,y,z坐标都为double变量)
请教高手。
...全文
457 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
双杯献酒 2007-02-03
  • 打赏
  • 举报
回复
稀疏矩阵是用十字链表做的吧,
怎么会是数组?
wanilyer 2007-02-02
  • 打赏
  • 举报
回复
你为什么不把dot定义为一个结构体。然后定义一个存储结构体的一维数组?

typedef struct tagDOT {
double x;
double y;
double z;
}DOT, FAR * PDOT;

DOT * pDot = new DOT[Number];
maofly 2007-02-02
  • 打赏
  • 举报
回复
链表太慢,跟MAP差不多吧?!
Snow_Ice11111 2007-02-02
  • 打赏
  • 举报
回复
1G个点,就算内存中只保留点的指针,也要4G的内存,这是难以实现的。建议还是往硬盘上写入数据文件吧,数据库加上raid 0磁盘阵列(或raid 0+1,不过这要四块一样的硬盘组成)。
maofly 2007-01-26
  • 打赏
  • 举报
回复
描述:
假设有一个DOT,坐标值为(x,y,z),则我的目的是要将该值保存起来,并且可以方便取出。我现在采用的方法是建立一个数组CTypedPtrArray <CObArray,DOT*> m_DotArray,用来存储点数据,但是在调用函数SetSize()时因为点数目太多,会出现内存不足。为了解决这个问题。我就想了这个方法:将坐标值计算后除以100取整,得到的(xx,yy,zz)作为指针数组array1的一个元素,即array1[xx][yy][zz],然后再将坐标值对100求余,得到的(xxx,yyy,zzz)作为指针数组array2的一个元素,即array2[xxx][yyy][zzz];而array1[xx][yy][zz]指向三围数组array2,而array2中的每一个元素又指向一个DOT结构(double x,double y,double z),然后将坐标值(x,y,z)分别赋给DOT结构的(x,y,z).从而完成了存储过程。同样,通过一致的算法来完成取的过程。
因为一个不同的array1元素都指向一个不同三维数组array2,所以这就需要给array2 new 一个空间,让array1[xx][yy][zz]指向对应的空间。取的时候也要通过array1[xx][yy][zz]来找对应的array2数组。
所以现在的问题是怎么来给array2分配空间并且使array1[xx][yy][zz]指向它;同时通过array1[xx][yy][zz]怎么来识别对应的array2数组,从而取得坐标值。
详细的想法就是这样。不知道说明白没有。:)简单的说就是对点的存、取操作。
zhuzhiyou 2007-01-26
  • 打赏
  • 举报
回复
建议用链表
maofly 2007-01-26
  • 打赏
  • 举报
回复
如果往硬盘写数据的话,麻烦的地方就是我首先需要将所有点写进文件,然后又要读取文件对所有点进行排序,排序后的文件才是最终文件。
这样,确实可以解决内存的问题,但是在速度上就会太慢。
我现在将物理内存加大到2G,采用STL:MAP来存储,基本上可以,但是在处理排序操作时,从MAP中存、取数据速度太慢,比直接操作数组慢了一半。所以我才采用以上的方法。解决MAP的速度问题,我也在另外的贴中问过,有人提倡用hash_map,但我不知道hash_map会比map快多少,并且需要移植SGI的hash_map.我的编译环境是VC6。
不知道大虾吗还有没有什么好的想法。请赐教!!谢谢
maofly 2007-01-26
  • 打赏
  • 举报
回复
如果往硬盘写数据的话,麻烦的地方就是我首先需要将所有点写进文件,然后又要读取文件对所有点进行排序,排序后的文件才是最终文件。
这样,确实可以解决内存的问题,但是在速度上就会太慢。
我现在将物理内存加大到2G,采用STL:MAP来存储,基本上可以,但是在处理排序操作时,从MAP中存、取数据速度太慢,比直接操作数组慢了一半。所以我才采用以上的方法。解决MAP的速度问题,我也在另外的贴中问过,有人提倡用hash_map,但我不知道hash_map会比map快多少,并且需要移植SGI的hash_map.我的编译环境是VC6。
不知道大虾吗还有没有什么好的想法。请赐教!!谢谢
Snow_Ice11111 2007-01-26
  • 打赏
  • 举报
回复
多时会超过1G个DOT
------------------------------------------------
这么大的数据量,用什么方法解决都是个大难题。如果从程序算法上无法减小数据量或避免的话,还是写到硬盘上某个文件中吧,采用固定格式写入数据的话,就算文件再大,用内存映射文件方法也可以获得不错的读、写速度。
crystal_heart 2007-01-26
  • 打赏
  • 举报
回复
太复杂了,看不懂
maofly 2007-01-25
  • 打赏
  • 举报
回复
回楼上兄弟:
编译时会报错:cannot convert DOT*** to DOT*[100][100][100]
syy64 2007-01-25
  • 打赏
  • 举报
回复
int i, j, k;

void*** pp;
int i,j;
array=(DOT***) new DOT**[100];
for(i=0;i<100;i++)
{
array[i]=(DOT**) new DOT*[100];
for(j=0;j<100;j++)
array[i][j]=(DOT*) new (DOT*)[100];
}
pp = array;
crystal_heart 2007-01-25
  • 打赏
  • 举报
回复
多写一些外部调用的代码上来,说的这么抽象谁都不懂你要干什么。
crystal_heart 2007-01-25
  • 打赏
  • 举报
回复
你的问题描述不清晰,要解决什么问题没有说清楚。

void *array1[100][100][100],DOT *array2[100][100][100], 只是100*100*100 = 1M的内容。

然后又有“超过1G个DOT”?
maofly 2007-01-25
  • 打赏
  • 举报
回复
数组中存储的都是指针,相对而言,可以节省大量的内存空间。
因为数据量太大。多时会超过1G个DOT。
我曾经用STL:MAP试过,但速度太慢,所以放弃了。
maofly 2007-01-25
  • 打赏
  • 举报
回复
我的思路是这样的:
定义两个指针数组,void *array1[100][100][100],DOT *array2[100][100][100],用来实现对三维点坐标数据的存、取。
首先,根据数据计算得出的值得到对应的array1的指针,使该指针指向一个数组array2,然后再计算得到array2中的某个指针(就是得到下标取得指针),使该指针指向一个DOT对象,将坐标值赋给对象,这样就实现了数据存的过程;然后再通过运算来实现数据的取过程。
之所以采用指针,是为了节省内存,如果单纯采用三维数组,则内存消耗太大。

请高手赐教。crystal_heart(笑看风云)有办法??
谢谢
whiteclouds 2007-01-25
  • 打赏
  • 举报
回复
array=new DOT*[100*100*100]
节省内存要以速度为代价,考虑好再说
crystal_heart 2007-01-25
  • 打赏
  • 举报
回复
也就是链表
crystal_heart 2007-01-25
  • 打赏
  • 举报
回复
syy64(太平洋) ( ) 信誉:145 Blog

试试:

int i, j, k;

void**** pp;
int i,j;
*array=(DOT***) new DOT**[100];
for(i=0;i<100;i++)
{
*array[i]=(DOT**) new DOT*[100];
for(j=0;j<100;j++)
*array[i][j]=(DOT*) new (DOT*)[100];
}
pp = array;

=========================================================================

这种方式根本就没有节省一丁点的内存。

这样的问题,在“数据结构”中的解决方法是稀疏矩阵。
syy64 2007-01-25
  • 打赏
  • 举报
回复
试试:

int i, j, k;

void**** pp;
int i,j;
*array=(DOT***) new DOT**[100];
for(i=0;i<100;i++)
{
*array[i]=(DOT**) new DOT*[100];
for(j=0;j<100;j++)
*array[i][j]=(DOT*) new (DOT*)[100];
}
pp = array;
加载更多回复(2)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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