procedureとfunctionのちがいは”値を返すか返さないか”って聞いたのですが、”値を返す”ってどういうことですか?
例えばこのコードで、何の値を、何に返すというのを教えてもらえないでしょうか。
function Func(a:Integer):Integer;
begin
Showmessage(IntToStr(a));
Result:=a+10;
end;
procedure TForm1.Button1Click(Sender:TObject);
var
i:Integer;
begin
i:=Func(2);
Showmessage(IntToStr(i);
end;
function Func(a:Integer):Integer;
begin
Showmessage(IntToStr(a));
Result:=a+10;
end;
procedure TForm1.Button1Click(Sender:TObject);
var
i:Integer;
begin
i:=Func(2); --ここでFuncが呼び出される
--Funcの中のShowmessage(IntToStr(a));で2が表示
Showmessage(IntToStr(i); --このiはFuncの中でResult:=a+10;されているので12になります
end;
結果 2と表示された後に12と表示される
説明が下手ですみません^^;
> プログラミング言語で関数やメソッドを呼び出す際に、その関数やメソッドを実行した結果を示す値のこと。
http://d.hatena.ne.jp/keyword/%CA%D6%C3%CD
http://ccs.cla.kobe-u.ac.jp/00/yusuke/WWW/koudoku6.html
http://kakinotane.s7.xrea.com/delphi/d2/d010.html
そうなんです。Diaさんの説明箇所のとおり、私がよくわかってないところは
function Func(a:Integer):Integer;
begin
Showmessage(IntToStr(a));
Result:=a+10;
end;
procedure TForm1.Button1Click(Sender:TObject);
var
i:Integer;
begin
i:=Func(2); //←ココ
Showmessage(IntToStr(i); //←ココ
end;
なんです。
i:=Func(2);は、
iに2を代入するんですか?
それともFuncに2を代入するんですか? ていうか”Funcに2を代入する”っていう表現そのものが間違ってるんですか?
Showmessage(IntToStr(i));
iはどうやって10を足されたんですか?
返り血さんの紹介ページもみたのですが、分からず状態で・・・
すいません。質問がやけくそになってしまって。でも ”なんとなく分かってる状態” で先にすすみたくないんです。
よろしくおねがいします。
数学の関数と同じように考えるとよいかと思います。
たとえば、
a := cos(PI / 2);
としたとき、「cosにPI/2を代入する」とは言いませんよね。
「cos(PI/2)をaに代入する」ということになります。
cos(PI/2)は、コサインの90度(ラジアンでPI/2)の結果です。
i := Func(2);
は、「iに、関数Func(引数が2)の結果を代入する」ということになります。
> iはどうやって10を足されたんですか?
ブレークポイントを i:=Func(2); の行に設定してステップ実行
『なるものはなる』
①ボタンをクリック
②Funcという関数に2を渡す
③2+10を返値(Result)に渡す
④つまり、Func(2) = 12ということです。
⑤これをiに代入するので、i := Func(2);は i := 10 + 2;
と同意味になります。
彼ぐらいのレベルのときはかなりかみ砕いてあげないと理解できないですよ。
自分もそだったから
①ボタンをクリック
②Funcという関数に2を渡す
③2+10を返値(Result)に渡す
④つまり、Func(2) = 12ということです。
⑤これをiに代入するので、i := Func(2);は i := 10 + 2;
と同意味になります。
手続き・関数ともに関数名の後に続く()内に設定する値を「引数(パラメータ)」といいます。
これは、目的の解を得るために必要な値のことです。
三角形の面積を得るために必要な値は、底辺と高さの2つです。
エクセルでa1セルに底辺、a2セルに高さを入力する事とし、
a3に "= a1 * a2 / 2" という式を設定すると、
a1, a2 の値を変えると自動的に a3 に解が出ます。
i := Func(2) の場合
i は a3セルにあたります。変数(i)は値を格納する(メモリ上の)入れ物ですから。
"= a1 * a2 / 2”は Delphi では ":= a1 * a2 div 2”の代入式にあたります。
C, C++ では、代入は "=", イコールは "==" を使います。
エクセルの場合には、どちらの意味でもエンドユーザには同じですが、機能的には代入です。
Func 三角形の面積(a1, a2: Integer): Integer;
begin
三角形の面積 := a1 * a2 div 2;
end;
こういう関数を使う事により、三角形の面積の求め方を知らない人でもその解が得られるようになります。
通常、上記の関数は
Func 三角形の面積(a1, a2: Integer): Integer;
begin
Result := a1 * a2 div 2;
end;
と記述するのが普通ですが、Result を使う義務はありません。
汚してごめんなさい。Enter押しすぎた。
①ボタンをクリック
②Funcという関数の引数(a)に2を渡す//Procedure側処理
③2+10を返値(Result)に渡す//Function側処理
④つまり、Func(2) = 12ということです。
⑤これをiに代入するので、i := Func(2);は i := 2 + 10;
と同意味になります。
メッセージの処理には触れません。
ということはですよ、
i:=MyFunc(2);
で、(a:Integer)のaに2が代入されて
showmessageで2を表示させて
aに10を足したものをResultに入れて・・・お!?
ってことは ”i” はResuluに入れられた値を入れる変数?
i:=MyFunc(2); というのはMyFuncが2のときfunctionで処理してResultに入った値をiに代入するということですか!?
(今書いてるのって、みなさんが噛み砕いて噛み砕いてサラサラ状態になった説明をリピートしてるだけみたい・・・)
> 彼ぐらいのレベルのときはかなりかみ砕いてあげないと理解できないですよ。
ここでは、印刷屋さんの回答と同じような説明をしてありますが?
http://kakinotane.s7.xrea.com/delphi/d2/d010.html
> Result := a + 10; // 受け取った値に10を足して
> // 呼び出し元に返します。
こういうコメントも、十分に書き込まれています。
たぶん、そこを読んでも理解できずに、質問されているのでしょう。
それに気が付かず、リンクを3つほど紹介してしまったわけですが。
書き写したコードと結果で悩むより、処理される順に追いかけながら
なぜそうなるのか、1ステップ毎解決したほうがわかる場合があります。
というわけで、ブレークポイントおいて、F7でステップ実行。
監視式や式評価機能を使って、各変数の値を確認したほうがいいと思われたわけです。
監視式ってどう使うんですか?
何度か使ってみたんですけど「監視できません」とかばっかりで・・・
ヘルプも見てみたのですが私にとってはヘルプになってなくて。
> i:=MyFunc(2); というのは
> ① MyFuncが2のとき(MyFuncに渡した引数が2のとき)
> ② functionで処理してResultに入った値を
> ③ iに代入するということですか!?
正解です。
function Func(a:Integer):Integer;
begin
Showmessage(IntToStr(a));
Result := a + 10;
end;
この関数を呼び出すとき、
var
Func: Integer;
Result: Integer;
というグローバル変数がメモリ上に既に用意されています。
この処理は、Delphi 等の処理系がコンパイル時にその仕掛けを加えます。
実際に、上記2つの変数が用意されているかどうかは、私が Delphi を作ったわけではないので解りませんが、用意されたと言える仕掛けが作られるという事です。
したがって、用意されていると理解して問題ありません。
i := Func(2); とした場合、
Func 内の Showmessage(IntToStr(a)); の行で '2' を表示するのは納得できますよね。
Result := a + 10; により、
用意された Result変数に 2 + 10 = 12 が代入されます。
function Func(a:Integer):Integer;
begin
Showmessage(IntToStr(a));
Func := a + 10; // ここが違う
end;
となっていれば、用意された Func変数に 12 が代入されます。
procedure Button1Click(Sender: TObject);
var
i: Integer;
begin
i := Func(2);
end;
のコードは
var
Result: Integer;
procedure Button1Click(Sender: TObject);
var
i: Integer;
a: Integer;
begin
a := 2;
Result := a + 10;
i := Result;
end;
と処理されます。
どんな言語でも最終的にはコンパイラによりマシン語に翻訳されるのですが、
その翻訳されたマシン語では、こういう流れになっています。
i := Func(2);
と記述すれば、上記のコードになるようにコンパイラが処理します。
なるほど。そういうことか・・・。
みなさんの砕いて砕いてサラサラ状態にしていただいた説明のおかげでようやく理解することができました。
思わず叫んでしまって・・・(あ! そういうこと!?)
ほんとうにありがとー!
(理解が遅くなって申し訳ありません。)
ツイート | ![]() |