SetLength有极限

iamduo 2009-11-04 04:33:49
我在进行大数据量计算的时候,
用到动态(Record)数组 + 链表的方式进行。
出现错误。
单步跟踪后,发现问题出现
SetLength(xxx,iLen+1)这句上。
差help后才知道,xxx其实应该是255条,虽然超过部分数据还在。但是超过后可能就不管了。
请问,各位高手,是怎么解决这类话题的?
...全文
118 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamduo 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iamduo 的回复:]
我想,我的问题焦点在
  PNode=^TNode;
  TNode=record
    Name:String[24];
    Sex:Boolean;
    Age:Integer;
  end;

  PChain=^TChain;
  TChain=record
    FirstNode:PNode;//☆
    LastNode:PNode;//☆
    NextChain:PChain;
  end;
var Temp:array of TNode;
  Header:PChain;
以上结构。
我先取出一个Temp序列
然后希望,将Temp变成链表结构,然后再进行分析。
在添加的时候,可以这么写吗?
var chain:PChain;
New(chain);
chain:=@Temp[a];//?????
Header.NextChain:=chain;
......

[/Quote]

也许这个问题改去问 一杯龙
简单的问,就是,
1、怎么赋值地址?
2、☆ 的地方,如果用Pointer的话,怎么取出TNode记录?

送分贴,送分贴了。

阿三 2009-11-05
  • 打赏
  • 举报
回复
没怎么看明白楼主的意思
wsxcdx 2009-11-05
  • 打赏
  • 举报
回复
不懂,学习
iamduo 2009-11-05
  • 打赏
  • 举报
回复
我想,我的问题焦点在
PNode=^TNode;
TNode=record
Name:String[24];
Sex:Boolean;
Age:Integer;
end;

PChain=^TChain;
TChain=record
FirstNode:PNode;
LastNode:PNode;
NextChain:PChain;
end;
var Temp:array of TNode;
Header:PChain;
以上结构。
我先取出一个Temp序列
然后希望,将Temp变成链表结构,然后再进行分析。
在添加的时候,可以这么写吗?
var chain:PChain;
New(chain);
chain:=@Temp[a];//?????
Header.NextChain:=chain;
......
iamduo 2009-11-05
  • 打赏
  • 举报
回复
原因已经找到。
如:FirstNode:PNode;//☆
这个FirstNode只能赋值TNode的地址,不能直接修改
比如:Header.FirstNode.Name:='新名字';
这样的做法会引发地质混乱。
准确的做法是:
var
node:TNode;
begin
node:=Header.FirstNode^;//找回地址所指的TNode
node.Name:='新名字';
end;

有在搞链表的请注意了。
husion01 2009-11-04
  • 打赏
  • 举报
回复
不知道你的问题是什么问题!~
preserve 2009-11-04
  • 打赏
  • 举报
回复
255的确跟动态数组没有什么关系

还是没看懂你要说的是啥
Seamour 2009-11-04
  • 打赏
  • 举报
回复
瞎猜啥,255是 ShortString 的限制,跟动态数组一毛钱的关系都没有
iamduo 2009-11-04
  • 打赏
  • 举报
回复
uPEPBClass.pas.549: SetLength(FPEPBData[AStockIndex].Data, Result + 1);
004FCE34 8B45F8 mov eax,[ebp-$08]
004FCE37 40 inc eax
004FCE38 50 push eax
004FCE39 8B4314 mov eax,[ebx+$14]
004FCE3C 8D443865 lea eax,[eax+edi+$65]
004FCE40 B901000000 mov ecx,$00000001
004FCE45 8B1588AA4F00 mov edx,[$004faa88]
004FCE4B E8B0C3F0FF call @DynArraySetLength//问题在这,为什么出错?
004FCE50 83C404 add esp,$04

解释一下,
“xxx其实应该是255条,虽然超过部分数据还在。但是超过后可能就不管了”
是我的理解。
我看到的是,SetLength第一个变量是AnsiString型,所以猜想最大是255个。
我可能用array of MyRecord的方法不对。
以上是我查Disassembly时候看到的。
在DynXXX函数调用后,我的Watch里就变了。(用的是D2010,D7下编译一样出错)
可以看到,我第一个Record里,有一个Item。
Item是我New的一个节点。
Item中有个参数MyInt原来显示“20090902{$1329016}”,后面应该是引用的地址吧。
(可能是为了优化,所以Integer类型都有地址)
在执行到上面地方的时候,就变成“0”,连地址都没有了。

郁闷中。。。。。
wintergoes 2009-11-04
  • 打赏
  • 举报
回复
为什么不管了?没付费吗
gyk120 2009-11-04
  • 打赏
  • 举报
回复
????
亮剑_ 2009-11-04
  • 打赏
  • 举报
回复
没看明白

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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