我用函數返回一個類型﹐怎么判斷其值為NIL?(30分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
例如﹕
type TTest=record
T1:string;
T2:string;
end;

function TestFun(index:integer):TTest;
begin
if index=0 then
begin
Result.T1:='1';
Result.T2:='2';
end
else
Result:=nil;
end;

如上﹐我怎么判斷返回值不為空﹖如果不用nil表示﹐有沒有更好的方法﹖我用result<>nil
來判斷說類型不符。我很急﹐請快點告訴我﹗試過就給分。最好告訴原理。謝謝﹗
 
if not Assigned(TestFun(1)) then
// 为 NIL 值
 
不行﹐錯誤一樣﹐也是類型不同。
 
本身你Result:=nil;我认为就不对,至少是不好。pascal对类型约束比较严格。如果要完成
类似功能不妨考虑在record里加一个标志字段。
 
請各位大俠舉例﹐我就是不知道這樣好不好﹖有沒有什么更好的理由﹐要說出道理﹐哪點好
哪點不好﹖有沒有更好的方法﹖謝謝﹗分數不夠可以加﹐只要能學東西。
 
对于RECORD不能用NIL来判别吧!
RESULT := nil这句话就不对,另外,我认为数据结构一般不适于用作FUNCTION的RESULT;
你看这样改好不好?
Function testRun( index : integer;var Rslt : TTest):boolean;
begin
if index=0 then
begin
Rslt.T1:='1';
Rslt.T2:='2';
Result := True;
end
else
Result:= False;
end;
 
請各位多多舉証﹐如果說這樣不行﹐能不能找出依據﹖即然用我的方法可以傳回值﹐那就
應該也有法子判斷。我還有一個類似的問題﹐請各位去看看。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=787675
讓我明白道理﹐心服口服的﹐再加100分。我是講信用的人﹐前面已有至少兩位仁兄得到分
數了。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
ptest = ^TTest;
Test=record
T1:string;
T2:string;
end;
TTest = Test;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
function TestFun(index:integer):pTest;
var
pTt : pTest;
begin
new(pTt);
if index=0 then
begin
pTt.T1 := '1';
pTt.T2 := '2';
result := pTt;
end
else
Result:=nil;
dispose(pTt);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(TestFun(1)) then
showmessage('nil');
end;
end.
 
唉﹐我怎么忘了用指針﹐我認為用指針是正確的。哪位能精確點說出原理來。
影子﹐這30分給你了﹐不忙結束。哪位說出道理來了﹐另外開分。不過﹐似乎不需要用
到New和Dispost;直接像這樣就好了﹐因為Result是類型指針﹐不知我說得對不對﹖哪位
大俠出刀﹖
function TestFun(index:integer):pTest;
begin
if index=0 then
begin
Result.T1 := '1';
Result.T2 := '2';
end
else
Result:=nil;
end;
 
result是Object Pascal函数隐含的局部变量,包含了函数的返回值。
如上面,它返回一个指针,指针的使用必须要New和Dispose!
 
你說得有些道理﹐能不能再講具體一點呢﹖你new新開辟了一塊內存﹐后來又result指向他,
再dispose掉,那内存已释放了。怎么result还有呢,result又怎么释放掉?能不能再详细
一些?最好找出书中解释。謝謝﹗
 
呵呵。
事实上,使用Dispose之后就已经释放了。
所以这个函数是得不到结果的,除非不用Dispose!
我要仔细看一下函数。
现在有事,一会再回复。
 
呵呵,刚上网。看你们俩讨论的还挺热烈,我也说两句。result是Object Pascal函数隐
含的局部变量,包含了函数的返回值。这你应该很清楚了。对于result类型,我是这样认
为的(以前在书里看到的,一时找不着)--对于基本类型返回的就是函数定义的类型。
对于构造类型(比如数组、记录、对象等)其实返回的是指向这种类型的指针。所以你把
result:=nil理论上是可行的。但编译器则认为类型不符。就象把point类型给^int一样,
理论上是对的,但编译器通不过。所以对于函数返回值建议不要用构造类型。如果确实
需要,可以采用变量参数(蒋劲刚的方法)或自己维护一个指针(影子)。以确保类型
匹配。
 
如果用了new,就不能单纯地result:=nil;,还要dispose。
result:=nil;只是保证assigned时的正确性。
如果DELPHI象VC一样容易地看到内存泄漏就好了。
以下是修改后的代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
ptest = ^TTest;
Test=record
T1:string;
T2:string;
end;
TTest = Test;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
function TestFun(index:integer):pTest;
begin
new(result);
if index=0 then
begin
result.T1 := '1';
result.T2 := '2';
end
else
begin
dispose(result);
Result:=nil;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
p : pTest;
begin
i := 0;
//index
p := TestFun(i);
if not assigned(p) then
showmessage('nil')
else
begin
showmessage(p.t1);
dispose(p);
p := nil;
end;
end;
end.
 
影子﹐最后一問。那么你的result在哪兒釋放呢﹖是在Button1Click中的dispose(p);處嗎﹖
有沒有什么依據可以証明﹖我基本上弄清楚了﹐但還是想有書為証。即你上面的方法標不標
准﹐有沒有什么缺陷。謝謝你的解答﹗
 
在Button1Click中的dispose(p);处释放。
p是指向函数的指针,释放p就是释放函数。
不信你可以用showmessage(p.t1);代替p := nil;。
你对书的依赖很深!
虽然我菜,但我的理念大都来自实践。
上面的代码是随手写的,并不是从哪本书上抄来。
你也可以将此帖保留几天,看看专家的回复。
 
分比較少﹐就全給影子了﹐多謝各位關照此題﹗
 
后退
顶部