江湖救急(动态创建数组) ( 积分: 50 )

  • 主题发起人 主题发起人 gggoobm
  • 开始时间 开始时间
list内删除一个项,其项指向的内存不会释放,一般要自己先释放内存,再删除list内的项。

另外,如果楼主的数组不是特大的话,还可以申明 p:PintegerArray;
这样使用时不需转换了,直接 p[X]:= X。
这个PXXXArray 的类型以前没用过,我是看了白河愁的一个PByteArray才想到的。
本质上和使用 pinteger是一样的,只是对编译器而言,一个是指向了integer数组,无须显示的做类型转换就可以操作,代码看起来简洁。
执行效率两者是一样的。
 
主要是那个二维数组会很进行极频繁的列删除动作,而且删除后希望能保存原先的次序。
所以直接用二维数组没什么效率。。
存储的数据都是整型,对存储没太大要求。

主是用来临时存储无向图寻路过程产生的路径数据

*******************
jenhon
TList是用来管理指针的。。什么都接受。包括普通类型(整型等)的存放地址,类地址,结构地址,数组地址等。都行。。
 
ufo的解答好像可行。。。自已管理一个指针数组。。。不过不敢乱用。。。呵呵。。。
再看看有没什么答案。。晚些结贴。
 
"至于白河愁说的分配平坦内存的问题,只要数组不是很大,一般在物理内存中也会平坦分布的。"

实际上不是这样的,这个问题我以前也发贴讨论过,只要是2维以上数组,就一定不是平坦分配的。
 
类似9宫图求最优解是吧。
如果是游戏的寻路,那么可以试试 A* 算法。
这里有篇文章:
http://data.gameres.com/message.asp?TopicID=25439
 
不是。。是地图上的寻路。。。比如。。从福建到宁夏。。。找最短路径。
寻路的时候,临时路径列表会频繁删除不需要的路径信息,而且数据量应该会比较大。
以前都没怎么研究过数据结构。。呵呵。。。
 
对于连续内存是否提高了访问速度,我想好处不大。
首先,连续的内存能提高有些操作的速度,是因为cpu有高速缓存,cpu会读取一定的连续内存进高速缓存来提高命中率。但其高速缓存的容量有限,需要经常更新数据。
现假设我们申请的一块内存被保存在了多处物理内存上,那么也仅仅是浪费了不多的cpu周期来等待数据而已。
另外,申请的连续内存过大,无合适的块时也会导致操作系统对现有内存交货到磁盘上去,这直接导致了申请时的速度慢很多,如果频繁申请,是不是得不偿失?
而对于物理内存的读取,连续读和随机读速度一样的(内存控制器通过地址线的高低电平来做页选择)

频繁的申请小块内存(15K以内),会被delphi的内存管理器缓冲掉,并不会导致内存碎片的产生。
只有出现大量的内存碎片,导致cpu的高速缓存命中率很低,才会影响到程序运行的速度。

以上是个人见解,不当之处欢迎大家指正。
 
游戏就是在地图上寻路啊,比如点击一个物品,精灵要能绕过障碍物走最短路径过去捡拾。
用 A* 可以的
 
我还是认为gggoobm这里定义有点牵强啊:
TLine = array of integer;
TLineList = list; //point to TLine
...
TLine = class //数组受生存期管理的限制,改成类。
....
TLineList = TList; //Point to TLine;

你定义的TLineList,是你构造出来的类,跟TList的结构还是千差万别啊

TList:(简化了)
地址 item内容 前一个item地址 下一个item的地址
100 item[0]的指针 nil 112
112 item[1]的指针 100 124
124 item[2]的指针 112 140
140 item[3]的指针 124 1xx
.....
TLineList的结构?:
100 TLine[0]指针(200)
104 TLine[1]指针(400)
108 TLine[2]指针(600)
.....
200 Tline[0]的内容[1,2,3,4,5,6,7]
400 Tline[1]的内容[10,20,30,40,50]
600 Tline[2]的内容[100,200]
...

TList和TLineList 这2个结构能直接用一个= 把指针赋值一下就实现统一?

我认为这个过程不能少吧:
TList.add(TLine[0]);
TList.add(TLine[1]);
TList.add(TLine[2]);
...

请多多指教,谢谢您的耐心。
 
抱歉。。。TLineList就是TList,是相同的类。。呵呵。。
他存储的还是TLine的地址。
 
A*是权1的有坐标无向图的寻路方法吧。。。不太适合。呵呵。
 
来自:gggoobm, 时间:2007-5-22 8:04:01, ID:3719962
抱歉。。。TLineList就是TList,是相同的类。。呵呵。。
他存储的还是TLine的地址。


高手啊,呵呵,不好意思啦,你开的贴,我问的问题比你的还多,哈哈,别在意好吗?指导一下好了。


还是想请教,你的tlinelist怎么创建才能跟array of tline建立挂接啊?难道有什么办法不用add来告诉tlist增加一个item,而自动根据你的array of tline的大小,自动生成这样链表?list.count也会自动增加?
 
不太清楚你问什么呢。。呵呵。迷糊了。。
tLineList还是要用Add加Item的
原先的计划是每个Item存储一个array of integer 的地址。。
现在改成存储类TList的对像的地址了。
 
谢谢你的耐心,知道你的意思了。

学习了,谢谢。

......还是想不出为什么还要建立TLineList类,直接new一个List,把每个item指向 array of tline的每个tline,不就可以吗?
 
分少。。大家将就点。。呵呵
 
后退
顶部