第1章 I Luv FORTRAN!

 さー、今日から裏教室が始まるよー。ここではおもろいテクニックをいろいろ教えてくけん、みんな積極的に身につけんさいな。

 実は俺、FORTRAN がめさめさ好きなんよ。それん比べてC++のダサいこと。耐えられんわ。ゆーことで、今回はそういう同志のためんおもろいマクロの活用法を教えたるけんねー。


 ほな、今回の要点な。


 では、いってみよー!


 先ずは変数の型。FORTRAN じゃ、INTEGER*4 やとか、REAL*8 やとか、サイズがよー分かってええよな? C++はここがあかんのよな。(注:これは本音です。VC++では __int32 とかがあって、やっぱりM$の方もそう感じてたんでしょうね)

 ほな、変えような。引数は参照渡しやけん、引数用のは別に作るな。(typedef でなく #define してるあたりがまずい)

#define INTEGER4   int
#define PINTEGER4  int&
#define INTEGER2   short
#define PINTEGER2  short&
#define INTEGER1   char
#define PINTEGER1  char&
#define REAL4      float
#define PREAL4     float&
#define REAL8      double
#define PREAL8     double&
#define CHARACTER  char
#define PCHARACTER char*
#define LOGICAL1   bool
#define PLOGICAL1  bool&
#define LOGICAL4   int
#define PLOGICAL4  int&
#define FALSE      false
#define TRUE       true

 で、次は関数。戻り値付きの関数は、戻り値の型、FUNCTION 、名前、引数と書いてくんやけど、実は引数の型は書かんのよ。文法上それは真似できんけん、FUNCTION を定義しとくだけにしとこな。そして、戻り値なしの関数は、SUBROUTINE 、名前、引数と書いてくんよ。そして、呼ぶときには CALL を前につけるんよ。やけん、こう定義しとけばええね。

#define FUNCTION
#define SUBROUTINE void
#define CALL             //(FUNCTION や CALL は書かなくてもコンパイルできる。問題あり)

 そして戻り値なんやけど、FORTRAN では関数名に代入する感じになるんよ。けどそれは無理やけん、値は RETURN で直接返すようにしような。

#define RETURN return

 そして、メインの関数だけは PROGRAM で始めるんや。そして、STOP で終わる。こんな感じやな。

#define PROGRAM(n) void main(){  //(void main なところがさらに素人っぽい)
#define STOP       return  //(RETURN と書いてもエラーが出ない。問題あり)

 で、次は { } カッコ。これは状況によって変わるけん、いろいろ定義しとく必要がある。そして、関数の初めのカッコは FORTRAN では対応するもんがないんよ。やけん、これは BEGIN で代用しよな。他にも同時に IF とかも定義しとこな。

#define BEGIN           {
#define END             }
#define IF              if
#define GT              >
#define GE              >=
#define LT              <
#define LE              <=
#define EQ              ==
#define NE              !=
#define AND             &&
#define OR              ||
#define NOT             !
#define THEN            {  //(BEGIN と書いてもエラーが出ない。問題あり)
#define ENDIF           }  //(END や ENDDO と書いてもエラーが出ない。問題あり)
#define ELSE            else
#define BELSE           } else {  // ブロック IF 文用の ELSE
#define DO(V, F, E)     for(V = (F); V <= (E); V++)
#define SDO(V, F, E, S) for(V = (F); V <= (E); V += (S))  // 増分付き DO
#define ENDDO           }  //(END や ENDIF と書いてもエラーが出ない。問題あり)
#define GOTO            goto
#define CONTINUE        ;
#define MOD(A, B)       ((A) % (B))

 あとは READ 文と WRITE 文。こればっかりはいろいろやるのは無理やけん、こんな感じにしとくわ。(クラスを作り、コンマ演算子をオーバーロードすればそれなりになりますが、そんな技術があるのならこんなことはしないでしょうね(笑))

#define READ  cin
#define WRITE cout
#define ENDL  endl

 あとはこいつらをヘッダファイル FORTRAN.H に入れといて、インクルードするようにしとけばええな。主なヘッダファイルもこん中でインクルードしとけば、他にいろいろインクルードせんですむな。(これは別に問題ないです)

#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <ctype.h>
#include <math.h>

 これで大体 FORTRAN っぽくできるようになったね。ほな、1つプログラムをこさえてみよか。

プログラム実行結果
// Test1.f.cpp
#include "FORTRAN.H"

LOGICAL1 FUNCTION INPUT(PINTEGER4 A, PINTEGER4 B);
SUBROUTINE DISPRES(PINTEGER4 A, PINTEGER4 B);

PROGRAM(TEST1)
    INTEGER4 A, B;

LOOP:
    IF (NOT INPUT(A, B)) GOTO ENDFUNC;
    CALL DISPRES(A, B);
    GOTO LOOP;

ENDFUNC:
    STOP;
END

LOGICAL1 FUNCTION INPUT(PINTEGER4 A, PINTEGER4 B)
BEGIN
    LOGICAL1 INPUTR;

    INPUTR = FALSE;

    WRITE << "2つの数字を入れてね" << ENDL;
    READ  >> A >> B;

    IF (A LE 0 OR B LE 0) RETURN INPUTR;

    INPUTR = TRUE;
    RETURN INPUTR;
END

SUBROUTINE DISPRES(PINTEGER4 A, PINTEGER4 B)
BEGIN
    WRITE << "和:" << A + B     << ENDL
          << "差:" << A - B     << ENDL
          << "積:" << A * B     << ENDL
          << "商:" << A / B     << ENDL
          << "余:" << MOD(A, B) << ENDL;

    RETURN;
END
2つの数字を入れてね
9 4
和:13
差:5
積:36
商:2
余:1
2つの数字を入れてね
500 93
和:593
差:407
積:46500
商:5
余:35
2つの数字を入れてね
2 9
和:11
差:-7
積:18
商:0
余:2
2つの数字を入れてね
0 0

 とても美しいよね。(セミコロンがあったり、ちょっと文法違ったりと、とても中途半端。自動字下げも効かないし、色も付かない)

 こんなんなら、FORTRAN 好きの俺も満足できるプログラムが組めるってもんよ。(なら、FORTRAN を使えばいいだけの話)

 さぁ、FORTRAN が好きでC++にはなじめないという人は真似してみん? PASCAL が好き、COBOL が好きゆう人も、似たようにすればきっと満足できると思うよ。(そんなことしてたら、いつまでたってもC++が使えるようになりません)


 ほな、そういうわけで要点な。


 じゃ、次回も期待してな。


目次に戻る

Last update was done on 2000.8.29

この講座の著作権はロベールが保有しています