第2章  はじめてのプログラム
RPGプログラマーの為のC言語講座

 C言語の入門者が最初に書くプログラムは画面に”Hello,World!"って表示するのが昔からのしきたりだそうです。理由は知りませんが...
と言う訳なので、まだ何も解説してませんが、とりあえず下記のソースコードを入力して、コンパイルして、実行しましょう。

最初のプログラム LIST1


/* 最初のプログラムは"Hello,World!"を表示する */

#include<stdio.h>

   void main(){
       printf("Hello, World! ??/n"); 
   }

ソースコードを打ち込んだら、CRTBNDC コマンドを使用してコンパイルしてください。もしエラーがでたら コンパイルリストを印刷してエラーの内容を確認して修正してください。コンパイルリストを出力するには、CRTBNDCコマンドでOUTPUT(*PRINT)を指定します。

コンパイルが完了したら実行してみましょう。実行するコマンドはCALL PGM(LIST1)です。

画面にHello World!と表示されましたか?表示されれば、OKです。

LIST1実行結果イメージ

LIST1実行結果

でも、見慣れない画面ですね、これはDSM(ダイナミックスクリーンマネージャー)という画面です。

PCやUNIXのコマンドライン画面と似た動きをします。行単位に画面I/Oが行われます。C言語で標準入力/標準出力を行うと自動的にこのDSM画面が使用されます。OS/400のftpクライアントやネイティブ・ドミノのコンソールでも使用されています。DSM画面はINPUT/OUTPUTという名称でオーバーライドを行うことが可能ですので、画面入力をファイルから行いたい場合は、INPUTにPFをオーバーライドすることで、入力を切り替えることが可能です。

OS/400以外のプラットフォームでは、標準入力を使ってパイプやリダイレクトが出来たりします。
たとえば、#PGMA|PGMBとすると
PGMAの出力結果がそのままPGMBの入力データとすることができます。

これはどちらかというとC言語というより、shellなどの機能になります。AS/400ではshellに相当するものがありませんので、(QSHELL解釈プログラムと言う機能がありますが、まだ一般的でないのと、機能が限定的なので取りあえずなしと言うことにしてください)今後の機能拡張がまたれるところです。

ところでソースコードの表示文字の中に見慣れない文字があります。

”Hello, World!??/n”の??/nです。

これは、画面には表示されませんでした。何でしょう

試しに、この部分を取り除いた、以下のコードを実行して見てください。

??/nを取り除いたプログラム LIST2

/* 改行なしのプログラム */
 #include<stdio.h> 

 void main(){
   printf("Hello, World!"); 
    printf("Hello, World!"); 
 }

どうなりましたか?

次に以下のコードを実行してください

改行付きのプログラム LIST3

/* 改行付きのプログラム */
#include<stdio.h> 

 void main(){ 
    printf("Hello, World!??/n"); 
    printf("Hello, World!??/n"); 
 } 

どうなりましたか?

”??/”は三文字表記で'¥'を表しますので、”??/n”は”¥n”と書いたのと同じことです。これは改行を意味する拡張表記です。これ意外にも、以下の拡張表記が可能です。

主な拡張表記
\a 警報 (ベル)
\b 後退 
\f 用紙送り (改ページ)
\n 復帰改行
\r 復帰
\t 水平タブ
\v 垂直タブ
\' 一重引用符
\" 二重引用符
\? 疑問符
\\ 円記号
\x00 16進数
\00 8進数

??/nが改行を表すことが解かりました。??/nは¥nと同じ意味だということも解かりました。それでは、¥nを実行してみましょう。

改行付きのプログラム LIST4

/* 改行付きのプログラム */
#include<stdio.h> 

 void main() { 
    printf("Hello, World!\n"); 
    printf("Hello, World!\n"); 
 }

多分、直接’¥n’と記入した場合は、そのまま’¥n’って画面上に表示されたと思います。 これは、コードページ5035の場合は、¥と$を同じコードページ内に納めるため、’¥’文字のHEXコードが別のコードをふられているためにCのコンパイラーは、制御コードの始まりの’¥’として扱わず、通常の文字と同じ扱いをするために起こります。コードページ5035の環境でで制御コード(拡張表記)の始めの文字として扱われる文字は、バックスラッシュになります。

次はどうでしょう。

改行付きのプログラム LIST5

/* 改行付きのプログラム */
#include<stdio.h> 

 void main() {
     printf("Hello, World!??x15"); 
     printf("Hello, World!??x15"); 
 }

AS/400では復帰改行の制御コードはx15になります。ですから、そのままHEXコードを使用しても結果は同じく改行されます。ただし、他のプラットフォームに移植する場合は、書き換える必要が発生しますのでこうゆうプラットフォーム固有のコードの移植性は低くなりますし、コードの見通しも悪くなります。

ところで、実行するつど、DSM画面に前回の実行結果が残っていて美しくありませんね。
いったん、画面をクリアしてから表示するようにしたいですね。

システムAPIを使ってみましょう!!

システムAPIでDSM画面クリアプログラム LIST6

/* DSMのシステムAPIプログラム */

#include<stdio.h> 
#include "QSYSINC/H/QSNAPI" 

 void main() {
     QsnClrScl(_C_Get_Ssn_Handle(), '0', NULL); 
     printf("Hello, World!??/n"); 
 } 
#include "QSYSINC/H/QSNAPI"が一行増えました。これはRPGの/COPYと同じ働きをします。元のファイルQSYSINCライブラリーのHファイルのQSNAPIメンバーを表示して見てください。その中に、画面をクリアするAPIのQsnClrSclが定義されています。

QsnClrScl(セッション・ハンドル,サイズ変更指示,エラー・コード)

セッションハンドルは現在使用している画面のIDです。この値をとるために_C_Get_Ss_Handle()関数を実行してます。この関数は、現在使用しているセッション・ハンドルを戻します。この関数はstdio.hの中に定義されています。

上記の文は、以下のようにもかくことが可能です

システムAPIでDSM画面クリアプログラム LIST7

/* DSMのシステムAPIプログラム */
#include<stdio.h> 
#include "QSYSINC/H/QSNAPI" 

  void main() {

    Qs Ssn_hd; 

      Ssn_hd = _C_Get_SsnHandle(); 
      QsnClrScl(Ssn_hd, '0', NULL); 
      printf("Hello, World!??/n"); 
 } 

C言語では、関数の戻り値をそのまま次の関数の引数にできます。
RPGなら必ずワークのフィールドの定義が必要になるところですが、C言語では中間ワーク的なフィールドは定義する必要はありません。

他の章で詳細は解説しますが、C言語の関数は、引数と戻り値をもちます。

RPGでは、外部のサブPGMを呼び出す場合は、パラメーターとして値の受渡しのみで戻り値はありません。

C言語では、RPGのパラメーターに相当するものが、引数であり、それとは別に戻り値を帰しますので、その戻り値を利用して、次の関数の引数とすることが出来る訳です。