中国开发网: 论坛: 程序员情感CBD: 贴子 20753
Water: 好帖!
http://community.csdn.net/Expert/topic/3329/3329170.xml?temp=.8509943





主  题: 请大家解释一下这个代码
作  者: sywxy (学习DELPHI)
等  级:
信 誉 值: 87
所属社区: Delphi VCL组件开发及应用
问题点数: 100
回复次数: 150
发表时间: 2004-9-1 11:59:40




function TObject.ClassType: TClass;
begin
Pointer(Result) := PPointer(Self)^;
end;

主要几个关键词:Self,PPointer,^.
谢谢。
为什么要这样返回ClassType.





回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 12:09:34 得分: 0



Self当前类的指针
PPointer就是C的**,指针的指针
^就是指针指向的值

明白了吧:)

至于VCL实现机制就没去研究了,又不是自己开发新架构,花时间在这里没必要
希望程序员要面向商业,编程是你的职业的话,就要了解商业

很多技术上很强的人为什么不能发达?他忽视了商业呀
很多成功的商业化,其技术并不是最优秀的

希望大家多学习点非技术的东西吧,有时候比程序来的更有意义:)



Top

回复人: yourlin(火暴弓虽) ( ) 信誉:100 2004-9-1 12:16:31 得分: 0



学习~~~~~~~

指针的指针,再取内容,就是原来的指针了,
返回的应该是当前对象的指针吧



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 12:41:24 得分: 0



function TObject.ClassType: TClass;
begin
Result := PPointer(Self)^;
end;

这样也可以返回ClassType.



Top

回复人: asj(最烦活稀泥) ( ) 信誉:100 2004-9-1 12:44:18 得分: 0



Self在对象中指当前对象,类中指当前的类
ClassType是类方法,所以返回的是当前类
PPointer(Self)^是把Self当作一个指针的指针,说明ClassType也是一个指针,应该指向的是类的虚方法表吧,不是很确定

具体的类和对象在内存中的表示,可以看看坚果系列的Delphi技术内幕,其他一些较为书中应该也有说明的吧




Top

回复人: wofan(我烦) ( ) 信誉:85 2004-9-1 12:49:07 得分: 0



多看看书吧



Top

回复人: beyondtkl(大龙驹<逝追.弗瑞德>) ( ) 信誉:100 2004-9-1 13:07:08 得分: 0



TO ly_liuyang(Liu Yang) ( )
我很赞同你的说法 不过我想补充一些

我们不同的人 不同技术层次 的人对事物会有不同的看法
如果技术比较低的话 当然首要任务就是去猛攻技术方面 当技术方面过的去的时候 就必须要从其他方面多多考虑了 比如你说的商业性 也就是说你做的东西有多少商业价值,而不是技术价值,在现代的社会,没有商业价值,就几乎没有价值可言 所以你必须要考虑你做的东西 市场潜力 接受度有多大,,如何去设计更多的亮点 让客户使用你的软件<买你的商品>.....




Top

回复人: BigAngell(风雨英雄) ( ) 信誉:100 2004-9-1 13:08:52 得分: 0



学习



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 13:25:51 得分: 0



我很不赞同刘洋的话,而且非常非常不赞同!

>>至于VCL实现机制就没去研究了,又不是自己开发新架构,花时间在这里没必要

这是什么话啊。就你这句话我就不信你是一个delphi好手。

另外,别人问的问题,你回答就是了,要求别人干什么有什么用?无聊人……

在cg的帖子里就看到你胡扯。甚为不满!

他们不是傻瓜,cg,ehom,lxp,plainsong,风炎个个都是好手,个个都不是傻瓜。他们为什么把这些几乎完全“没用”的东西搞明白。李维甚至出了书籍,你就不想想为什么?

今天我看到周爱民的rtl的书甚至也出了。按你的道理,不开发一个delphi干吗学rtl?周爱民是不是脑子生浆糊了?

不开发框架就不要学vcl了?学了编译原理就一定写编译器?学了计算机组成原理通讯机理,逻辑电路就要去开发硬件?你什么逻辑什么概念!不要误导别人!




Top

回复人: shitianj(仲) ( ) 信誉:100 2004-9-1 13:38:16 得分: 0



针锋相对~

弓虽~!!



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 13:39:56 得分: 0



别跑题了。



Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 13:50:23 得分: 0



呵呵
不用赞同就不赞同的
没什么大不了的,这样的问题仁者见仁,智者见智,没有固定界限的

我意见仅作参考,有没话叫你一定要听

老实说,我不是Delphi好手。因为我不认为某个工具或语言精通就能成大器!
开发一道讲究的是思想,不是具体什么语言,什么工具,所以对语言的比较,工具的比较是非常的无聊和没有意义的,选择你熟悉的就行了。至于对具体的语言工具的语言特色,工具特色研究更是没商业意义。

例如,用C写出那些很有技巧的代码,炫耀一下自己的本事,有意义吗?反而简单易懂的代码才有很大的价值。

局限于特定的语言特色也是毫无疑义的,工具不可能一成变的,没有那个语言是永恒的,新来的C#就是个例子;只有算法思路架构是可以延续的。

我不反对去研究RTL什么的,你有时间精力,大可以去做;作为研究,我很支持
但从商业考虑,意义不大,某天你要改用VC了,C#的,那你的DelphiRTL不就用处不大了?

太过局限于某个具体工具或语言的东西还是少花精力的好,你不能保证你一辈子只用Delphi的吧?

作为公司的项目总监,这就是我积累的一点个人经验和看法
公司的项目不是固定的,Delphi,VC,ASP,C#,Java都要用到

编程高手?很好你就继续做程序员吧,管理层没你份的,因为你只会Coding

当然社会是需要各样层面的人,你愿意,没人会阻止你的:)

上面见解如有相同纯属意外。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:02:39 得分: 0



没有一种语言是永恒的,但并不代表你就不花心思去学!

干一个像一个,精通一个领域内的东西,才有资格说这个领域的东西!

这不是我说的,是Brain Kernighan说的。

现在不是仅仅会用的地步,要明白。

有些东西就是基础知识,当基础知识把握好了,其他东西都水到渠成。

才能做个合格的coder。

且,干一行爱一行,做一个合格的程序员才是首要的!

我赞叹并且佩服zswang,aminigoo这样的高手。

管理层?我压根就不想去做什么管理。管理就很厉害,管理就吃遍天下?

人人都可以做管理?ari给我说,一个不怎么样的人照样能管一群博士生。

管理毕竟只是个别人做的。而程序员还是大多数!

我的老总给我提最后还要入管理,我说我不干管理,我相信我就是一个程序员。

别把你那套理论拿出来胡人!这里毕竟是技术论坛,我们说的是技术问题!

不是什么管理问题!



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:05:16 得分: 0



就这个问题来说你这些话

——————————————————————
至于VCL实现机制就没去研究了,又不是自己开发新架构,花时间在这里没必要
希望程序员要面向商业,编程是你的职业的话,就要了解商业

很多技术上很强的人为什么不能发达?他忽视了商业呀
很多成功的商业化,其技术并不是最优秀的

希望大家多学习点非技术的东西吧,有时候比程序来的更有意义:)
——————————————————————

说的有必要吗????????

难道做程序员一定要商业吗??????



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 14:11:49 得分: 0



谈谈自己的看法:中国有句古话:劳心者治人,劳力者治于人。不无道理,不过看这句话的时候要想到说这个话的人的心态,所以这个话仅仅也是描述客观情况的一种现象。也有这样的人,宁可老力一生,也不去主动琢磨如何转变成治理自己的老心者。因此,主观意识不同,得出的结论也不同,没有必要为两种不同的主观造就的两种言论孰对孰错争执!

这种结论不会有什么结果的!

做开发精通语言仅仅是必要条件,语言仅仅是个工具,很多语言的内部实现都大同小异。精通一门语言有助于以此逻辑理解彼逻辑,精通之道也就在于此。思想重要,而且也不是一日之功!至于技术之外的东西,愿意去搞就去搞,只要搞的自己可以事业腾达,Money多多,我想任何一个老力者都不会拒绝的.....



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:17:23 得分: 0



function TObject.ClassType: TClass;
begin
Pointer(Result) := PPointer(Self)^;
end;

我来解释!首先你得明白TClass和Self到底什么类型,什么含义。

Self是一个指针变量,在类方法可以做指向类的指针,也或许是一个指向对象的指针,而对象本质则是指向你的内存中类型指针。

delphi帮助上有这么一说self:

In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use Self to access fields, properties, and normal (object) methods, but you can use it to call constructors and other class methods.

A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.

所以说Self是一个类似PPointer的变量。而PPointer是无类型的,而Self是类的类的类型。

type
PPointer = ^Pointer;

TClass的声明是:TClass = class of TObject;

TClass本身是一个指向类的指针,是一个Class Reference。

你可以用TClass.Create;建立一个TObject的对象。


^是得到指针内容的运算符,具体看帮助或者基础书籍。

如PInteger类型就是指向整形的指针,

var
P: PInteger;
I: Integer;
begin
New(P);
P^ := 12345678;//这样就是给P的内容赋值
I := P^; //而这样就是取到指针P的整形内容
end;

因为两者本身是有一定的区别的,不能直接赋值。

但是不能这样来操作,

Result := Self^;

原因是Pascal对类型要求很严格。

所以用这种变通的办法,用无类型指针Pointer来转换一下。

Pointer(Result)将TClass类型强制转化为无类型指针。

PPointer(Self)将其强制转化为指针的指针。

Pointer(Result) := PPointer(Self)^;

这样就行得通了。就是这样。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 14:17:33 得分: 0



个人比较倾向,技术管理都重要的结论!

管理也是一门艺术,难度甚至比技术还高.....



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:25:58 得分: 0



总结:

关键字Self,可做Object Reference 也可做 Class Reference,具体见帮助。

关键字PPointer,指向指针的指针,其内容是指针。优点,不管内容指针地址发生变化,它都不会变,具体使用方法,看一些C语言的书。不提倡使用,因为许多学C语言的人就是因为搞不懂这个而望而却步,你知道Self的作用就是了。

关键字^,两个作用,在你的问题内是取指针内容,指针变量本身存的是一些地址。而地址上所存储的是什么,用^访问。^ 声明一个指针变量。相当于C语言的*

如:

type
PPointer = ^Pointer;
PInteger = ^Integer;
PStruc = ^TStruc;
TStruc = record
ID: Integer;
Value: string;
end;



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 14:31:24 得分: 0



PPointer(Self)^ 相当于C语言的**Self吗?



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 14:36:17 得分: 0



看到了,谢谢。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:36:53 得分: 0



就所谓适用原则,我就不信不好好用一种语言就能写出好软件,

不可能总用一种,但,用了就要做到熟悉!

to 刘洋:

你的眼光局限在狭小的空间。

在国外,一个好的软件维护是要超过5年的。5年,对一种语言不好好了解能做得出来?

一个软件是要靠维护的,你卖给别人软件就不管了?对一种语言不好好了解能维护得了?

做一个好的软件是要明白的,就delphi,你不了解Vcl,我就不信能在黑箱操作下能做得出好的东西。

管理不是人人都能做的,术业有专攻!但是不能拿你的要求来要求别人。

找个帖子就说,不要花时间在Vcl上了,在cg的帖子里,大家不理你,你不想想为什么?

我在Csdn曾经大说我开的公司。那又怎么了?开了公司又如何?管人又如何?有了73万又如何?

能说明什么?说明我还是什么都不懂!什么东西都是要靠积累的。包括管理!

管别人,先要学会被人管!我就是这个心态,我不要了我的管理!

多说无益,跑题了……



Top

回复人: Eastunfail(龍子龍孫)    (家里停宽带了) ( ) 信誉:125 2004-9-1 14:40:15 得分: 0



PPointer(Self)^=*((void**)self)



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:40:39 得分: 0



**self并不确切。因为self是指针,不是类型。

如果类是TObject,Self或许可以说是**TObject。

但Self是两个含义,具体还是看帮助。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:49:34 得分: 0



最为公司的项目总监,我认为你狠不称职,你以为一个项目总监就需要同一类的人才?你又错了。

一个好的管理人才,不是要让员工作同一种事情,而是发挥特长,发挥核心竞争力。

按照你的理论,大家都只了解一部分就够了,就都作项目赚钱,然后去管理。

我们的项目总监从不排斥你花时间学Vcl如何如何。

说:对项目你不感兴趣,你这个感兴趣,就修改公司的框架吧。做项目辅助工具。

好了,做出来了工具,项目开发速度提高了1/3。怎么?这就是关心技术的优势!

研究研究ToolsApi,研究Xml,项目开发质量又一次提高了。

人们总要发挥各自的特长,不是每个人都能去做项目,不是每个人都作管理。

人人都技术作半吊子二百五,人人都去做管理,这公司还开不开?

我做老总的时候还没有你口气大,现在你做个项目总监口气比我还大。

哈,不甘人后是好的,但不能过分排斥干某些事情的人!

我做Coder有理,我乐意,我热爱这一行,就像我尊重扫大街的人一样,

从你的口气感觉对Coder的不尊重,BS你!

Dijkstra老先生在人生的最后几年还在作coding。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 14:51:02 得分: 0



钱钟书老先生有一句话:中国不是缺研究人员,其实他们都去做官了……

嗬嗬,祝愿你的公司倒闭!



Top

回复人: Eastunfail(龍子龍孫)    (家里停宽带了) ( ) 信誉:125 2004-9-1 14:55:06 得分: 0



这里只能连续回复三次,现在reallike不能说了。我来顶以下,继续继续



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:00:01 得分: 0



从对象模型角度考虑,可以更容易理解,而不仅仅是从语意角度去理解:

TClass是类类型,而类是堆中VMT的存放地址,如我们常使用的TObject实际也是一个指针,也为四个字节,里面存放的就是TObject的VMT在堆中的首地址。因此TClass就是指向TObject这个指针的指针类型,说白了就是一个二级指针变量类型(注意:指针和指针变量不要混淆)。可以认为是指向堆中对象实体的头四个字节(CPP中叫VPTR)的指针;

对于Self,在类方法中就是TObject的VMT在堆中的首地址,就是TObject这个一级指针!

因此,要把一个一级指针赋予一个二级指针变量必须转换类型,对于一级指针,首先要转换成二级别指针PPointer(Self),但这个表达式表示的是指针变量的地址,而不是指针变量里面的指针----地址!所以还需要释放指针PPointer(Self)^;而对于二级指针变量Result,要直接接受一个地址(即指针),也要转换为一级指针变量类型才可以,即Pointer(Result),即让被指向的指针变量接受这个地址,而不是二级指针变量本身接受这个地址。因此,有了上面的楼主引用的代码!



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:01:55 得分: 0



小眼镜,别胡闹。随便说说而已。

to 楼顶的 sywxy(学习DELPHI)

如果问题解决了,请你注意及时结帖。

我对分数不在乎的,我也不经常来,你可以给别人。

但是,对别人要及时结帖,这个是对他们花心思回答的一种报答。

希望你能踏踏实实的学好Vcl的机理,特别是TObject这块。

撤了。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:03:16 得分: 0



因此,上面RL的解释中有几个地方不正确:

1.首先在类方法中Self不类似于PPointer,Self就是一级指针变量,而不是二级指变量;
2.对Result进行类型转换的主要目的不是为了进行类型的匹配,而是进行指针级别的匹配;



Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 15:11:35 得分: 0



呵呵
我可没你那么有空在这里说,那么多话讲的

嘴吧上的优势没有用的,也懒得和你斗嘴的

我已经声明过,不需要任何人按我的话去做

那我做低手好了:)才不在乎呢

用事实说话才是硬道理

>>>>
FS说的才有道理,正解!

>>>>
VCL我搞,组件Debug也做,SDK搞,Delphi级别的DDK也去玩玩,呵呵比较杂的

欢迎光临:http://lysoft.7u7.net



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:11:49 得分: 0



严重总结:技术是必要条件,管理是必要条件,技术+管理是充要条件!

完蛋了,不能回复了!



Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 15:11:58 得分: 0



呵呵
我可没你那么有空在这里说,那么多话讲的

嘴吧上的优势没有用的,也懒得和你斗嘴的

我已经声明过,不需要任何人按我的话去做

那我做低手好了:)才不在乎呢

用事实说话才是硬道理

>>>>
FS说的才有道理,正解!

>>>>
VCL我搞,组件Debug也做,SDK搞,Delphi级别的DDK也去玩玩,呵呵比较杂的

欢迎光临:http://lysoft.7u7.net



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:13:04 得分: 0



var
a,d:PInteger;
b,c:Integer;
begin
New(a);
b := 100;
a^ := b;
d:=PPointer(a)^;
c := Integer(d);
showmessage(inttostr(c)); //c返回100
end;




Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:14:00 得分: 0



我对分数在乎,我大半年没得过分了,全给我吧!上帝保佑你!



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:15:22 得分: 0



var
a,d:PInteger;
b,c:Integer;
begin
New(a);
b := 100;
a^ := b;
Pointer(d):=PPointer(a);
c := d^;
showmessage(inttostr(c));
end;

换一种方式也可以达到相同的结果。
谢谢各位了,一会结贴。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:20:28 得分: 0



To Sywxy:

假设指针P:^PInteger; //二级指针变量
那么PInteger(P)表示一级指针变量,这个一级指针变量是被P所指向的变量!
PInteger(P)如果不进行变量申明直接使用就是临时变量,放在线程专有内存堆中,线程结束的时候自动释放资源。当然,如果进行变量申明照样释放!




Top

回复人: nyf1220(我是党员) ( ) 信誉:119 2004-9-1 15:25:01 得分: 0



一个指针,让说的这么神秘



Top

回复人: gunnery(天平座射手) ( ) 信誉:95 2004-9-1 15:26:16 得分: 0



Delphi 用了很久很久,算是还不错了,可现在回过头发现还是很穷,
商业化是一切发展的基础,包括语言本身、Delphi和一切



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:26:40 得分: 0



不明白≠神秘

鄙视这个党员!



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:28:49 得分: 0



想给分,总出错,难道在CSDN中给分这么难吗?



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:28:52 得分: 0



没有必要???不需要任何人按我的话去做????

看看这句话:

>>希望程序员要面向商业,编程是你的职业的话,就要了解商业

这算什么??希望是什么意思??难道不是说了你的看法?

to fs

1、self就是就是指向指针的指针。自己证明去。

2、我不明白你级别匹配是什么意思。类型强制转化是一种手法而已。事实摆在面前。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:30:43 得分: 0



不能给分是我们又回答了。嗬嗬。:〉



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:32:26 得分: 0



To RealLike

Self不是指向指针的指针。Self就是TObject。CPP里面的This不是二级指针吧?
级别匹配就是一级指针的值直接赋予二级指针必须通过转换(具体语意环境下)。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:33:12 得分: 0



var
a,d:PInteger;
b,c:Integer;
begin
New(a);
b := 100;
a^ := b;
Pointer(d):=PPointer(a);
c := d^;
showmessage(inttostr(c));
end;

理解有误啊。

错了错了!!!!



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:33:22 得分: 0



另外,经过调试发现PPointer(a)=Poiner(a);



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:33:47 得分: 0



Self是指向这个TObject的指针,不是TObject本身。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:34:16 得分: 0



那里进行转换的目的你说的不对,如果照你说的那个目的,转换成任何指针类型都可以,但要出现AV错误了(在日后的使用中)。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:36:20 得分: 0



等你们都不再回复时,我再结贴。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:37:15 得分: 0



var
a,d:PInteger;
b,c:Integer;
begin
New(a);
b := 100; //
a^ := b;
d:=PPointer(a)^; //d现在存的是地址100的内容!地址100有什么呢?未知!
c := Integer(d);
showmessage(inttostr(c)); //c返回100
end;

var
a,d:PInteger;
b,c:Integer;
begin
New(a);
b := 100;
a^ := b;
Pointer(d):=PPointer(a); //这里加不加一个样,等价于 d := a;
c := d^;
showmessage(inttostr(c));
end;



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 15:37:35 得分: 0



TObject本身不是变量,仅仅是一个指针。

To Sywxy:

你的A是什么东西?



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:39:18 得分: 0



to FS

本来转换成任何类型指针就可以,一点问题都没有!

而且这种方法在Vcl中处处可见。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:39:32 得分: 0



我的这个a只是一个var a:PInteger;



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:41:01 得分: 0



to FS

TObject是类,而其对象才是一个指针。

而Self是指向这个对象的指针。

我不再解释了。有关类型强制转来转去。VCL特别是system.pas中很多。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:43:48 得分: 0



Pointer(d):=PPointer(a); //这里加不加一个样,等价于 d := a;
我原来想这样写: d := PPointer(a); 但无法通过编译,有类型不批配的错误提示,所以就写成了上面这个形式,但实际上就是 d := a了。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:44:09 得分: 0



To Sywxy:

打开你的本地变量窗体:

View ->Debug Windows -> local variables

看看你的东西,a b c d到底怎么变化的。

$ 号后面就是地址。自己仔细观察。



Top

回复人: beyondtkl(大龙驹<逝追.弗瑞德>) ( ) 信誉:100 2004-9-1 15:44:30 得分: 0



啊哈哈。。。没想到这么热闹。。。

我觉得 什么问题 都是仁者见仁的 ly说出来也只是说把他的经验 心得提出来 不一定就是强求别人必须这么做。。。
每个人追求 或者说某个不同阶段追求的目标都不一样 自然自己的侧重点都不同
每个人有每个人自己的经验 看法 思维方式 我们都拿出来摆一摆 不同思维的对撞 才能激出火花 而相信 我们每个有去思考的人都会有一定的收获...

就我个人来说 我现在就是夯实自己的技术方面,包括基础,算法等很多东西。。但同时也会关注各方面的东西 比如行业动态,不一定就是本行业的,可以是其他很多行业,这些行业可能是很有发展潜力 又很少人关注的 等等,关注科技性,财经动态。。。总之 能多吸收点就吸收点..



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:46:11 得分: 0



to FS

Self 有是一个Object Reference,有时候是一个Class Reference。

具体察看帮助。你说的那个是在Class Reference的前提下。

而帮助也说了,如果是一个Object Method调用,Self会变成一个Object Reference。



Top

回复人: beyondtkl(大龙驹<逝追.弗瑞德>) ( ) 信誉:100 2004-9-1 15:48:59 得分: 0



delphi de Self 有点类似 C++ 中的this指针

只不过delphi的 dereference 方式不一样而已。




Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:54:27 得分: 0



To Sywxy:

而我们现在讨论的是指向指针的指针的问题。

type
PPInteger = ^PInteger; //定义一个指向指针的指针类型
var
a, c:Pinteger;
d:PPInteger;
b:Integer;
begin
New(a);
New(d); //d就相当于Self
b := 100;
a^ := b;
d^ := a; //a的地址成为了d的内容
Pointer(c):=PPointer(d)^; //强制转化为无类型,给c
showmessage(inttostr(c^)); //显示c的内容。
end;

原理就是这样



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 15:55:59 得分: 0



明白了,谢谢 reallike(学习SICP还有Lisp……) ,明早结贴。:)



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:57:03 得分: 0



原理就是把d保存的a的地址给了c,这样c就得到了a的地址。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 15:59:11 得分: 0



相对与这个:

Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^;

这个是什么意思呢?:〉



Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 16:00:40 得分: 0




希望不等于就是要求
我希望你RL别来发帖,你会听吗?呵呵

事实上了解多点商业上的东西总不会有错的

技术+商业才是原子弹

因为技术和商业是相辅相成,互为依靠的,光有一样不行的

而我自己感觉比较缺乏商业技能,所以要加强这方面的学习;技术,本人认为现在的我都可以应付不少事情了...



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 16:02:53 得分: 0



返回ClassName.



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 16:07:21 得分: 0



但是,机理呢?PPointer(Self)^返回的是Class Reference

PPointer(Integer(Self) + vmtClassName)^

加了虚函数表的一个偏移量了,返回的是什么?

而这么多:

{ Virtual method table entries }

vmtSelfPtr = -76;
vmtIntfTable = -72;
vmtAutoTable = -68;
vmtInitTable = -64;
vmtTypeInfo = -60;
vmtFieldTable = -56;
vmtMethodTable = -52;
vmtDynamicTable = -48;
vmtClassName = -44;
vmtInstanceSize = -40;
vmtParent = -36;
vmtSafeCallException = -32;
vmtAfterConstruction = -28;
vmtBeforeDestruction = -24;
vmtDispatch = -20;
vmtDefaultHandler = -16;
vmtNewInstance = -12;
vmtFreeInstance = -8;
vmtDestroy = -4;

vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;

你有没有一个个试试看呢?

嗬嗬,自己尝试一下吧。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 16:09:07 得分: 0



还真的没有尝试呢。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 16:11:38 得分: 0



to 刘洋

你是你,你满足是你满足。

你在家吃饭,突然有人告诉你,你吃饭没有营养,

或者突然告诉你最近流行禽流感,不要吃鸡肉。

到底听还是不听?

说话是要负责任的,甚至说是要讲道德的,

每一句话都是要影响别人的!

如果你的话想类似:我希望你RL别来发帖,你会听吗?

没有人听了。那你这个人我就不多说什么了!

好自为之。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 16:13:54 得分: 0



to sywxy

整个虚函数表。就这些东西了。用vmt打头的偏移量访问。

仔细看看代码,试试看,不要怕搞死,注意类型转换。

好了,直到原因了就结束了吧。不想多说了,我忙我的。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 16:16:33 得分: 0



好,再次感谢。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 16:19:56 得分: 0



另外,注意语言原理的学习,如果没有,先看语言原理。

比如vmtDefaultHandler这个偏移量就是访问DefaultHandler函数的地址。

在Dispatch可以知道。

在MethodAddress 可以用到vmtMethodTable这个。

函数指针是怎么一回事也要搞清楚。怎么用函数指针访问这两个偏移量下的东西。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 16:23:12 得分: 0



to FS

TObject是类,而其对象才是一个指针。

而Self是指向这个对象的指针。

我不再解释了。有关类型强制转来转去。VCL特别是system.pas中很多。

----------------------------------------------------------------------
To RealLike:

试问类是什么呢,类无非就是堆上的一个指针表(近似意义上说是如此);你可以认为类是VMT本身,但表征类名称的串(如TObject这个名称)在编译器看来就是一个指针。你可以用Integer强制转换自己看看返回的到底是个什么东西。写代码无非就是对内存中的数据进行查询、分析和搬运的过程。我这里既然说Self=TObject,当然是针对楼主的情况而言,当然不是针对对象方法的情况而言,这点从一开始就是如此。






Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 16:43:41 得分: 0



每一句话都是要影响别人?
我有这么大影响力吗?怎么不见影响某人?

相信群众是有分析能力的

本来就没所谓对和错,从不同的角度出发看自然的出不同的结论

你与我层次不同,看问题角度不同自然见解不同

还是务实点来得实际,让事实说话去!

不再继续讨论此类问题<<



Top

回复人: qiliu(痴心求学) ( ) 信誉:100 2004-9-1 16:46:57 得分: 0



delphi用的是pascal语言呀
c太麻烦;



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 16:55:01 得分: 0



to FS

堆中指针表没有错。

类型强制转化,本身就是一个简单的机理。

Pascal就是这么复杂类型不匹配就是不给编译通过。

而TObject是类,类在哪里存着?

作为类的一个副本的对象在哪里?

强制转化只是一个手法。没有你说的什么二级、一级的指针这种。我还从来没有听说过……



Top

回复人: jsjgirl(从前有座山,山上有座庙) ( ) 信誉:100 2004-9-1 16:55:50 得分: 0



呵呵,真有趣,其他人可以完全当reallike(学习SICP还有Lisp……) 和ly_liuyang(Liu Yang) 的争论透明,专心地讨论技术,回归真正的主题,值得表扬!!

reallike(学习SICP还有Lisp……) 和ly_liuyang(Liu Yang) :要不我开一张贴给你们,慢慢聊,不要妨碍别人,好吗?




Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:00:01 得分: 0



诸位可能将PPointer想复杂了吧!解释来解释去,都看不懂了!
pascal中引入PPointer的目的,无非就是要操作指针的指针。举个例子,现在知道地址D中存放了一个指针P,已知D,如何求得P呢?
很简单,就是PPointer(D)^。解释一下:
(1)PPointer(D),相当于构造一个指向指针P的临时指针;
(2)PPointer(X)^得到临时指针所指向的指针。

拿Pointer(Result) := PPointer(Self)^来说,实际上这句代码可以有很多等价的变体,比如:
(1)Result := PPointer(Self)^;
(2)Pointer(Result) := PPointer(Integer(Self))^; //Integer(Self)取得对象实例在内存中的地址。因为对于Self的特殊处理,这里Integer(Self)和Self有了等价效果。
因此ClassType返回的是什么呢?对象实例的头四个字节存放的是一个指针,该指针指向类的VMT。因此ClassType返回的就是一个指向VMT的指针,这就是一个类引用变量的含义;那么,所谓类引用,也就可以看作VMT了。解释一下:
(1)类引用。TClass = class of TObject; 是类引用,或者更全面地说,TClass是一个类引用类型。
(2)类引用实例。 var C: TClass; 其中C是一个类引用实例,或者说类引用变量。

至于Self在类方法和实例方法中有区别,这应该是不容置疑的。在类方法中表示类,或者干脆说就是一个指向VMT的类引用实例,而在实例方法中,则是一个指向对象实例的指针。因此Self也并非所谓二级指针。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————







Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 17:00:18 得分: 0



对象就是一个指针,指着这个虚函数表的第一位。

而TClass的变量要的就是这个第一位的内容。是一个class referece。

我不用Integer返回什么。我有Local Variable,Cpu,Call Stack窗口。

还有Ctrl + F7,甚至用CodeSite都可以看到。

FS,我不跟你争什么,好好弄明白,

武断不是说你说的是错的,

而是认为自己说的是对的而不去证明正确性。



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 17:08:12 得分: 0



to 故国

delphi没有引用这一说,只能用指针来解释,无法。

Result := PPointer(Self)^;

这个你能编译通过?????Pascal类型检查这么严格??

为什么要用Pointer(Result);

而PPointer(Integer(Self))^;

何必多此一举?随便一个指针都可以强制转化,

这样也可以:

var
Data: Pointer
begi
PInteger(Data)^;
end;

难道这样?Pinteger(Integer(Data))^;

我只不过看他不知道机理,解释一下而已。没感觉有多困难。



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:12:10 得分: 0



可以测试:
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
function ClassType: TClass;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.ClassType: TClass;
begin
Result := PPointer(Self)^;
Result := PPointer(Integer(Self))^;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(ClassType.ClassName);
end;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 17:17:29 得分: 0



Integer(Result) := Integer(PInteger(Self)^);

故国,这样是不是更容易理解?

这种方法,在TList, TStringList都有类似的。

FS,如果不信,你把我这句搞进system.pas里面,照样可以编译通过,也可以用。

二级指针?还是类型转化?

Pascal的类型检查有时候就是很无聊。



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:19:37 得分: 0



另外 ro rl:
1、我不知道“delphi没有引用这一说”中你所说“引用”是什么意思。我说的引用就是“Class references”
2、不清楚:
{var
Data: Pointer
begi
PInteger(Data)^;
end;

难道这样?Pinteger(Integer(Data))^;}

什么意思。你这里是直接取得Data所指地址内的数据,当然不需要Pinteger(Integer(Data))^,因为这并不是我所说取得Data所指地址内的指针。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: reallike(学习SICP还有Lisp……) ( ) 信誉:100 2004-9-1 17:25:38 得分: 0



function TForm1.ClassType: TClass;
begin
Result := PPointer(Self)^;
end;

那又说明了什么,编译器还不是解释为一句话。

mov eax, [eax];

但是你能保证所有的delphi编译器都可以把这个类型转化降低门槛。

比如这个:

PStruc = ^TStruc;
TStruc = record
ID: Integer;
Value: string;
end;

var
P: PStruc;
begin
P^.ID; //语言方面这个应该是正确的。
P.ID; //这样现在也是可以的。但在以前的版本这样是不可以的。
end;

现在的版本能说明原来的代码吗?



Top

回复人: rcaicc(√(抵制日货。一种习惯)) ( ) 信誉:97 2004-9-1 17:26:53 得分: 0



楼主好有福,居然可以得到这样的答复。



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:36:24 得分: 0



reallike:我提出
Result := PPointer(Self)^;
的目的是说明PPointer的意思,语句如何理解的确是编译器的问题。甚至在某个时候,新的编译器可能不允许对赋值语句左边的部分做类型强制转化,比如可能认为:
Pointer(Result) := PPointer(Self)^;
不合法了。

另外:
Integer(Result) := Integer(PInteger(Self)^); (可以简化为
Integer(Result) := PInteger(Self)^; 或者
Integer(Result) := PInteger(Integer(Self))^; )
的确可以正确运行。当然它仍然说明对象实例的头四个字节存储了指向VMT的指针。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 17:37:42 得分: 0



故国说的就是两个虚函数表,一个是对象的,一个是类的。就看找哪一个了。

不过楼顶问的关键字可是:PPointer, Self, ^

不得不解释一下为什么要对Self用PPointer的意义。



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:40:36 得分: 0



leeon868(Delphi无神论者):你不要乱给我解释啊:)
“故国说的就是两个虚函数表,一个是对象的,一个是类的”,不知道我哪句话给你这样的理解。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 17:41:28 得分: 0



所以才是我解释Pointer和PPointer的意思。

如果稍有汇编知识,自然明白如何如何。

反正他已经明白是取到虚函数表里的指针地址,就没有白说什么。



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 17:43:47 得分: 0



就是我,就是reallike。

不知道谁设定的这个回复不能超过30。颇为讨厌。

这句话让我理解的:

对象实例的头四个字节存放的是一个指针,该指针指向类的VMT。因此ClassType返回的就是一个指向VMT的指针,这就是一个类引用变量的含义;那么,所谓类引用,也就可以看作VMT了。解释一下:




Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 17:53:37 得分: 0



都是忍不住讲返句:

PPointer(Self)^等价于Pointer(Pointer(Self)^)这样理解容易很多

Pointer(Result) := PPointer(Self)^
其实就是
Pointer(Result) := Pointer(Pointer(Self)^);
事实上就Result := Pointer(Pointer(Self)^);都可以工作得很正常

也可以认为是
asm
mov eax,[eax]
end就能通过了



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:55:23 得分: 0



“就是我,就是reallike。”,噢,^_^!
那句话不应该引出这样的疑惑啊,不解!我一直觉得我说话还是比较有条理的……
VMT和类一一对应,当然是不可能有两个的。对象实例的数据区中不过是有一个指向VMT的指针罢了,调用对象实例的成员时,经常需要在VMT和DMT中查来查去……

OK,可以结贴了。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 17:57:15 得分: 0



没有,ly所说“PPointer(Self)^等价于Pointer(Pointer(Self)^)这样理解容易很多
”直白多了!

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————




Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 17:58:04 得分: 0



To RealLike

我也没有和你争什么,我只是感觉你给出的答复中两个地方不太妥当!

至于一级指针,二级指针的说法,我只是用了个自己习惯的称呼,当然我也听别人这么说过,至于含义,二级指针就是指向指针的指针!不是我不去验证,只是我从对象模型的角度去理解感觉很好理解。我前面说了,我们所写的代码无非就是对内存数据的查询,分析和搬运,所以个人认为从对象模型角度去理解已经很深入了,任何代码只不过是对对象模型操作的一种专业化表达法!

这个问题我前面已经说的很清楚了,没有必要再讨论了吧!



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 18:00:25 得分: 0



各位可以去InitInstance的代码里面去看看,只看看BASM部分就可以看的很清楚,DELPHI COMPILER在对对象进行初始化的时候都做了些什么!



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 18:01:52 得分: 0



Result := PPointer(Self)^;

编译为一句:

mov eax,[eax];

Pointer(Result) := PPointer(Self)^;
和Pointer(Result) := PPointer(Integer(self))^;

均编译为三句。

或者

mov esi,[eax]
mov edx,esi
mov eax,edx

或者

mov eax,[eax]
mov edx,eax
mov eax,edx

很机械…… 而且很高笑……

果然有的时候就需要汇编……



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-1 18:03:23 得分: 0



明天早上结贴,谢谢大家,让我学到不了少的东西。



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 18:04:16 得分: 0



to 刘洋!

你也回答了。关键字是PPointer , Self, ^

好理解不好理解是两码事,但是 问题主题就是PPointer……



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 18:07:39 得分: 0



看来我有空得认真看看汇编了!我不懂汇编,和你们相比,要搞清楚一个问题,难多了!^_^
看leeon868贴出的asm代码,后面两个三句都可以优化啊!

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 18:12:01 得分: 0



Pointer(Result) := PPointer(Self)^;

被编译器机械的翻译为:

mov eax,[eax]
mov edx,eax
mov eax,edx

就是因为加了Pointer的缘故。后两句完全可以不需要,但就是给加上了……



Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 18:15:21 得分: 0



好理解才能让人容易明白,教人的时候当然要用容易理解的方法:)
难理解不就等于没说?因为对方不理解才来问呀,问题要简单化才好

如何教人都是一种本事来的:)
我本来是做老师的,可惜放弃了...

总结我讲的内容:

Self当前类的指针
PPointer就是C的**,指针的指针
^就是指针指向的值

PPointer(Self)^等价于Pointer(Pointer(Self)^)

对于这个
Pointer(Result) := PPointer(Self)^
实际上用
asm
mov eax,[eax]
end就可以了



Top

回复人: lxpbuaa(桂枝香在故国晚秋) ( ) 信誉:244 2004-9-1 18:26:49 得分: 0



"Self当前类的指针": 错了。除非是在类方法中,否则Self代表的都是对象实例

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————




Top

回复人: nyf1220(我是党员) ( ) 信誉:119 2004-9-1 18:53:46 得分: 0



好,我是这个帖子的第100楼



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 20:16:22 得分: 0



唉,看得出刘洋的基础扎实程度……

如果一个老师说的东西是局部解释是不完全的甚至是错的,

那遗害的不是一个人……



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-1 20:19:57 得分: 0



如果实际上用mov eax, [eax]就可以了,vcl何必要写这个

Pointer(Result) := PPointer(Self)^;

vcl里面有许多Pascal代码和汇编代码等价出现的情况。可供选择使用。

为什么这里只有Pascal代码??????难道写Vcl的人脑子有问题?????

Self的真正含义是什么?一会儿是object reference 一会儿是class reference?

是的,这些不懂可以开发很多东西。

但是,如果给别人解释,请不要不懂装懂。谢谢了。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 20:46:31 得分: 0



Result := PPointer(Self)^;

编译为一句:

mov eax,[eax];

Pointer(Result) := PPointer(Self)^;
和Pointer(Result) := PPointer(Integer(self))^;

均编译为三句。

或者

mov esi,[eax]
mov edx,esi
mov eax,edx

或者

mov eax,[eax]
mov edx,eax
mov eax,edx

很机械…… 而且很高笑……

果然有的时候就需要汇编……

----------------------------------------------------------------------

To RealLike:

你这里什么意思,讲解一下。
类方法中,Self是默认的第一个参数,自然EAX里面存放的是Self的值,然后通过EAX进行地址返回。你所说的机械是什么意思,不懂!





Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-1 20:57:49 得分: 0



"Self当前类的指针"表达不清晰而已
Self是指针,指向当前类

其实Delphi是因为Pascal而Pascal

明显mov eax, [eax]就可以代替Pointer(Result) := PPointer(Self)^;!!

某人喜欢咬文嚼字的搞概念游戏,就去搞吧, 我可没兴趣

这个社会成败论英雄.可没人看你的嘴上所的理论,只看你做了什么

别在这里说一大堆东西, 做点实事让人看看吧:)



Top

回复人: fj218(洞庭风) ( ) 信誉:103 2004-9-1 21:00:16 得分: 0



我的理解是Pointer和PPointer是一回事,不要把PPointer理解成什么取指针的指针。
由于pointer是无类型指针,所以Pointer^就没有含义,编译器不知道你返回的是什么类型。如果你PPointer=pointer,然后PPointer^编译器就知道原来你是要返回一个无类型指针。这只是为了类型匹配而已,就这么简单。
我是非常非常赞同reallike的观点。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-1 21:08:02 得分: 0



哦?还真没注意这里汇编的多余操作!

Pointer和PPointer怎么可能是一回事情?这个论点有点笑话吧!



Top

回复人: tuyueje(无聊ing) ( ) 信誉:100 2004-9-1 22:00:33 得分: 0



想学精一门语言真难啊~

不过学编程可以让我们更聪明~~ 呵呵~~



Top

回复人: linzhengqun(风) ( ) 信誉:100 2004-9-1 22:20:17 得分: 0



呵呵,努力,最热门的技术讨论贴



Top

回复人: lya_lya(元元) ( ) 信誉:93 2004-9-2 0:44:26 得分: 0



技术方面而言
对于比较复杂的问题,能够静心分析,抽出关键,揭示问题的实质:

引用 liu yang 的回帖 内容和结论

"
Pointer(Result) := PPointer(Self)^
其实就是
Pointer(Result) := Pointer(Pointer(Self)^);
事实上就Result := Pointer(Pointer(Self)^);都可以工作得很正常

对于这个
Pointer(Result) := PPointer(Self)^
实际上用
asm
mov eax,[eax]
end
就可以了
"

非常的清晰明了的Pointer(Result) := PPointer(Self)^的实际功能.和几个对象之间的联系.

而 问题本身提出的也只是 关于 指针/对象 之间的疑惑而已.

liu yang 能够从计算机的底层语言揭示 出来,可以见其技术层面之广,
水平之高,除了delphi的面向对象的方面 ,连汇编和c方面的知识都是很好的.

现在,在许多可视化的面向对象语言工具出来之后,不少人已经比较少从比较底层的思维角度去思考.当

然,一般来说,这个是进步的表现,但 是,这样的也造就了今天 出现 reallike 和liuyang 在 技术

上(还有其他层面的,另外再分析 )的争论.
我详细的看了所有的回帖,下面对本贴中reallike 和liuyang 在 技术上的分析(个人观点,不当之处

请原谅啦 :-)):
liu yang 能够从面向对象和delphi语言的角度 解析了 问题本身.虽然比较简洁.但的确是正确的,也符合他回帖的性格特点, (我们要看明白,当然需要有一定的OOP和delphi基础咯).
在liuyang总结之时,更是用计算机汇编这个强者 显示了 式子本身的功能作用,从侧面回答了问题.
所以 liuyang 能够 简洁明了的 表述了Pointer(Result) := PPointer(Self)^的实际功能.和几个对象之间的联系.回答了问题.

reallike 能够从OOP和delphi的角度去讨论问题,虽然,这样对理解问题中的式子含义有帮助.但是这种
仅是为了DELPHI OOP而OOP的技术思想不怎么好,而且在表述的时候用了大堆大堆CODE,让看得有些辛苦咯.思维层面不够全咯,因为提问者虽然有OOP本身的疑惑,但reallike也单是用OOP来解析,reallike比不上li uyang高明.

以上从技术上说说,

以下从其他方面说说

我在回帖里面也看到许多关于 reallik e 和liuyang 在 关于 管理者和CODER方面的争论,
有争论是正常的,也值得鼓励,但是,希望reallike 不要太过分了.因为reallike曾经多次在言语中
骂别人,鄙视他人,甚至憎恨他人,这样做,很不应该啊.大家都有眼睛看的啊.虽然,reallike 和liuyang 在
技术上都很好,但是在思想 和道德和性格上,reallike就差多了.远比不上liuyang.

我的分析: liuyang不仅是技术上的高手,D版本里大家有目共睹,而且是一位丛成功的技术上
走上管理者 的MANG+CODE.(换句话 是 综合的多功能的高手).而 reallike 仅是CODE高手.性格和思想
方面比较那个...二人 层次不同, 虽然也有从 code 到 mang的 工作经历,但是 过程和结果不同.
大家可以从他们的讨论中自己分析.他们的技术水平\思想层面\性格特点等.




Top

回复人: lya_lya(元元) ( ) 信誉:93 2004-9-2 1:14:21 得分: 0



随便说说 我比较少在D版出现,我是多在C版的,特别是BCB版,由于BCB 也用VCL的。所以2者都看看。但仅是低手。
在C当中,指针的指针,或者指向指针的指针的。。。等,
一般是比较多用到的,在C学习的过程中,这些多次的指向事例,偶然还是可以作为
一些C的特色幽默和玩意。是在学第1本C 的书里就已经详细描述了。只是能够作为初学者的问题,现在,这里,这个问题就是原来的基础上,转了个弯,套上的面向对象的知识。
性质虽然有点不大相似,但,去皮剥肉,核还是差不多的。
而delphi和以前的pas,可能为了某些原因,尽量避免使用指针,那也有一定的好处的。
而C,不仅没有回避,更是常用,常用,常常用。所以有些代码比较难看懂。
面向对象的方式,能够提高程序开发,方便许多,可是,有时候,还是出现比较罕见的麻烦,例如这2天的讨论。
不过,能够透过事物的外表层层发掘,从多个方面看问题。经常有意想不到的收获。

所以建议大家在允许的情况下,多学习其他方面的东西,不仅是其他语言,还有社会、历史、物理等等等。。



Top

回复人: lya_lya(元元) ( ) 信誉:93 2004-9-2 1:30:37 得分: 0



程序员必须要向商业看齐。
否则,只能够作为 程序爱好者,程不上程序员。

因为,原因很简单: 假如你仅因为纯CODING的思想而导致商业经营的重大损失,那你再不是程序员(至少不是那个商业部门的程序员了,当然,你还是可以转到另外的公司的,不过,别的公司也一样要求你们向商业看齐,否则出了同的问题,有同样的结果,商业就如此,利润最大化)。

所以,思想一定要跟得上社会,否则,无论你多么高手,假如你跟不上社会思想,也是落后分子。

项目主管 和老总之间:: 老总下岗了,不一定能再做项目主管,项目主管下岗了,以后却有机会做老总。 30年河东,30年河西。千万别少看别人。



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-2 6:43:09 得分: 0



天啊,楼上的就不要搀和了,越跑越远了,楼主也快点给分啊,我的回答最正确啊!哈哈.....



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-2 6:48:46 得分: 0



楼主快结帖子啊,再不结帖子偶FS可是不厚道了!

后面知道答案的就不要再来蹭分了,偶前面已经给了正解了,FS偶半年没分进帐了啊,你们TMD有没有人性啊!



Top

回复人: juliens(星星球愛思纯^_^) ( ) 信誉:100 2004-9-2 7:57:53 得分: 0



一个个都不厚道,唉~~



Top

回复人: crossbow(【带三尺剑立不世之功】) ( ) 信誉:93 2004-9-2 8:15:27 得分: 0



Mark,有时间学习学习



Top

回复人: beyondtkl(大龙驹<逝追.弗瑞德>) ( ) 信誉:100 2004-9-2 8:31:50 得分: 0



哈哈哈。。。

同意 lya_lya(元元) 的总结。

偶喜欢指针....



Top

回复人: asj(最烦活稀泥) ( ) 信誉:100 2004-9-2 8:44:33 得分: 0



今天刚改了昵称,就碰到了lya_lya(元元)这样让我烦的人
要说谁好尽管说嘛,何苦拉个马甲出来



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-2 9:11:45 得分: 0



to FS

Pointer(Result)语法上已经指出是指针类型的,

编译中自然要做一些保护性的转换,

所以入esi指针寄存器一般是首选。eax寄存器是最快的,备选。

才有了 mov esi, [eax] 这样的。

后面自然有了倒换寄存器的这些操作。用了edx

如果直接标明是Result

自然就有了mov eax, [eax]

而编译成三句,前两句纯粹的就是因为类型转换……

mov eax, [eax]
mov edx, eax

是不是很傻?很机械?就因为Pointer(Result)就多了这两个……

最后这句才是真正意义上的给了Result

mov eax, edx

唉……



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-2 9:15:57 得分: 0



看到lya_lya(元元)这样的吹捧高手,我快要吐了。

饶了我吧。我快要其鸡皮疙瘩了,

你还不如骂我个狗血淋头,我最怕这种叽叽歪歪的人。

还不如FS来的爽快,要骂就骂个够。

更看出刘洋此人不地道,找出一个写手来。

快结束了,快结束了吧。



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-2 9:18:01 得分: 0



很明显,你这句就是屁话!!!!!!!

>>>>明显mov eax, [eax]就可以代替Pointer(Result) := PPointer(Self)^;!!

绝对不可以代替!!!你不懂就不要大放厥词!不懂装懂得人最可耻!!



Top

回复人: rabbit1125(兔子) ( ) 信誉:100 2004-9-2 10:00:41 得分: 0



强烈支持 reallike(学习SICP还有Lisp……)
强烈不懈 ly_liuyang(Liu Yang)

俺做这行也有好多年了,深知透彻理解一种语言的重要性。你做技术总监,对项目使用的语言了解的不多,你怎么估计项目的开发量,如何给Coder们因人而异的安排工作量和进度。
多说几句,就Delphi来说,深入的学习它的特性,能强有效的加深你对面向对象的理解、线程的理解、互斥同步的理解、消息的理解、Windows的理解......让你更有效率的使用Object Pascal,更快的写出更简介、更优质、出错更少的代码。而你在这中语言上的努力,也将在你学习另一种语言时,获得事半功倍的效果。

最讨厌哪些整天空喊着“不要局限于语言”的家伙。如果你真的掌握了一门语言,再喊那么我尊重你,佩服你。空话大话连篇,真格的又说不出个所以然来的家伙,我强烈的鄙视你。语言是实现技术(比如面向对象技术)的,技术是为语言服务的。你连一门语言都没有掌握,深知都不了解,你有什么资格乱叫?!

有点扯远了。

最后说一句,不懂不要装懂,更不要摆出一个很牛的样子误导别人,不管你是有意的还是无疑的。



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-9-2 10:12:13 得分: 0



刚要结贴,又有人回贴了。看来还不能马上结贴。请问大家,这个贴子能不能再多加些分?



Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-9-2 10:37:18 得分: 0



哇噻,这只兔子好厉害啊!

To RealLike

我没看到后面那两个行,的确那里是有问题,代码没多大用处。我看了前后语句的ASM代码,的确是个多余的举动。



Top

回复人: jiang5460(巴山夜雨) ( ) 信誉:99 2004-9-2 11:22:51 得分: 0



Self是一个指针变量
PPointer就是指针的指针了




Top

回复人: ly_liuyang(Liu Yang) ( ) 信誉:165 2004-9-2 11:32:09 得分: 0



最低限度,我用的是真名而且没有马甲,起码比起某些人来得正

至于某些人对我有不同见解,这个完全是正常的,一样的米养百样的人

我所说的,都是我的一点感想,作为参考而已;不同的人走不同的路...

我的水平如何,也不需要个个知道,人人了解,

我很乐意接受任何技术上的挑战,争论问题是个学习的好方法,但至于上升到人身攻击就别来找我了,对于这样的事情我也不想多说

本人作品选http://lysoft.7u7.net http://ly.activepower.net/asplock/
http://ly.activepower.net/projects/

说N多的话,还不如写个程序让人看看来得好:)



Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-9-2 11:33:40 得分: 0



我的想法就是..别老评价别人做的事情或选择的路有没有前途..别人不是你评估的对像,所以..请说话说出你的切入点..该说技术的..就说技术..别放到什么所谓的商业上...那不是你说的..哈..起码现在不太像..



Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-9-2 11:35:02 得分: 0



所以,商业.所谓的成功,其实跟机遇非常有关(这么说的话,一定有人说,机遇是自已创造出来的...)..如果Bill如果在这个世头开始开公司..他能在开个微软??我想可以..但绝对不会这么拽的...你做的决定只能在你的未来生活中体现出它的价值和破坏性...可能是好,也可能是坏的..但是,谁都不知道会是什么样子的..因为..谁都不知道下个生出来的孩子会不会比你强...再说了..有人说..看Bill不是有商业头脑吗?..我说..对....但是..谁能给我个准确的解释..什么是商业??谁都不敢说他了解了...别说了..会被人笑的..说穿了..就是一个投入产出比..这个怎么来保证???谁都不知道..基本上看过去像个赌博性质...没有人知道你的公司明天会不会倒..



Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-9-2 11:36:21 得分: 0



会被人笑的...会被人笑的....巴飞特都没说自已懂商业了..会被人笑的..



Top

回复人: leeon868(Delphi无神论者) ( ) 信誉:100 2004-9-2 11:42:13 得分: 0



顶!刘洋,如果你不让csdn回复限制30帖,老子就用reallike这个ID对你说!无聊人。



Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-9-2 11:45:53 得分: 0



呼,如果你让CSDN骂人的话..我一定写得比较粗一点..

对事别对人!谁能无过呀..干嘛非得要按照你的想法活..



Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-9-2 11:49:46 得分: 0



各位现在还在写代码的..我想说说..如果你是一个初学者..如果你还想在这个所谓的软开行业混下去..那你就得懂技术..连个兵都当不好的人..怎么可能当好官??
当然,这是种挑战...你得付出,如果你们的智力跟我一样,一般般..那还是努力点..也许那能帮你多拿点工资...起码..俺们现在很穷..偶就是一农民..



Top

回复人: linzhengqun(风) ( ) 信誉:100 2004-9-2 11:50:05 得分: 0



LY能做到管理者,其技术是不容至怀疑的
刚才看了网页上的作品,确实是一个高手

不过给一点小小的建议,贴不在多,质量高则名,像伴水老大那样
其实以你的水平完全有可能做到的。希望在这里能看到你的高质量的贴子。



Top

回复人: zhouyihang(一行) ( ) 信誉:100 2004-9-2 11:51:53 得分: 0



靠,收藏
都比我NB,向前辈看齐



Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-09-02 11:58:00 得分: 0


我刚才把这个贴子加到100分了,没想到这么热烈。


Top

回复人: FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) ( ) 信誉:146 2004-09-02 12:19:00 得分: 0


大家都别争了,谁给我一段WIN2K下检测打印机缺纸的代码吧,要测试过的啊,TMD网络上的代码都TMD不能用!


Top

回复人: zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) ( ) 信誉:100 2004-09-02 12:41:00 得分: 0


use TDlPort
直接读打印端口


Top

回复人: zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) ( ) 信誉:100 2004-09-02 12:50:00 得分: 0


delphi5,delphi6下
Result := PPointer(Self)^;
均为:
mov eax,[eax]

没有其他



Top

回复人: zzzxxxcccvvv(zxc) ( ) 信誉:100 2004-09-02 12:55:00 得分: 0


拥有高强的技术但却不富有,这是程序员的最大悲哀。(至少我是这样认为)


ly_liuyang(Liu Yang) 只有算法思路架构是可以延续的。
---------------------------------------------------
赞成


reallike(学习SICP还有Lisp……) 难道做程序员一定要商业吗??????
---------------------------------------------------
"知识就是财富"? 不!!!
现实世界告诉我:技术 <> 财富
拥有高强的技术但却不富有,这是程序员的最大悲哀。(至少我是这样认为)

FrameSniper(VA=>CR3->PDE->PTE->Offset=>PA) 管理也是一门艺术,难度甚至比技术还高.....
---------------------------------------------------
可能是吧!(还没到管理)

现实就是这么不公平!

有人没技术,但坐在高级职位上。
有人技术比你差,但工资比你高。
你编的软件很出色,但客户就是要了一个你认为很差劲的系统。



Top

回复人: Nozzle() ( ) 信誉:100 2004-09-02 12:58:00 得分: 0


ly_liuyang(Liu Yang),雖然很自大,但是如果在這裡按照自大排行,你數第四。

RL,FS,LP以前是三自大尖刻,你來了,就是四人自大幫了,哈哈!


Top

回复人: beyondtkl(大龙驹<逝追.弗瑞德>) ( ) 信誉:100 2004-09-02 13:09:00 得分: 0


继续 顶。


Top

回复人: zming() ( ) 信誉:100 2004-09-02 13:17:00 得分: 0


凑个热闹,不是来蹭分。

在对待技术与商业(业务)的观点上,赞成ly_liuyang及其支持者。

对于指针、指针的指针的问题,如果诸位有空看一看汇编中的寻址方式,可能会对指针有更深入的认识。


Top

回复人: rabbit1125(兔子) ( ) 信誉:100 2004-09-02 13:22:00 得分: 0


ly_liuyang(Liu Yang) 兄,我的留言,也是对事不对人。想说的是现在很多Coder们不正确的认识,非是针对你。如有得罪,还请勿怪。


Top

回复人: rabbit1125(兔子) ( ) 信誉:100 2004-09-02 13:24:00 得分: 0


再次支持reallike(学习SICP还有Lisp……)的观点!


Top

回复人: truexf(小方) ( ) 信誉:88 2004-09-02 13:32:00 得分: 0


我从头看到尾。
reallike!你就像一只发疯狗!无聊。结贴!!!!


Top

回复人: gamemx(拉克) ( ) 信誉:100 2004-09-02 14:24:00 得分: 0


热闹


Top

回复人: miky(miky) ( ) 信誉:105 2004-09-02 14:44:00 得分: 0


好热闹。
其实刘洋和Reallike的观点我都认同。
每个人都有自己的长处,如果善于管理,过分钻研技术我觉得是一种浪费。反之,如果一个沉默寡言的人,去研究管理也同样是一种浪费,不如好好研究技术来得实际。

这是因人而异的问题,没有讨论的意义。


Top

回复人: hansion3406(阿木㊣拖鞋男) ( ) 信誉:92 2004-09-02 15:00:00 得分: 0


再说一次,对事,别对人..
大家都混饭..不容易...


Top

回复人: angle097113(<晨明科技开发>) ( ) 信誉:98 2004-09-02 15:08:00 得分: 0


小方说的有一定的道理,RL说话一点也不尊重,在多个贴子中骂人,其实刘洋说的话是有一定的道理的,
很多技术上很强的人为什么不能发达?他忽视了商业呀//这是实话
有时怎么赚钱才是最主要的,
刘洋只是说了几句建议也没有非逼着你哪样做


Top

回复人: altans(龙纹剑) ( ) 信誉:100 2004-09-02 15:29:00 得分: 0


哈哈,高手这么多啊,精彩绝伦


Top

回复人: sywxy(学习DELPHI) ( ) 信誉:87 2004-09-02 16:19:00 得分: 0


在给分的时候,出现“服务器错误”,而且不能重新给分了,怎么办?


Top







管理 | 关闭窗口






--------------------------------------------------------------------------------

网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式
百联美达美公司 版权所有 京ICP证020026号
Copyright &copy; CSDN.net, Inc. All rights reserved



相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录