怎样将一个数组全部置为空值? (100分)

  • 主题发起人 主题发起人 delphi 首富
  • 开始时间 开始时间
D

delphi 首富

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要这样一个函数:
var: value:?array?of?variant
函数名(value, null, 开始下标, 个数)
比如我要置一个长度20的数组为空:
函数(value, null, 0, 20);

笨办法:
for i:= 0 to 19 do
value := null
 
setlength(value, 0);
setlength(value, 20);
 
试试
FillChar(Value[0],Length(Value)*SizeOf(Variant),0);
 
不行:
setlength(value, 20), 保留原有值,需要Initiallize(value)
 
FillChar(Value[0],Length(Value)*SizeOf(Variant),0);
我看不懂
 
还是用eric.youbin的方法简单实用!
 
variant数组不就是指针数组吗,我看你的“笨”办法最好,最快,最可靠。
 
我同意beyondair的办法,这个方法很灵活!
尤其是对指针、结构的处理特别好,特别适合
 
呵呵,FillChar(Value[0],Length(Value)*SizeOf(Variant),0);
我看看不懂。:( ,我去翻翻书,顺便学一招。

如果是我我就用for,这个小小的循环该不会浪费什么资源。。
 
setlength(value, 0);的意思是释放Value这个动态数组,
setlength(value, 20);的意思是设置动态数组的长度为20,如过验证一下,会发现,执行这个语句后,value的每一个值都是0,NULL和0不是一回事,你说的“笨办法“,就是你的答案
 
用循环不错阿,还好理解
 
FillChar(Value[0],Length(Value)*SizeOf(Variant),0);
这个方法好,发明这个办法的人可能是精通DOS编程的。用指定的数据填充内存应该是很快的。
 
用循环要是碰到上百个怎么办?难道要他循环100次吗?!还是一句语句搞定的好!
fillchar很多地方用到,他的意思是把一个数组最基本的是byte类型的,然后按照他的长度
给每一位设定一个值,如果清零那么就是相当与把一个内存块统一设置。
 
上面的几种方法都可参考!
 
FillChar(Value[0],Length(Value)*SizeOf(Variant),0);
很明确呀,有什么高深的地方?
一个二维数组当然是线形存放的,即地址连续的,那么你只要把这一段连续的地址空间
全部清零不就等于数组清零了?
Value[0] 获取数组首地址,即第一个元素的地址
Length(Value)*SizeOf(Variant) 就是计算这一段连续的地址空间的长度
即数组的元素个数 Length(Value) 乘以 每个元素的长度 SizeOf(Variant)
最后一个参数 0,就是往这个地址空间填的内容,清零嘛,当然填 0 :)

不就是这样理解咯。
 
如果是清零:setlength(value, 20);FillChar(Value[0],Length(Value)*SizeOf(Variant),0);是一样的,
但是,提问者的意思是置为[red]“空值”,[/red],Dalphi里面的Variant类型有一个函数:Null,Delphi帮助文件专门讲到了:一下代码来自帮助文件:
Delphi example:

function Test(v: Variant): Integer;

var
q: Variant;
msg: string;
begin
q := v
{ this is ok, since q is a variant }
if VarIsNull(q) then
msg := 'q is a null variant'
else
msg := 'q is not a null variant';
ShowMessage(msg);

Result := v
{ this raises an exception!!!}

end;

procedure TForm1.Button1Click(Sender: TObject);

begin
Test(Null);

end;
 
To chuguozhen:
你说的是对的,可是楼主问的是:怎样将一个数组全部置为空值?
如果要用循环的办法,应该是
for i:= 0 to 19 do
value := Unassigned;//将Variant初始化为“空",这个表示没有赋值,或默认初值

而不是value := NULL
//NULL是一个值,这个表示赋了一个NULL值
Variant类型代码:
varEmpty=$0000;//所以用FillChar就正好完成这个功能,
varNull=$0001;
VarIsEmpty(const V:Variant):boolean;//检测是否为空
VarIsNull(const V:Variant):boolean;//检测是否等于NULL值

如果用SetLength的话,在第一次分配空间的时候是可以的
但如果已经赋值了,至少要再加上SetLength(Value,0);吧
 
to beyondair
我没有验证Unassigned这个值,在你提到以前,我也不知道,我刚才验证过了,你说的是对的,提问者的问题已经得到了解答。
他应该能够根据上面的内容,解决它的问题了,谢谢你!
 
to chuguozhen:
不客气,交流有助于大家的进步,通过这种方式,我从这里学到了很多东西。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
867
DelphiTeacher的专栏
D
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
后退
顶部