自己写函数的小问题,函数可以返回两个值吗(10分)

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

lcl_003

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己写了个函数,很简单。但是需要返回两个值,该怎么写?
function selectchan(a:integer):integer;
begin
case a of
1..16: selectchan:=a;
17..32:selectchan:=a-16;
33..48:selectchan:=a-32;
49..64:selectchan:=a-48;
65..72:selectchan:=a-64;
end;
end;

我想再返回一个整型值该怎么写?那调用的时候怎么调用?
 
用procedure selectchan(a:integer;Var Result1:TType1;Var Result2:TType2);
或者构造一个记录结构
TResult=record
Result1:TType1;
Result2:TType2;
end;
然后 function selectchan(a:integer):TResult;
 
你可以增加一个
例如:
Var iValue:Integer
参数
 
function selectchan(var a:integer):integer;
begin
case a of
1..16: selectchan:=a;
17..32:selectchan:=a-16;
33..48:selectchan:=a-32;
49..64:selectchan:=a-48;
65..72:selectchan:=a-64;
end;
a:=1000;
end;

调用时:
b:=39;
c:=selectchan(b);
返回结果是:
c=7
b:=1000
 
哦,我没说明白,比如这样:
function selectchan(a:integer):integer;
var b:integer;
begin
case a of
1..16:begin
selectchan:=a;
b:=1;
end;
17..32:begin
selectchan:=a-16;
b:=2;
end;
33..48:begin
selectchan:=a-32;
b:=3;
end;
49..64:begin
selectchan:=a-48;
b:=4;
end;
65..72:beging
selectchan:=a-64;
b:=5;
end;
end;
end;

我现在还要把b的值也返回去,该怎么写?
 
返回两个值上面已经说得很清楚了,
我优化一下你上面的代码:

function selectchan(var a:integer):integer;
begin
Result:=a mod 16;
if Result=0 then Result:=16;

a:=(a+15) div 16;
end;

a 的值就是第二个值

 
啊------还是不太明白:(基础比较差了
那我调用的时候怎么调用?
比如
edit1.text:=inttostr(selectchan(strtoint(combobox1.text))); //这是第一个返回数
edit2.text:=?? //第二个数怎么写?
 
var iValue:Integer;

iValue:=strtoint(combobox1.text);
edit1.text:=inttostr(selectchan(iValue)); //这是第一个返回数
edit2.text:=inttostr(iValue);
 
我快上吊了
 
WilliamGui, 呵呵,别急啊,水平比较菜:(
 
function selectchan(var a:integer):integer; //a一定要定义为变量
begin
case a of
1..16:begin
selectchan:=a; //或者写成result:=a,返回结果值
a:=1; //返回变量值
end;
17..32:begin
selectchan:=a-16; //或者写成result:=a-16
a:=2;
end;
33..48:begin
selectchan:=a-32;
a:=3;
end;
49..64:begin
selectchan:=a-48;
a:=4;
end;
65..72:beging
selectchan:=a-64;
a:=5;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=strtoint(combobox1.text); //将combobox1.text的值赋给变量i
edit1.text:=inttostr(selectchan(i)); //这是函数返回值
edit2.text:=inttostr(i); //这是变量返回值
end;
 
定義一個全局變量﹐
 
lcl_003 :
你去找本基础的书,看看这个函数定义中的问题,这里你想做的事情就是用到一个形参
和实参的问题。定义成:
Procedure selectchan(var a1,a2,a3 :integer) ;
可以返回多个参数回来。
调用的时候:
procedure TForm1.Button1Click(Sender: TObject);
var i1,i2,i3 :integer;
begin
selectchan(i1,i2,i3) ;// 处理完了,都返回来了。
end
全明白了吧。
 
hf_waj,多谢。 哦,可以返回两个数了,但是第二个数只能是变量吗a吗?我得到的第二个返回值
edit2.text:=inttostr(i); //这是变量返回值
就是combobox1里的值啊,并不是我要的数。我在函数里加了一句a:=(a+15) div 16;
可返回的还是combobox1的值?为什么?
另外“构造一个记录结构:
不太明白:(

 
你不用变量返回值,

你可以用改变一个内存值的方法来实现返回两个值的意义

就是说按内存地址传达
你应该把过程写在函数里面,你这个函数一看,我估计应该是按值传达吧,
 
另一种方法:
定义一个记录,比如:
type
my_data_type=record
a,b:integer;
end
function f1(i:integer):my_data_type;
begin
f1.a:=100;
f2.b:=200;
end;
调用:
var tmp:my_data_type;
i,j:integer;
begin
tmp:=f1(7);
i:=tmp.a;
j:=tmp.b
end;
 
哦,刚看了开发人员指南,明白了明白了,多谢大家帮助,刚接触编程,所以一些基本
概念和思路都没有比较菜:)不过还好,明白了。要不是我穷就把分都给大家了:(
 
按引用调用呀
 
TO :yeskert1,

你的方法是严重错误的,我来给你解释这个是怎么回事
type
my_data_type=record
a,b:integer;
end
function f1(i:integer):my_data_type;
begin
f1.a:=100;
f2.b:=200;
end;
调用:
var tmp:my_data_type;
i,j:integer;
begin
tmp:=f1(7);
i:=tmp.a;
j:=tmp.b
end;
首先,你在函数里面有一个f1.a,f1.b 你的这个F1是什么的?f1本来应该是你的函数,可是
你为什么却给一个函数来赋值,为什么?并没有谁说明一个函数是纪录类型的返回值。
这个是不对的。
在编写函数里面有一个返回值,他是怎么出来的,是给函数赋值,可是你的函数赋值是根据
什么依据来的。???我才看过函数值的书,不过可能是我理解的不对,有不对的地方,希
望向你学习。
 
yuleibo:可是我按yeskert1的方法做成功了啊,而且结果正确。我的理解是,他的函数里的
f1.a,f1.b也可以不写前面的f1,在调用的时候写f1.a,f1.b就可以了,呵呵,说的不一定对
yeskert1给说说吧;)
 
后退
顶部