前回は、C とプログラム全体の構成も、個々の構文も RPG はよく似ているというお話でした。
でも、それだけではなく、C だとけっこうわかりにくいこと、書き方を理解するのに苦労することを RPG では素直にできてしまう、ということを今回はお話ししてみたいと思います。
前回は、引数を 2つ与えて合計値を得るというプログラム例でしたね。
今回は、これに追加して 2つの引数に対して合計値と平均値の 2つの値を得る、という処理に拡張したいとします。
RPG をやってきた人なら、引数を 2つ増やして計算結果をセットして返してもらえばいいと思いますよね??
引数として渡した変数はプログラム内でそのまま使えるので、これはごく自然な発想だと思います。
でも、C ではそんなカンタンにはいかないんですよねぇ …
ということで、"ごく自然な発想"のまま C を使って書いてみるとこんなかんじになると思います。
#include <stdio.h>
int sum_ave(int num1, int num2, int sum, int ave);
int main(void)
{
int x = 3;
int y = 5;
int goukei = 0;
int heikin = 0;
sum_ave(x, y, goukei, heikin);
printf("合計は%dです。 \n", goukei);
printf("平均は%dです。 \n", heikin);
}
int sum_ave(int num1, int num2, int sum, int ave)
{
sum = num1 + num2;
ave = (num1 + num2)/2;
}
ところが、これ ↑ を実行してみると …
表示されるのは"合計"についても"平均"についても 0 という結果が出てきてしまうんですね。
実はこれ、「C言語のポインタがゼッタイにわかる本」という本に載っている例題そのものなんです。
やっぱり一般的に間違いやすいから例として取り上げられているんですね。
さて、RPG でまったく同じように書き直してみましょう。
H DFTACTGRP(*NO)
*
D sum_ave PR 10i 0
D num1 10i 0
D num2 10i 0
D sum 10i 0
D ave 10i 0
*
D x S 10i 0 inz(3)
D y S 10i 0 inz(5)
D goukei S 10i 0 inz(0)
D heikin S 10i 0 inz(0)
*
/free
sum_ave(x: y: goukei: heikin) ;
dsply ('合計は' + %char(goukei) + 'です。') ;
dsply ('平均は' + %char(heikin) + 'です。') ;
return ;
/end-free
*
P sum_ave B
D sum_ave PI 10i 0
D num1 10i 0
D num2 10i 0
D sum 10i 0
D ave 10i 0
*
/free
sum = num1 + num2 ;
ave = (num1 + num2)/2 ;
return 0 ;
/end-free
P Sum_Ave E
このプログラムは正しく合計値と平均値を表示します。
プログラムは "ごく自然な発想" のままですね。
素直にに書いて、結果も正しいわけです。
これは、関数に引数を渡すときに C は「値渡し」で RPG は「参照渡し」になっているからなんですね。
どちらがいいとかわるいとかはありません。C ではポインタを使えば「参照渡し」が可能ですし、RPG でも「値渡し」は可能です。
ただ、自然に書くと「参照渡し」の方がわかりやすく、さらに C で同等のことをするための記法はけっこうわかりにくい、という大きく二点の問題があるわけですね。
ちなみに C で同等のことをするためには ↓ のように書く必要があります。
"&" とか "*" とかがついているところがありますね。これがポイントなんです。
#include <stdio.h>
int sum_ave(int num1, int num2, int *sum, int *ave);
int main(void)
{
int x = 3;
int y = 5;
int goukei = 0;
int heikin = 0;
sum_ave(x, y, &goukei, &heikin);
printf("合計は%dです。 \n", goukei);
printf("平均は%dです。 \n", heikin);
}
int sum_ave(int num1, int num2, int *sum, int *ave)
{
*sum = num1 + num2;
*ave = (num1 + num2)/2;
}
ちなみに C での正解についての解説はここではしません、というかできません。
一冊、本が必要です。
「C言語のポインタがゼッタイにわかる本」をぜひ読んでみてください。たいへんわかりやすくいい本だと思います。
こうした C でのちょっとした書き方のクセの理解に苦しんで、関数の使い方をおぼえることに支障が出てしまうというのはたいへんもったいないことだと思います。
C のポインタについての記法と、関数そのものの使い方は、かたや C の固有の決め事、もう一方はプログラミング一般に役立つ知識、と段階の違う知識といっていいでしょう。
"ごく自然な発想" をして書ける RPG で、まず関数の使い方をおぼえてから、C の細かな書き方の "クセ" などなどをおぼえていく、という方法がやっぱり負担にならないんじゃないでしょうか。
「関数」という考え方、その一般的な使い方を理解しておくことは、どんなプログラミング言語を使う/理解する上で間違いなく役立ちます。
そういう "おみやげ" も手に入れられることですし、ぜひ ILE RPG でのプログラミングをお楽しみいただければ、と思います!!
この記事にはトラックバック・コメントがありません。
コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。