前のページ|次のページ

CALL MODULEルーチン

外部ルーチンをリターンコードなしで呼び出します。

カテゴリ: 外部ルーチン
操作: SAS Serverがロックダウン状態の場合、CALL MODULEルーチンは実行されません。詳細については、SAS Processing Restrictions for Servers in a Locked-Down State (SAS言語リファレンス: 解説編)およびSAS Processing Restrictions for Servers in a Locked-Down State (z/OS版SAS)を参照してください。
ヒント: 外部モジュールとロードモジュールは同義語です。ロードモジュールという用語は、通常z/OS環境で使用されます。外部モジュールという用語は、通常UNIX環境およびWindows環境で使用されます。

構文

CALL MODULE(<control>, module, argument-1, argument-2 ..., argument-n);
number=MODULEN(<control>, module, argument-1, argument-2 ..., argument-n);
character=MODULEC(<control>, module, argument-1 ..., argument-2, argument-n);
CALL MODULEI(<control>, module, argument-1, argument-2 ..., argument-n);
number=MODULEIN(<control>, module, argument-1, argument-2 ..., argument-n);
character=MODULEIC(<control>, module, argument-1, argument-2 ..., argument-n);

必須引数

module

使用する外部モジュールの名前を指定します。moduleは、共有ライブラリとルーチン名またはカンマで区切られた序数の値として指定できます。SASCBTBL属性テーブルでルーチンにMODULE属性を指定していたなら、そのルーチンの名前が固有(すなわち、属性ファイル内に同じ名前を持つ他のルーチンがない)のものである限りは、共有ライブラリ名を指定する必要はありません。詳細については、The SASCBTBL Attribute Table (UNIX版SAS)を参照してください。

モジュールは共有ライブラリ内に存在する必要があり、外部から呼び出せる必要があります。共有ライブラリ名は大文字と小文字を区別しませんが、ルーチン名は、そのルーチンの実装言語の制限に基づきます。ゆえにルーチン名は大文字と小文字を区別します。
共有ライブラリが序数値の命名をサポートしている場合、'XYZ,30'のように、10進数が後に続く共有ライブラリ名を提供できます。
moduleを定数としてではなく、SAS文字式として指定できます。ほとんどの場合、定数として渡されます。

argument-1, argument-2, ..., argument-n

要求されたルーチンに渡す引数を指定します。引数には適切な属性を使用してください。(すなわち、数値属性には数値引数を、文字属性には文字引数)

注意:
必ず、正しい引数と属性を使用してください。
共有ライブラリ関数に不正な引数や属性を使用すると、SASのクラッシュが引き起こされたり、予測しない結果がもたらされたりする可能性があります。

オプション引数

control

コントロール文字列です(省略可能)。最初の文字はアスタリスク(*)で、その後に次の文字の任意の組み合わせを指定する必要があります。

I 共有ライブラリルーチンが呼び出される前と後に、すべての引数を16進数表記で、MODULE関数と要求された共有ライブラリルーチンに出力します。このオプションは、不正な引数や属性テーブルによって発生した問題を診断するために使用できます。Iオプションを指定すると、Eオプションがそこに含まれます。
E 詳細なエラーメッセージが出力されます。Eオプション(またはこれより優先されるIオプション)がない場合、MODULE関数が生成するエラーメッセージは"関数の無効な引数,"のみになります。この情報では、通常、エラーの原因を確定するには不十分です。
Sx 区切り文字としてxを使い、フィールド定義を分離します。それから、引数のリスト上のxを、それ自身の文字引数として指定できます。この引数は引数リストの区切り文字として機能します。このリスト上の引数は単一の構造体として集められます。SASCBTBL属性テーブルでエントリを供給しない場合にのみ、このオプションを使用してください。SASCBTBL属性テーブルで、このモジュールにエントリを供給する場合は、このテーブル内のARGステートメントのFDSTARTオプションを使用し、構造定義を分離します。
H MODULEルーチン、属性ファイル形式および推奨されるSAS出力/入力形式の構文についての、手短な役立つ情報を提供します。
たとえば、制御文字列'*IS/'では、パラメータリストを出力し、文字列'/'を引数リスト内で区切り文字として扱うことを指定します。
次の文字列は、z/OS環境のみでサポートされています。
A SASCBTBLが利用可能な場合でも、テーブル属性を使用しません。
Z IGZERREを呼び出しません。詳細については、IBM z/OSオペレーティングシステムの付属文書を参照してください。
B その行の下に引数をコピーします。詳細については、IBM z/OSオペレーティングシステムの付属文書を参照してください。
T 属性情報をログに出力します。

詳細

CALL MODULEルーチンでIML関数を使用する

次の関数では、ベクトル引数と行列引数が許可されます。これらの関数は、IMLプロシジャ内でのみ使用できます。
  • CALL MODULEI
  • MODULEIN
  • MODULEIC
詳細については、SAS/IML Studio: User's Guideを参照してください。

属性テーブルの操作

CALL MODULEルーチンは、外部ライブラリ内にあるルーチンを実行します。ルーチンは、必要なmodule-name引数に加えてオプションの引数も使用して、ライブラリ名を識別します。
CALL MODULEは、引数の情報および個別のファイルで定義したルーチンの説明と引数の属性テーブルを使用してパラメータリストを作成します。属性テーブルはシーケンシャルテキストファイルで、CALL MODULEルーチンで呼び出せるルーチンの説明が含まれます。このテーブルは、CALL MODULEがパラメータリストを作成して外部ルーチンに渡すときに、指定された引数を解釈する方法を定義することを目的としています。属性テーブルには、呼び出す各外部ルーチンの説明と、そのルーチンに関連付けられた各引数の説明が含まれます。
CALL MODULEを呼び出す前に、属性テーブルを含む外部ファイルを示すようにSASCBTBLのファイル参照名を定義する必要があります。ファイルの作成時にファイルに任意の名前を付けることができます。これにより、SASの変数と出力形式がCALL MODULEの引数として使用される際、これらの引数が外部ルーチンに渡される前に適切に変換されます。このファイル参照名を定義しない場合、CALL MODULEは引数を変更せずに要求されたルーチンを呼び出します。
注意:
定義された属性テーブルなしでCALL MODULEルーチンを使用した場合、SASシステムに障害が発生したり、コンピュータのリセットが必要になる可能性があります。
呼び出すすべての外部関数に対して属性テーブルを使用する必要があります。

CALL MODULEルーチンで特別な出力形式を使用する

数値の配置

デフォルトで、CALL MODULEルーチンでは、SASCBTBLテーブル内でIBw.出力形式、PIBw.出力形式およびRBw.出力形式によって定義されたフィールドに対して、数値が強制的に配置されます。したがって、フィールドの埋め込みが行われ、適切な4バイトまたは8バイトの境界が提供されます。最新のコンパイラでは、この配置が想定されています。
配置が想定されていないコンパイラでビルドされたルーチンに対応して、CALL MODULEルーチン専用の新しい出力形式が作成されました。その新しい出力形式は、IBUNALNw.、PIBUNALNw.およびRBUNALNw.です。これらの出力形式を、IBw.、PIBw.およびRBw.出力形式のかわりに使用します。

IBUNALNw.、PIBUNALNw.およびRBUNALNw.出力形式

IBUNALNw.、PIBUNALNw.およびRBUNALNw. 出力形式は、CALL MODULEルーチンでのみ使用されます。これらが作成されたのは、IBw.およびPIBw.出力形式を使用した場合、FDSTART構造内のデフォルト動作では配置が強制されるためです。IBUNALNw.、PIBUNALNw.およびRBUNALNw. 出力形式では、データは配置されません。
この例では、SASCBTBL定義を示します。ここでは、FDSTART構造でIBw.出力形式が使用されます。
filename sascbtbl temp;
data _null_;
   file sascbtbl;
   input;
   put _infile_;
   datalines4;
routine xyz minarg=2 maxarg=2;
arg 1 char format=$3. fdstart;
arg 2 num format=ib4.;
;;;;
この例では、前述のSASCBTBL定義に基づいてCALL MODULEルーチンを使用するDATAステップを示します。
data _null_;
   x='abc';
   y=1;
   call module('xyz', x, y);
run;
XYZは、呼び出されると、1つの引数を受け取ります。これは集合構造のアドレスです。集合構造には、3バイトの'abc'が含まれ、その次に配置バイト、その次にIB4.出力形式からの値1(ビックエンディアン環境では'00000001'x、リトルエンディアン環境では'01000000'x)が続きます。XYZルーチンで配置が想定されていない場合は、数値は読み違えられます。
この例では、SASCBTBL定義を示します。ここでは、FDSTART構造でIBUNALNw.出力形式が使用されます。
filename sascbtbl temp;
data _null_;
   file sascbtbl;
   input;
   put _infile_;
   datalines4;
routine xyz minarg=2 maxarg=2;
arg 1 char format=$3. fdstart;
arg 2 num format=ibunaln4.;
;;;;
XYZは'abc'を含む集合構造のアドレスを与えられます。そのすぐ後に1の値が続き、間に配置バイトは入りません。
数値出力形式IBw.、PIBw.またはRBw.を使用する場合に配置が発生します。幅が2の場合、偶数バイト境界で配置が発生します。幅が4の場合、4バイト境界で配置が発生します。幅が8の場合、8バイト境界で配置が発生します。

比較

  • MODULEN関数とMODULEC関数では、それぞれ数値と文字が返されます。CALL MODULEルーチンでは、値は返されません。
  • CALL MODULEIルーチンとMODULEIC関数およびMODULEIN関数では、ベクトルおよび行列引数が許可されます。これらはスカラ値を返します。CALL MODULEI、MODULEICおよびMODULEINルーチンは、IMLプロシジャからのみ呼び出せます。

例1: CALL MODULEルーチンを使用する

この例では、XYZルーチンを呼び出します。次の属性テーブルを使用します。
routine xyz minarg=2 maxarg=2;
arg 1 input num byvalue format=ib4.;
arg 2 output char format=$char10.;
XYZ関数を呼び出すサンプルSASコードを次に示します。
data _null_;
   call module('xyz', 1, x);
run;

例2: IMLプロシジャでMODULEIN関数を使用する

この例では、WindowsプラットフォームでTRYMOD.DLLモジュールからCHANGIルーチンを呼び出します。次の属性テーブルを使用します。
routine changi module=trymod returns=long;
arg 1 input num format=ib4. byvalue;
arg 2 update num format=ib4.;
次のPROC IMLコードはCHANGI関数を呼び出します。
proc iml;
   x1=J(4, 5, 0);
   do i=1 to 4;
      do j=1 to 5;
         x1[i,j]=i*10+j+3;
      end;
   end;
   y1=x1;
   x2=x1;
   y2=y1;
   rc=modulein('*i', 'changi', 6, x2);

例3: MODULEN関数を使用する

この例では、BEEPルーチンを呼び出します。このルーチンは、WindowsプラットフォームでのKERNEL32ダイナミックリンクライブラリのWin32 APIに含まれています。次の属性テーブルを使用します。
routine Beep
   minarg=2
   maxarg=2
   stackpop=called
   callseq=byvalue
   module=kernel32;
arg 1 num format=pib4.;
arg 2 num format=pib4.;
属性テーブルファイルに'myatttbl.dat'という名前を付けるとします。BEEP関数を呼び出すサンプルSASコードを次に示します。
filename sascbtbl 'myatttbl.dat';
data _null_;
   rc=modulen("*e", "Beep", 1380, 1000);
run;
前述のコードによって、コンピュータのスピーカーからビープ音がなります。

関連項目:

前のページ|次のページ|ページの先頭へ