BUG?数组问题:(100分)

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure BCD(var A:array of Char);
begin
//为什么这里编译通不过:
ShowMessage(IntToStr(Cardinal(A)));
end;

procedure TForm1.btn1Click(Sender: TObject);
var
A:array of Char;
begin
//这里编译可以通过:
ShowMessage(IntToStr(Cardinal(A)));
end;



问题二:

procedure ABC(A:array of Byte);
begin

end;

procedure TForm1.btn1Click(Sender: TObject);
var
A:array of Byte;
begin
ABC(A);
end;
上面在代码可以编译通过。

下面的代码不能编译:

procedure ABC(A:array of Char);
begin

end;

procedure TForm1.btn1Click(Sender: TObject);
var
A:array of Char;
begin
ABC(A);
end;



问题三:
procedure ABC(A:array of const);
begin
ShowMessage(IntToStr(Cardinal(@A[0]))+':'+IntToStr(Cardinal(@A[1]))+':'+IntToStr(Cardinal(@A[2])));
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
//array of const的内存是连续的吗?不同类型的数据怎样分配内存的?
ABC([True,3,'a']);
end;
 
问题1:

type
tarraychar=array of Char;

...

procedure BCD(var A:tarraychar);
begin
//为什么这里编译通不过:
ShowMessage(IntToStr(Cardinal(A)));
end;

问题2:动态数组内存空间是连续的
 
[合肥]飞刀(297099102) 10:38:00
Char是个特例
[铁岭](10040231) 10:39:46
为什么泥?
[铁岭](10040231) 10:40:10
内存中没区别的吧
[北京]雪中漫步(5643564) 10:38:42
是比较奇怪哦,呵呵
[合肥]飞刀(297099102) 10:38:49
编译器决定的。
就象PChar指针可以直接+n,其他指针不可以吧
[合肥]飞刀(297099102) 10:39:10
这个是语法解析的问题,跟内存没关系
[铁岭](10040231) 10:40:54

[合肥]飞刀(297099102) 10:39:42
Char, PChar有特殊性
[铁岭](10040231) 10:41:27
开放数组不可以这样取地址吗?:
procedure BCD(var A:array of Char);
begin
//为什么这里编译通不过:
ShowMessage(IntToStr(Cardinal(A)));
end

[铁岭](10040231) 10:41:51
和var传递没关系吧
[合肥]飞刀(297099102) 10:40:21
特殊性,同志
[合肥]飞刀(297099102) 10:40:40
再说,他也不是动态数组
[铁岭](10040231) 10:42:22
是开放数组
[铁岭](10040231) 10:42:35
procedure ABC(A:array of const);
begin
ShowMessage(IntToStr(Cardinal(@A[0]))+':'+IntToStr(Cardinal(@A[1]))+':'+IntToStr(Cardinal(@A[2])));
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
//array of const的内存是连续的吗?不同类型的数据怎样分配内存的?
ABC([True,3,'a']);
end

[合肥]飞刀(297099102) 10:41:05
开放数组不是指针,明白不?
[合肥]飞刀(297099102) 10:41:49
每个数组参数类型是Variant
[合肥]飞刀(297099102) 10:42:17
具体自己去看System, Variant的代码吧
 
procedure BCD(var A:array of Char);
begin
//为什么这里编译通不过:
ShowMessage(IntToStr(Cardinal(A)));
end;
===========>>这样处理
Type MyArray = Array of Char;
procedure BCD(var A: MyArray);
 
多人接受答案了。
 
后退
顶部