2.引数の引渡し
異なる言語の関数同士は引数の引渡しにおいて、様々な問題を引き起こします。
本SDKの関数仕様は様々な観点でそれをフォローしています。
a) アドレス渡しか、値渡しか
通常Fortranでは引数はアドレス渡しにしか対応してこなかったことから、
Fortranでも違和感無く扱えるように、統一的にアドレス渡しにしています。最近の
新しい仕様のFortranではポインター(アドレス)も扱えるようになっているようですが、
まずFortranでポインターを駆使してコーディングしているケースは稀に見るケース
だという判断をしています。ですから関数の引数は全てアドレス渡しに統一いたしま
した。
逆にCやC++のスケルトンでは、各引数が全て int *xxx や float *yyy のように
なっていて違和感はあるかもしれませんが、まず機能的な問題にはならないはず
です。
b) 構造体を使わない
CやPascal(Delphi)では常識的に使われてきた構造体は、引数の渡し方以前に、
大変悩ましい問題を抱えています。その内部的なデータの保持
形式がコンパイラの種類や、また極端な例ではコンパイラのバージョンでも異なって
きたりするなどの問題があります。また通常Fortranでは構造体という概念は
ありません。ですから少し冗長な引数列になっている部分もありますが、どんな
言語でもというコンセプトを守るために、関数の引数はすべて基本の型変数
(整数、実数、倍精度実数、文字列)だけにしています。
c) 文字列変数の文字数の扱い
Fortranのように文字変数がアドレスと長さを同時にペアで引き渡してしまう言語の
場合、そのアドレスの後に長さが連続して挿入されてしまうと、そうでない言語が参照
する場合は、その変数のうしろの引数では引渡しポイントがズレてしまうという問題を
引き起こします。
この問題に関してのフォローは、特にSDK側の仕組みとして対応できるものでは
ありませんが、各コンパイラ側のオプションにより対処可能な場合が多いです。例えば
Compaq Visual Fortranでは、コンパイラの設定 "External Procedures"の中に
"String Length Argument Passing:"なる項目があり、文字列長さは全ての
引数の後に廻すという指定"After All Args"を選択しておくことで解決できます。
Delphi(Pascal)においては、少し意味合いが変わりますが、長さを持たない
ポインター型(PChar)を利用することが一般的に推奨されています。
こちらのサンプルtrmod.dprでも
PChar型で代用しています。
3.関数(手続き)の形式
これもFortranを意識したものですが、Fortranで言うところの関数(手続き)は
一般的によく使用されるSUBROUTINE(サブルーチン副プログラム)と
FUNCTION(関数副プログラム)ですが、どちらかと言うとSUBROUTINEで
記述されることが圧倒的に多いものと思われます。ただし、これは戻り値を指定する
ことができません。すなわちCで言うところの全てvoid関数となることから、少し
わずらわしいのですが、戻り値の必要なものは引数でエラーコードを返すという
統一仕様にしています。ということでFortranで書く場合は、各関数を
SUBROUTINEで記述することになります。結局この部分は従来のFortranの
流れに譲った結果です。
また、
Delphi(pascal)で開発する場合も同様で、
procedure(手続き/戻り値無し)とfunction(関数/戻り値有り)があるのですが、
前者のprocedureで記述していただくことになります。
※C言語を基本にして書いていますので、どうしても「関数」という表現になって
しまうのですが、プログラミング言語の世界では「手続き(procedure)」という
呼ばれ方が一般的です。
SDKトップページへ
トップページへ