C 言語と Fortran の混在 第参弾2010年01月06日 12時45分18秒

Fortran の関数を C 言語で呼ぶ時の最後の注意点。

C 言語と Fortran の関数呼び出しの違いは三つ。そして、最後の三つ目は関数の文字列型の引数の受渡し方。

C 言語では、文字列型は文字の配列として扱われる。その為、関数に渡すときは、その始点を渡すのに過ぎない。それに引き換え、Fortran では文字列は特別な操作がなされる。その為、関数の呼び出しにも特別な引数が存在する。

C 言語から Fortran の文字列を受け取る関数を呼ぶ場合は、本来の引数を並べた後に、文字列型の大きさを更に渡してやる必要がある。

例えば、fort を Fortran の手続き型として作る。


* Fortran subroutine()
       subroutine example(three, int, six)
       character(3) three
       integer int
       character(6) six

       three = "3"

       end

C 言語の主関数から呼び出す。関数名の最後に下線を付ける。必ず参照渡しにする。

/* C */
int main()
{
    
    char three[3];
    int i;
    char six[6];
    example_(three, &i, six, 3, 6);
}

C 言語と Fortran では文法なども違うが、C 言語の利用者が Fortran も混在の環境で開発するのに、これらの点を抑えておけば取り合えず作業は進められるようになる。

前回

C 言語と Fortran の混在 第弐弾2010年01月05日 17時25分40秒

C 言語と Fortran の関数呼び出しの違いは三つ。そして、二つ目は関数の引数の受渡し方。

C 言語のは「全ての引数は値渡し」で行なわれる。そのため、引数で渡した「値」を変更しても呼び出し側は変更の内容を見ることは出来ない。そのため、関数に引数を変更する副作用が欲しい場合は、値のアドレスを渡し、それへの参照を行なうことで参照渡しを疑似している。

Fortran では「全ての引数は参照渡し」で、実際に受け渡す値は「広域変数を通して行なわれる。」

C 言語から Fortran の関数を呼ぶ時は、Fortran の間数名に下線を付ける。Fortran から C 言語の関数を呼ぶ為には、C 言語の関数に下線を付けて命名する。

例えば、fthree を Fortran の関数として作る。


* Fortran function()
       integer function addone(value)
       integer value
            addone = value + 1
       end

C 言語の主関数から呼び出す。関数名の最後に下線を付ける。必ず参照渡しにする。

/* C */
int main()
{
    int two = 2;
    int three = addone_(&two);
}

今度は、addone を C 言語の関数として作る。この関数名には下線を付けておく。


/* C */
int addone_(int* value)
{
    return *value + 1;
}

Fortran で cthree を呼ぶ時には、関数名の下線は必要無い。

* Fortran function
       program main
           integer two
           integer three
           two = 2
           three = addone(two)
       end program main

前回次回

C 言語と Fortran の混在 第壱弾2010年01月04日 07時25分35秒

Fortran のコードをある程度流して読むことが出来るようになると、次は関数の呼び出し。文字列に違和感が無くなれば、後は相互で関数を呼べる様になれば、あとはそれなりに何とかなる。

C 言語と Fortran の関数呼び出しの違いは三つ。まず、一つ目は関数名のシンボル。

C 言語から Fortran の関数を呼ぶ時は、Fortran の間数名に下線を付ける。Fortran から C 言語の関数を呼ぶ為には、C 言語の関数に下線を付けて命名する。

例えば、fthree を Fortran の関数として作る。


* Fortran function
       integer function fthree()
            fthree = 3
       end

C 言語の主関数から呼び出す。その時に、関数名の最後に下線を付ける。

/* C */
int main()
{
    int three = fthree_();
}

今度は、cthree を C 言語の関数として作る。この関数名には下線を付けておく。


/* C */
int cthree_()
{
    return 3;
}

Fortran で cthree を呼ぶ時には、関数名の下線は必要無い。

* Fortran function
       program main
           integer three
           three= cthree()
       end program main

前回次回

C 言語と Fortran の混在 第零弾2010年01月02日 13時23分08秒

Fortran の関数を C 言語から呼び出したり、C 言語の関数を呼び出したりも出来る。Fortran にはまだあまり詳しく無いので、これが環境依存なのか、一般的に通用する技法なのかは分らない。ここでは、C/C++ 利用者が Fortran も用い場合の四つの要点をまとめる。

まず、C 言語と Fortran の大きな違いは文字列型。

C 言語では文字の配列として扱い、NUL つまり、0 を特別な文字列の終端とみなす。どちらかとして言語としてサポートされているのではなく、利用者側が慣習として扱っている。

それに引替え、Fortran では文字列は型の一つとなって処理系でサポートされている。そのため、代入演算子や比較演算子が使える。Fortran では文字列の終端は空白で埋められている。これは言語側で自動的に処理される。

また、長さの違う文字列を比較した場合、終端の空白は無視されるので、長さが違くても先頭部分が同じなら、同一とみなされる。

C 言語利用者が、Fortran を使い始めるときには、文字列に注意を払うと入りやすい。全体的な動作はかなりの部分で同じなので、まずはその違いに注意を払う。

また、この文字列型の扱いが異なることにより、C 言語と Fortran 間で関数を呼び合う時に文字列型が渡される時には、その十分に注意をする必要がある。

次回

Fortran を使う2009年12月02日 10時58分34秒

最近 Fortran をちょこちょこと使う機会が出来た。Fortran は学生時代に物理系のプログラムを簡単に見せてもらった事がある程度。その時は、Fortran の算術演算子の多用が目に着いた。

今回は業務用プログラムの物。Fortran に慣れてくるのに少々手間取ったが、解ってくれば C や他の言語と大した異差は無いと思う。結局はある定型作業を記述してあるだけなので。

ただ、Fortran は言語の特性上、C 言語よりも悪い方向へ流されやすい様だ。見るコード、見るコードが汚くて、どのように何をやっているかを把握するのが大変だ。まあ、その様なコードの原因のほとんどは、元の開発者にあるのだが。