variant的困惑

coolrain2000 2002-05-28 07:26:13
一段程序,不知是何故,编译能通过,运行时总是出现 cpu的调试窗口。
求大家帮我看看。
是一个计算优化变体数组时间的程序。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;


type
TintArray=Array[1..1000000] of integer;
PIntArray=^TIntArray;

type
TForm1 = class(TForm)
UnLkTm: TEdit;
LkTm: TEdit;
AryBound: TEdit;
Button1: TButton;
StsBar: TStatusBar;
ArrayNum: TLabel;
UnlockTime: TLabel;
LockTime: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
FVarintCount:integer;
FvarAry:variant;
{ Private declarations }
public
function CountWriteTime(Avalue:PIntArray):dword;
end;


var
Form1: TForm1;
PVarAry:PIntArray;
implementation

{$R *.DFM}

{ TForm1 }



function TForm1.CountWriteTime(Avalue: PIntArray): dword;
var Index:integer;
T1,T2:Dword;
begin
T1:=GetTickCount;
for Index:=0 to FvarintCount do
begin
Avalue^[Index]:=Index;
end;
T2:=GetTickCount;
Result:=T2-T1;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
FvarintCount:=StrToInt(AryBound.Text);
except
StsBar.SimpleText:='conver error!';
exit;
end;
FvarAry:=VarArrayCreate([0,FvarintCount],varinteger);
try
PVarAry:=varArrayLock(FvarAry);
LkTm.Text:=FloatToStr(CountWriteTime(PvarAry));
finally
varArrayUnlock(FvarAry);
VarClear(FvarAry);
end;

end;




end.
...全文
57 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolrain2000 2002-05-30
  • 打赏
  • 举报
回复
每人能解决???csdn上没高手吗??、倒。
coolrain2000 2002-05-30
  • 打赏
  • 举报
回复
唉,伤心。
coolrain2000 2002-05-29
  • 打赏
  • 举报
回复
to: lxpbuaa

以下是varArrayLock的定义,其返回值是一个指针,而不是你说的数组
function VarArrayLock(var A: Variant): Pointer;

另附上一个delphi的例子,帮助里的:
type

PArrayData = ^TArrayData;
TArrayData = array[0..9, 1..3] of Integer;
var
A: Variant;
P: PArrayData;
I, J: Integer;
begin
A := VarArrayCreate([1, 3, 0, 9], varInteger);
P := VarArrayLock(A);
try
for I := 0 to 9 do
for J := 1 to 3 do
P^[I, J] := J * 10 + I;

finally
VarArrayUnlock(A);

end;
WriteLn(A[1, 9]); { 19 }
WriteLn(A[3, 4]); { 34 }

end;
iampawpawcsdn 2002-05-28
  • 打赏
  • 举报
回复
up
lxpbuaa 2002-05-28
  • 打赏
  • 举报
回复
Variant变量是在程序运行是分配地址,所以编译时不会显示运行时可能出现的错误(如调用不存在的方法等)。
你的错误在于:
PVarAry:=varArrayLock(FvarAry);这句。
varArrayLock返回具有和Variant数组相同特性的Delphi数组,这意味着在这里。
Var DelphiArray: Array [下界..上界] of Integer;
对应于:VarArrayCreate([0,FvarintCount],varinteger);
所以应该用:
DelphiArray := varArrayLock(FvarAry);



—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————


5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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