类的create问题!(20分)

  • 主题发起人 主题发起人 shopman
  • 开始时间 开始时间
S

shopman

Unregistered / Unconfirmed
GUEST, unregistred user!
type
pp=^pp1;
pp1=record
a:string;
b:integer;
end;

.....

procedure TForm1.Button1Click(Sender: TObject);
var
b:pp;
d:array [0..20] of byte;
begin
b:=pp(@d)
///这样做是什么意思? 他和 b:=pp.create
有何不同?
end;
 
pp.create什么意思?:}
shopman,给我一分好么?
 
不一样。
这句子非法。
去看看指针的用法吧。
 
bb.Create 仅仅是创建继承于TObeject的对象的实例, 不适用于记录.
b:=pp(@d) 使指针b指向d.
 
记录不能 create, 他的用法是非标准用法,
可能是把 d 中的东西转换成 pp,
标准的应该是:
b := new(pp);
with b do
begin
a := 'sdkfj';
b := 1;
end;

用完后 Dispose(p);
 
1 record不能Create;
2 pp(@d)是将d当作pp1这种类型来看待;也就是说:d[0..3]是PP1.a,
d[4..7]是pp1.b;
3 d是系统自动分配的,不用New.
 
他把记录和类搞混了!
 
记录是记录,类是类
 
我在好几个控件中都看到了这类用法,也许是我没说好我再举个。

type
PP=^PP1;
PP1=record
s:string;
i:integer;
end;

var
ii:array [0..10] of Byte;

procedure TForm1.Button1Click(Sender: TObject);
var
po:pp
begin
po:= pp(@ii);
end;

zensst说得对!这的确不用create因为不是pp=class;
就是“po:=pp(@ii)”这是什么意思。

 
另外!我学习object pascal的所有知识都来自delphi 3 编程指南的上册,我想
问下有没有比它讲object pascal更深入的书??
 
已经说过:
2 pp(@d)是将d当作pp1这种类型来看待;也就是说:d[0..3]是PP1.a,
d[4..7]是pp1.b;

就像:P: Pointer
你可以用Integer(P)把它当作Integer来用.
 
zensst:

那么d[0..3]是pp1.a d[4..7]是pp1.b
这样和定义的d[0..20] of byte类型不是不对头吗? 再说一个数组又怎会前半截是
一个类型后半截又是别一个类型呢?

请多多指教!!
 

po:= pp(@ii);将@ii强制转换成pp类型的指针赋给po, 但这时候
po.s和po.i如何划分我觉得就成了问题
 
定义一个类型,只是在高级语言中才有的;你见过在机器码中有类型的说法吗?
计算机不懂什么是类型!

所以,你想让计算机把一个东西看成是什么,计算机就认为是什么!你想让计算机
做什么,它就做什么!

Pascal要检查类型匹配,我对C 不是很熟,不知道C是否要检查。如果Delphi不报
错,说明语法是对的,类型可以匹配。
事实上,d:array [0..20] of byte
申明了内存中的一段连续单元,让计算机
“初步”认为是Byte。在以后的应用中,你可以叫计算机把他当作是任意的东西,
只要不“违规”,(其实,计算机本身不知道是否违规。任意的二进制值在内存中,
都可以被执行,只是,有时候,CPU会理解显示A,有时候理解为Reset,有时候会使
堆栈溢出...Win95中的“非法操作”也只是软件(人的看法)的理解)。
知道Integer是什么吗?在Delphi中,就是4个Byte啊。只是要注意前后大小的顺序。只是要注意不同编译器、不同版本的理解可能不同哦。
知道string是什么吗?在Delphi中,就是Pointer,4个Byte。

另外,有句话,说得有些重:好好上课,多多看书。
我是学自控的,以前读书时,有单板机的实验课。所以,我现在都老是把程序看
成二进制数据。哎,烦...

 
zensst:

多谢!多谢!

金玉良言应当紧记!
 
zensst:

把386,486的机器能改造成单片机吗??
 
这是个指针的问题
用Delphi的容易出这个问题
你没学过C吧?
建议补补课
 
@d 取d的地址,
PP( X ) 将x转换成pp类型的(强制类型转换),但是X必须是指针(地址),
所以X = @d,

转换后,数组d当作已经分配好21个地址空间的指针,在内存中按照
索引顺序存放。纪录域按照字节分配。
 
左轻候:

说得对,我没学过C。所以上个星期把C和C++恶补了一下,对针指有了深入的认识
会同时对object pascal语法的严紧和“完全的面象对象”二者深有体会,更加为delphi的可视化环境骄傲。
但是,没有object pascal的基础我不可能在一个星期把C和C++看懂。

各位:

pp[0].s:='aaa';
pp[1].i:=123;
对吧!
 

pp[0].s:='aaa';
pp[0].i:=123;

这样好象还是不对,pp是指针并非数组它指象强制类型pp的ii数组。
 
后退
顶部