デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド...

91
デイ・ディスプ DADiSP WORKSHEET データ解析/ディスプレイ ソフトウェア カスタマイズ ガイド 2010 年 8 月 Copyright(C)2000 DSP Development Corporation One Kendall Square Cambridge, MA 02139 USA

Transcript of デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド...

Page 1: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

デイ・ディスプ

DADiSPWORKSHEET

データ解析/ディスプレイ ソフトウェア

カスタマイズ ガイド2010 年 8 月

Copyright(C)2000

DSP Development Corporation

One Kendall Square

Cambridge, MA 02139

USA

Page 2: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを
Page 3: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

目 次

1 章   DADiSP システムのカスタマイズ ............................................ 1 2 章   SPL: Series Processing Language シリーズ処理言語 ....... 3

2.1 はじめに ................................................................................................ 3 2.2 詳細な検討 ........................................................................................... 5 2.3 SPL の変数 .......................................................................................... 6

2.3.1 変数の定義 ...................................................................................................... 6 2.3.2 変数の削除 ...................................................................................................... 7 2.3.3 変数リストの参照 ............................................................................................. 7 2.3.4 SPL のシリーズと配列 ...................................................................................... 8 2.3.5 複素数 ............................................................................................................. 8

2.4 SPL の演算子 ....................................................................................... 9 2.4.1 比較演算子 ...................................................................................................... 9 2.4.2 インクリメント / ディクリメント演算子 .................................................................. 11 2.4.3 代入演算子 .................................................................................................... 11

2.5 文とブロック ........................................................................................ 12 2.5.1 条件文 ........................................................................................................... 12 2.5.2 ループ ............................................................................................................ 13 2.5.3 ループに関する注意点 ................................................................................... 16

2.6 SPL のホット変数 ................................................................................ 18 2.7 SPL のマクロプリプロセッサ ................................................................ 19 2.8 SPL 関数についての補足 ................................................................... 20

2.8.1 値の受け渡し ................................................................................................. 21 2.8.2 再帰的な関数 ................................................................................................ 22 2.8.3 引数の省略 .................................................................................................... 23 2.8.4 マクロとの競合の回避 .................................................................................... 24

2.9 SPL 関数のコンパイル ........................................................................ 25 2.10 SPL のエラーファイル ....................................................................... 25 2.11 SPL 関数の自動ロード ...................................................................... 25

2.11.1 SPLMAIN 関数の使用 ................................................................................. 25 2.12 SPL 関数の一覧表示 ........................................................................ 26 2.13 SPL 関数の ASCII ファイルへの書き出し ........................................... 26

3 章   DADiSP のマクロ .................................................................. 28 3.1 マクロの作成 ...................................................................................... 28

3.1.1 “ ツール”プルダウンメニューを用いたマクロ定義 ........................................... 28 3.1.2 コマンドラインでの #DEFINE 文の使用 ........................................................... 29 3.1.3 コマンドラインでの DEFMACRO 文の使用 .................................................... 30

i

Page 4: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

3.1.4 マクロのネスティング ..................................................................................... 31 3.1.5 マクロの変数としての使用 ............................................................................. 32

3.2 マクロの一覧表示 ............................................................................... 32 3.3 マクロの編集 ....................................................................................... 33 3.4 マクロファイルの利用 .......................................................................... 33

3.4.1 マクロファイルの作成と編集 ........................................................................... 33 3.4.2 マクロファイルの読み込み .............................................................................. 34 3.4.3 マクロファイルの書き出し ............................................................................... 35 3.4.4 マクロファイルの取り込み ( インクルード ) ......................................................... 35

3.5 マクロの有効範囲 ( スコープ ) 、優先度、持続性 ....................................... 35 3.5.1 DADiSP の事前定義マクロ ............................................................................ 36 3.5.2 起動時のマクロのロード ................................................................................. 37

3.6 マクロコマンド一覧 .............................................................................. 37

4 章   DADiSP メニューの作成 ....................................................... 38 4.1 メニューの呼び出し ............................................................................. 38

4.1.1 MENUFILE コマンドの使用 ............................................................................ 38 4.1.2 ツールバーボタンの使用 ................................................................................ 39 4.1.3 メニュー項目の選択 ....................................................................................... 39

4.2 カスタムメニューの作成 ...................................................................... 39 4.2.1 テキストと特殊文字 ........................................................................................ 40 4.2.2 コメントの埋め込み ........................................................................................ 40 4.2.3 表示行の埋め込み ......................................................................................... 40 4.2.4 メニューのネスティング .................................................................................. 41 4.2.5 マクロからのメニューの呼び出し .................................................................... 41 4.2.6 カスタムヘルプファイルの指定 ....................................................................... 41

4.3 メニューファイルオプション .................................................................. 41 4.3.1 メニューの表示位置 ....................................................................................... 42 4.3.2 レポート形式によるメニュー表示 ....................................................................... 42 4.3.3 情報のテキストファイルへの保存 ................................................................... 43

4.4 ユーザー入力の受け付け .................................................................... 43 4.4.1 ダイアログボックスとメニューパネル .............................................................. 43 4.4.2 ドロップダウンリストボックス ........................................................................... 43 4.4.3 入力情報のマクロへの格納 ............................................................................ 44 4.4.4 デフォルト値の設定 ........................................................................................ 45 4.4.5 既存値の記憶 ................................................................................................ 45 4.4.6 リストボックスの選択項目 .............................................................................. 45 4.4.7 ダイアログボックスメニューの例 ..................................................................... 46

4.5 メニューコマンド / キーワード一覧 ......................................................... 47 4.5.1 関連コマンド ................................................................................................... 47 4.5.2 メニューファイルのキーワードと特殊文字 ....................................................... 47

ii

Page 5: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

5 章  コマンドファイルの使用 ......................................................... 48 5.1 コマンドファイルの作成 ........................................................................ 48

5.1.1 コマンドファイルの構成要素 ........................................................................... 49 5.1.2 コマンドファイルのコメント .............................................................................. 49

5.2 コマンドファイルのロード ...................................................................... 49 5.2.1 起動時のロード .............................................................................................. 49 5.2.2 MS-Windows(TM) 環境における手順 ........................................................... 49 5.2.3 UNIX 環境における手順 ................................................................................. 50 5.2.4 セッションからの呼び出し ............................................................................... 50

5.3 コマンドファイルにおけるキーストロークと関数 .................................... 50 5.3.1 コマンドファイル専用のキーストローク ........................................................... 51 5.3.2 コマンドファイル専用の関数 ........................................................................... 51

5.4 コマンドファイルにおけるユーザーとの対話 ......................................... 55 5.4.1 コマンドファイル実行中のメッセージ .............................................................. 55 5.4.2 ユーザー入力の受け付け ............................................................................... 58 5.4.3 コマンドファイルの制御と分岐 ........................................................................ 60 5.4.4 DADiSP のアイコン状態での実行 .................................................................. 62

5.5 コマンドファイルの例 ........................................................................... 62

6 章  他プログラムとの通信 ........................................................... 66 6.1 DADiSP のパイプラインの使用 ........................................................... 66

6.1.1 RUN コマンドの実行 ...................................................................................... 66 6.2 UNIX のパイプ .................................................................................... 67 6.3 DDE(Dynamic Data Exchange) の使用 ............................................. 68 6.4 DDE の有効化 .................................................................................... 69

6.4.1 コピー / 貼り付け及びリンク メニューの使用 .................................................. 69 6.4.2 DDE 関数の使用 ............................................................................................ 69 6.4.3 DDE 関数の呼び出し ..................................................................................... 70

6.5 DDE チャンネルのオープン ................................................................. 70 6.6 アプリケーションからのデータの受信 ................................................... 71 6.7 アプリケーションへのデータの送信 ...................................................... 71 6.8 アプリケーションでのコマンドの実行 .................................................... 72 6.9 DDE 通信の終了 ................................................................................ 72 6.10 DDE のアドバイスループ‐データの自動転送 ..................................... 72 6.11 DADiSP の DDE サーバとしての使用 ................................................ 73 6.12 DDE の技術的仕様 ........................................................................... 74

7 章 付録 A   SPL リファレンス ........................................................ 75 7.1 SPL の文 ............................................................................................ 75 7.2 コメント ................................................................................................ 76

iii

Page 6: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

7.3 キーワード .......................................................................................... 76 7.4 インクリメント / ディクリメント演算子 ....................................................... 76 7.5 代入演算子 ......................................................................................... 76 7.6 制御フロー .......................................................................................... 77 7.7 ループ文 ............................................................................................. 78 7.8 ラベル文 ............................................................................................. 79 7.9 ジャンプ文 .......................................................................................... 79 7.10 ユーザー定義関数 ............................................................................ 80 7.11 標準変数 .......................................................................................... 82 7.12 ホット変数 ......................................................................................... 83 7.13 パラメータの受け渡し ........................................................................ 84

iv

Page 7: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

1章  DADiSP システムのカスタマイズ

個々のユーザーのニーズに合わせてカスタマイズする機能がなければ、いかに優れたソフトウェアでも完

璧とはいえません。DADiSP は、多彩な機能を備えた非常に強力なツールであり、標準的な機能に加えて、

上級ユーザーのニーズを満たす特殊な機能や関数を装備しています。

このマニュアルは、DADiSP システムのカスタマイズツールについての説明書です。後続の章には、以下の

操作に関する情報が記載されています。

・SPL(Series Processing Language)を用いたワークシート関数の新規作成

・DADiSP のマクロ機能を用いたワークシート関数の新規作成

・ユーザー独自のポップアップメニューの作成

・DADiSP のコマンドファイルの作成と使用

・DADiSP のパイプラインを利用した外部プログラムの実行

・DDE(Dynamic Data Exchange)を利用した外部プログラムとの通信

DADiSP の購入者のほとんどは、遅かれ早かれ上記の特殊機能を使用する機会がやってきます。通常は、

キーストロークマクロの作成が、その開始点になります。また、工場データの夜間時の自動分析など、カスタ

ムアプリケーションを念頭に入れて、本ソフトウェアを購入されることもあるでしょう。いずれにしても 、

DADiSP には、個々のユーザーのデータ分析に最も適した形にカスタマイズする機能が用意されています。

ここでは、DADiSP のデモプログラムを例にとって、「DADiSP のカスタマイズ」の概念を説明します(デモを

ご覧になったことのない方は、“ヘルプ”-“自動実行デモ”を選択して、このプログラムを実行してください)。

このデモは、製品に用意されたカスタマイズ機能だけを使用して作成されています。このデモの目的と、こ

のデモにおけるカスタマイズ機能の実装方法を説明することにより、DADiSP をどのようにカスタマイズす

れば、個々の使用目的に適合させることができるかご理解いただけるものと思います。このデモでは、

DADiSP ワークシートの能力の一端をお見せします。デモの実行は、ほとんど自動化されていますが、

DADiSP の用途は極めて広範囲に及ぶため、多忙なユーザーの方が興味のある部分だけを参照できるよ

うに、ユーザーの関与の余地を残してあります。

DADiSP の自動化機能は、DOS のバッチファイルや UNIXのスクリプトのようなコマンドファイルで実現され

ます。上記のデモは、コマンドファイルを設計、実装することにより作成されています。このデモでは、購入製

品に必ずしも必要でない機能をユーザーが選択できるように、カスタムメニュー機能によって専用のメニュ

ーが追加されています。DADiSP に関する知識がまったくない方でも、このメニューを使用することにより、

デモを一覧することができます。メニューが選択されると、DADiSP の特定の機能を紹介する別のコマンド

ファイルが呼び出されます。

DADiSP の能力をデモンストレーションするため、コマンドファイルから多くの標準機能が呼び出されます。

また、対話型のセッションの途中で、ユーザーが個々のモジュールに直接アクセスできるように、各種のマ

クロが用意されています。たとえば、"AD"は、Advanced DSP モジュールのメインメニューを呼び出します。

マクロを利用すれば、ワークシートの関数を組み合わせたり、省略形で呼び出すことが可能になるので、こ

れらの関数を容易かつ迅速に利用できます。また、"DEMO"という名前のカスタムツールバーボタンを利用

すると、どのセッションからでも自動実行デモに復帰することができます。このように、 DADiSP のデモは、当

社の目的に合わせてカスタマイズされた DADiSP のアプリケーションであり、コマンドファイル、カスタムメニ

ュー、マクロ、およびカスタムツールバーボタンを使用して作成されています。

-1-

Page 8: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

DADiSP のカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

行えば、新規のユーザーでも簡単なメニューの選択だけで定型的な分析を実行したり、ボタンのクリックだ

けで 1日分のデータを取り込むことができます。従業員はソフトウェアコマンドの習得ではなく、調査の実行

のために雇用されているので、これは大きな利点になります。グループの任意のメンバが作成したメニュー

を、全員で使用することが可能です。

DADiSP には、まったく異なる機能を追加、利用する機能も用意されています。SPL(Series Processing

Language)を使用することにより、DADiSP の既存の関数の組み合わせでは必ずしも実現できない関数を

作成できます。また、DADiSP の内部から外部プログラムを実行するために、「パイプライン」が用意されて

います。DADiSP のコマンドラインから、事実上すべての外部プログラムが実行できます。さらに、 MS-

Windows の環境では、DADiSP を DDE(Dynamic Data Exchange)のクライアントまたはサーバとして動作さ

せることも可能です。たとえば、データをデータベースに収集すると同時に、DADiSP を使用して傾向分析を

行う場合などは、DDE は 2 つのプログラムでデータを共有する理想的な手段となります。

このように、個々のニーズに合わせて最適化する機能を活用することにより、DADiSP を必要な分析を効率

的に実行するツールとして利用することができます。SPL の変数や関数、およびマクロは、あらゆるユーザ

ーが利用できます。また、反復作業の効率化には、コマンドファイルが有効です。グループ作業では、メニュ

ーおよびツールバーボタンのカスタマイズにより、DADiSP の能力を誰もが容易に利用することができます。

さらに、SPL、DDE、およびパイプラインを使用すれば、個々のユーザーの用途に応じて DADiSP の適用範

囲を拡張できます。

-2-

Page 9: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2章  SPL: Series Processing Language シリーズ処理言語

SPL(Series Processing Language)は、DADiSP のワークシート環境でデータを操作し、アクションを実行する

ために特別に開発されたコンパクトな言語です。SPL ルーチン、すなわちユーザー定義関数は、標準の

DADiSP 関数や他の SPL ルーチンを組み合わせることで作成されます。SPL の仕様は C言語に基づいて

おり、文の処理、制御フロー、変数操作、ユーザー定義関数などは C言語と同様です。

SPL の言語定義、有効範囲、およびシンタックスの詳細‐文、変数、シリーズと配列、引数の受け渡し、コメン

ト、(条件文、ループ文、ラベル文、およびジャンプ文による)フロー制御‐については、付録 A「SPL リファレン

ス」をご覧ください。

この章では、DADiSP環境で SPL を使用する際の基本的なテクニックについて解説します。この章には、

SPL に関する以下の情報が記載されています。

・変数

・演算子

・文とブロック

・ホット変数

・マクロプリプロセッサ

・関数

2.1 はじめに

ここでは、SPL の詳細や正式な規則に立ち入ることなく、実際のプログラムを使用して SPL の概要を説明

します。SPL と C との類似点や相違点のうち、重要なものについては随時解説することにします。プログラ

ムを作成したことのある方、特に C のプログラマーであれば、SPL を容易に使いこなせるはずですが、初心

者の方は、下記のサンプルプログラムを注意深く参照してください。

まず、華氏温度を摂氏温度に変換する SPL 関数について考えてみましょう。この関数の使用手順は以下

のようになります。

1. この関数を記述したテキストファイル(ソースコード)を作成する。

2. この関数を DADiSP に読み込む。

3. この関数を呼び出して、華氏温度を摂氏温度に変換する。

SPL 関数を記述したテキストファイルには、 .spl拡張子を付ける必要があります(myfun.spl など)。関数の形

式は以下のとおりです。大文字/小文字は区別されません。

関数名 (引数 1, 引数 2,...引数 n)

(

ステートメント;

)

1 つの SPL ファイルに、複数の関数を記録できます。SPL 関数の作成には、任意の ASCIIテキストエディタ

-3-

Page 10: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

が使用できます。また、DADiSP にも、SPL の編集環境が用意されています。“ツール”プルダウンメニュー

から、“SPL”-“SPL ファイル新規作成”を選択すると、SPL 関数の作成が可能な簡単なエディタが起動し

ます。

ここでは、C=(5.0/9.0)(F - 32.0)という公式を使用して、celsius 関数を作成します。“ツール”プルダウンメニ

ューから、“SPL”-“SPL ファイル新規作成”を選択するか、お持ちのテキストエディタを使用して、以下のコ

ードを記述したファイルを作成し、celsius.spl という名前で保存してください。

/* 華氏から摂氏への変換 */

celsius(f)

(

c = (5.0 / 9.0) * (f - 32.0);

return( c );

)

この関数を利用するには、DADiSP に celsius.spl ファイルを読み込む必要があります。そのためには、“ツー

ル”プルダウンメニューから“SPL”-“SPL ファイルの読み込み”を選択し、celsius.spl を指定します。

このほか、コマンドラインに以下のコマンドを入力することにより、ファイルを直接読み込むこともできます。

splread(“celsius.spl”)

関数のロードが成功すると、以下のメッセージが表示されます。

1 Function(s) Read From File ‘celsius.spl’

これで、先ほど作成した celsius 関数を、DADiSP の標準関数と同様に呼び出すことができます。たとえば、

DADiSP ワークシート上から、

celsius(32)は、0 を返します。

celsius(212)は、100 を返します。

-4-

Page 11: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

celsius(72)は、22.22222222 を返します。

celsius 関数の適用対象として、シリーズを指定することも可能です。たとえば、シリーズを生成する標準関

数、gseries(省略形は gser)を使用した以下のコード、

celsius(gser(32, 212, 72))

は、0、100、22.22222222 の 3 つの要素からなるシリーズを返します。

2.2 詳細な検討

SPL 関数の作成手順を一通り実行したところで、celsius 関数を詳しく検討することにしましょう。参考のた

めに、この関数をもう一度掲載します。

/* 華氏から摂氏への変換 */

celsius(f)

(

c = (5.0 / 9.0) * (f - 32.0);

return( c );

)

関数の最初の行、

/* 華氏から摂氏への変換 */

は、コメントです。この例では、関数の機能の概要が記述されています。/*から*/までの文字は無視される

ので、関数の理解を容易にする目的に使用できます。1 行のコメントは、以下のように記述することもできま

す。

! 華氏から摂氏への変換

!から行末までの文字は、すべて無視されます。コメントは自由に使用でき、通常空白が表示される部分で

あれば、任意の場所に配置できます。

関数名、celsius の後ろには、引数リストが続きます。引数リストは()で囲み、関数名の直後に配置しなけれ

ばなりません。celsius 関数の引数は 1 つしかありません。この変数 fは、華氏温度と解釈されます。その後

の()で囲まれた部分が、関数の本体(ボディ)になります ( { } を使用する C言語との違いに注意してくださ

い)。

変数 c には、変換の結果が格納されます。fおよび c は、celsius 関数のローカル変数です。すなわち、他の

ルーチンで同じ変数名を使用しても、競合は発生しません。C言語と異なり、SPL は非宣言型の言語であり、

変数の型宣言(整数、浮動小数点数、配列などの宣言)は不要です。SPL の変数は、演算子=を使用して値

を代入するだけで作成されます。

変換の結果は、return文によって返されます。return文の( )の中には、シンタックスさえ正しければ任意の

文を格納できます。この例では、以下の文を使用して変換の結果を直接返すこともできます。

return(( 5.0 / 9.0 ) * ( f - 32.0 ));

ただし、変数値を返したほうが、コードが明確になります。関数は、値を必ず返すとは限りません。式のない

-5-

Page 12: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

return文が実行されたり、関数の最後のカッコに到達した場合は、戻り値なしで制御が返されます。

前述の例で説明したように、celsius 関数はスカラ値だけでなく、シリーズにも適用できます。入力としてシリ

ーズを指定すると、for ループや while ループを使用しなくても、シリーズの各要素が自動的に変換されま

す。この極めて強力な機能により、C や FORTRANなどの従来の言語と比較して、SPL では関数を非常に

簡潔に記述できます。

2.3 SPL の変数

SPL の変数は、SPL のファイルや関数の内部で定義、操作されます。さらに、セッションの途中でコマンドラ

インを使用したり、“ツール”プルダウンメニューから、“変数”-“変数のリスト”を選択することで、変数を定

義、操作することもできます。SPL の変数には、グローバル変数とローカル変数があります。以下のセクショ

ンでは、変数の使用法について説明します。

2.3.1 変数の定義

SPL では、変数の型は宣言されません。演算子=を使用して変数に値を代入することにより、所定の変数が

作成され、そのデータ型が決定されます。変数名は最大 32文字であり、大文字/小文字は区別されません。

SPL の変数には、以下のデータ型があります。

・整数

・実数

・複素数

・文字列

・シリーズ

・配列

例:

a = 10 ! 整数

b = 3.14 ! 実数

c = 1 + 5 i ! 複素数

d = “文字列” ! 文字列

s = gser(1, 2, 3, 4 ) ! 4要素のシリーズ

t = ravel( s, 2 ) ! 2 x 2 の配列

ユーザー定義関数の内部で使用される変数は、その関数のローカル変数です。関数の評価が完了すると、

その関数で定義されたローカル変数は自動的に削除されます。

fun1(x)

(

a = x + 1;

return( a );

)

-6-

Page 13: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

ここで、以下の対話型セッションを考えてみてください。(DADiSP ワークシート上から 1 行づつ入力する。)

a = 1

func1(10)戻り値: 11

a 戻り値: 1

関数 func1 で使用される変数 a は、この関数だけで有効なローカル変数であり、式 a=1 で定義される変数

a は、セッション全体で有効なグローバル変数です。 func1 で定義されたローカル変数 a は、セッションで定

義されたグローバル変数 a とは競合しません。関数の内部でグローバル変数を明示的に操作するには、

setvar および getvar ルーチンを使用します。

fun2( x )

(

y = getvar( a );

setvar( a , x + y );

return( a );

)

a = 1

fun2(10) 戻り値: 11

a 戻り値: 11

関数 func2 では、グローバル変数 a の値が明示的に参照、設定されています。

2.3.2 変数の削除

delvariable 関数(省略形は delvar)は、現行セッションの特定のグローバル変数を削除します。

たとえば、

myvar = integ( w1 )

delvariable( myvar )

は、変数 myvar を作成、削除します。また、delallvariables 関数は、セッションのすべてのグローバル変数を

削除します。

2.3.3 変数リストの参照

“ツール”プルダウンメニューから“変数”-“変数のリスト”を選択するか、コマンドラインに vars コマンドを

入力すると、現行のセッションで利用可能なグローバル変数の一覧が表示されます。変数は定義された順

に表示されるので、最後に作成された変数がリストの先頭に表示されます。ただし、アンダースコアで始ま

る変数(_myvar など)は、リストには表示されません。これらの変数を含むすべての変数を参照するには、

allvars コマンドを入力する必要があります。

-7-

Page 14: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2.3.4 SPL のシリーズと配列

C と異なり、シリーズは SPL の一次データ型です。シリーズは、スカラ値と同様に処理することができます。

a = gser ( 1, 2, 3, 4);

b = a + 1;

c = b^2;

上記の算術演算は、シリーズの各要素に自動的に適用されます。C と異なり、シリーズのインデックスは 1

から始まります。個々の要素を参照するには、通常と同様に[]を使用します。

a = gser(4, 3, 2, 1)

a[2] 戻り値: 3

a[2] = 0

上記の結果、シリーズ a の各要素は、4、0、2、1 になります。

SPL の配列は、行列の形式で表現されます。すなわち、

data [ 3, 4]

は、配列の第 3 行、第4列の要素を表します。シリーズと同様に、配列のインデックスは 1 から始まります。

インデックス自体をシリーズにすることも可能です。

a = gser(10, 20, 30, 40);

b = a[gser(3, 2, 1)];

シリーズ b の各要素は、30、20、10 になります。

2.3.5 複素数

SPL は複素数にも対応しています。 − 1 を表現するため、定数 i が定義されています。たとえば、

x = 1 + 2i

y = .5 + i

x + y 戻り値: 1.5 + 3i

x * y 戻り値: -1.5 + 2i

a = gser( 1, 2, 3, 4)

fft( a )

は、複素数のシリーズ(10 + 0i, -2 + 2i, -2 + 0i, -2 - 2i)を返します。

i は複素数を表すので、グローバル変数またはローカル変数として i を使用することはできません。

SPL には、複素数を操作する以下の関数が用意されています。

-8-

Page 15: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

関数 説明

real 複素数/複素数シリーズの実数部

imag 複素数/複素数シリーズの虚数部

mag 複素数/複素数シリーズの絶対値

phase 複素数/複素数シリーズの角度(-π~+π)

angle 複素数/複素数シリーズの角度(0~2π)

conj 数/シリーズの複素共役

polar 直交座標から局座標への変換

実数と複素数の混合演算では、実数の虚数部は 0 と見なされます。

2.4 SPL の演算子

SPL には、比較演算子、インクリメント/ディクリメント演算子、および代入演算子が用意されています。以下

のセクションでは、演算子の使用法について解説します。

2.4.1 比較演算子

SPL には、比較/論理演算を行う演算子や関数が多数用意されています。

演算子 関数 説明

< LESSER より小さい

<= LESSEREQ 以下

> GREATER より大きい

>= GREATEREQ 以上

== EQUAL 等しい

!= NOTEQ 等しくない

&& AND 論理積

|| OR 論理和

! NOT 論理否定

XOR 排他的論理和

たとえば、式 a != 10 は、noteq(a, 10)と機能的に等価です。

比較/論理演算子は、スカラ値に対して 2進値(1 または 0)を返します。

a = 1

a < 10 戻り値: 1

a != 1 戻り値: 0

-9-

Page 16: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

以下に、偶数、奇数を判別する 2 つの関数を記載します。

/* 数値が偶数であれば 1を、それ以外は0を返す */

iseven( x )

(

return( 2 * (int(x/2)) == x);

)

/* 数値が奇数であれば 1を、それ以外は0を返す */

isodd( x )

(

return(not(iseven( x );

)

標準関数 int は、数値の整数部分を返します。

数値の符号を返す関数は、以下のように極めて簡潔に記述できます。

/*

** 数値の符号を返す、

** 1:正数、0:ゼロ、-1:負数

*/

sgn( n )

(

sign = ( n > 0 ) - ( n < 0 );

return( sign );

)

比較/論理演算子は、シリーズに適用することもできます。この場合の演算結果は、2進数のシリーズ(0 お

よび 1 からなるシリーズ)になります。

s = gser( 1, 2, 3, 4)

t = s >= 2

シリーズ t の内容は、0、1、1、1 になります。この機能を使用することにより、コンパクトでありながら強力なコ

ードが作成できます。以下の関数を考えてみてください。

/* 論理条件に基づく値の置換 */

replace( s, cond, val)

(

result = s * not (cond) + val * cond;

return( result);

)

replace(w1, w1 > 10, 11)は、シリーズ W1 の 10.0 を超える要素を、すべて 11.0 に置き換えます。また、

replace(w1, w1 < w2, w2)は、W1 および W2 の各要素のうち、大きい方の要素からなるシリーズを作成しま

す。ループは必要ないことに注意してください。

-10-

Page 17: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2.4.2 インクリメント/ディクリメント演算子

SPL には、C と同様に変数をインクリメント/ディクリメントする 2 つの特殊な演算子が用意されています。イ

ンクリメント(増分)演算子++は変数に 1 を加え、ディクリメント(減分)演算子は 1 を引きます。++および--は、

接頭辞として使用する(変数の前: ++n)ことも、接尾辞として使用する(変数の後: n++)こともできます。式++n

は、値が使用される前に n をインクリメントしますが、式 n++は、値が使用された後で n をインクリメントしま

す。たとえば、n = 5とすると、

x = n++;

では、x の値が 5になりますが、

x = ++n

では、x の値は 6になります。どちらの場合も、n の値は 6になります。

2.4.3 代入演算子

以下の式、

j = j + 2

のように、左側の変数と右側の変数が同じ場合には、以下の短縮形が使用できます。

j += 2

SPL は、以下の代入演算子をサポートしています。

演算子 説明

+= 加算と代入

-= 減算と代入

*= 乗算と代入

/= 除算と代入

e1 および e2 を式とすると、

e1 op = e2

は、

e1 = (e1) op (e2)

と同じです。ただし、e1 は 1回しか計算されません。カッコに注意してください。

x *= y + 1

は、以下の式と等価ですが、

x = x * ( y + 1 )

-11-

Page 18: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

以下の式とは同じではありません。

x = x * y + 1

代入演算子は、高速、簡潔であるだけでなく、人間の思考にも合っています。たとえば、私たちは「 jに 2 を加

える」または「jを 2 だけ増やす」と言うことはあっても、「jの値を取得し、2 を加え、その結果を jに戻す」とは

言いません。これを表現したものが、j += 2 なのです。

2.5 文とブロック

x = 0、j++などの式の後ろに、以下のようにセミコロンを付加すると、文が完成します。

x = 0 ;

j ++ ;

式は、DADiSP のセッションの途中で対話的に入力することができます。たとえば、W1 のデータ範囲を記録

したグローバル変数を定義するには、DADiSP ワークシート上から以下のコードを入力します。

r1 = max ( w1 ) - min ( w1 )

この場合は、入力式が 1 つしかないので、最後の ; は不要です。複数の式を入力する場合は、それぞれの

式を ; で分離する必要があります。

r1 = max ( w1 ) - min ( w1 ) ; r2 = r1 ^ 2

この関数は 1 つ以上の式で構成されるので、1 つの式の最後には必ず ; を付加しなければなりません。

/* 入力シリーズのレンジを返す */

drange ( a )

(

r1 = max ( s ) - min ( s ) ;

return ( r1 ) ;

)

括弧 “ ( “ および “ ) “ は、複数の文をひとまとめにして、複合文、すなわちブロックを作成するのに使用さ

れます。ブロックは、1 つの文として取り扱われます(この機能は、C の { } に相当します)。たとえば、関数の

文は、()でくくられます。

2.5.1 条件文

if-else文は、条件判断に使用されます。シンタックスは以下のとおりです。

if ( 式 )

文 1;

else

文 2;

式の値が 0 でない場合は文 1 が評価され、0 の場合は文 2(省略可能)が評価されます。

以下に、例を記載します。

-12-

Page 19: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

if ( a < 10 ) echo ( a ) ;

if ( a < 10 ) echo ( a ) ;

else echo ( “ FALSE “ ) ;

複合文は、( )で囲まなければなりません。

if ( a < 10 ) (

b = 1 ;

c = 2 ;

)

else (

b = 0 ;

c = 0 ;

)

複数の else-if節もサポートされています。

if ( a < 10 ) (

b = 1 ;

)

else if ( a < 20 ) (

b = 2 ;

)

else (

b = 3 ;

)

以下の単純な関数は、2 つの数のうち、大きい方を返します。

larger ( a , b )

(

if ( a > b )

val = a ;

else

val = b ;

return ( val ) ;

)

2.5.2 ループ

SPL では、C と同様の while ループと for ループが使用できます。while文のフォーマットは以下のとおりで

す。

while(式)

文;

式が評価され、その結果が 0 でない場合は文が実行され、再び式が評価されます。式が 0 になると、このサ

イクルが終了し、文の次に制御が移ります。

-13-

Page 20: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

複合文は、( )で囲みます。

while(式)(

文 1;

文 2;

)

以下の srt 関数は、ニュートンの近似法に基づいて、while ループを使用して実数の平方根を求めます。

/*

** ニュートンの近似法に基づいて実数の平方根を

** 小数点第5桁までの精度で求めます

**/

srt ( num )

(

/* check domain */

if ( num <= 0 )

return ( 0 ) ;

if ( imag ( num ) != 0.0 )

return ( 0 ) ;

b1 = num /2 ;

a1 = num ;

while ( a1 > 0.00001 * b1 ) (

a1 = abs ( ( num / b1 ) - b1 ) ;

b1 = ( ( num / b1 ) + b1 ) / 2 ;

)

return ( b1 ) ;

)

for文のフォーマットは以下のとおりです。

for(式 1; 式 2; 式 3)

文;

これは、以下のコードと等価です。

式 1 ;

while ( 式 2 ) (

文;

式 3;

)

for ループの式は自由に設定できますが、一般には以下の形式が使用されます。

for ( 初期化;比較基準;ループの増分 ) (

ループの制御文;

)

-14-

Page 21: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

最初の式では、代入演算子によって、1 つ以上の変数を初期化します。複数の変数を初期化する場合は、

各式をセミコロンで区切る必要があります。(C ではコンマが使用されます。つまり、C と SPL では、for ル

ープのセミコロンとコンマの使い方が逆になります。) 2番目の式では、何らかの比較演算子を使用して、

ループの終了条件をチェックします。3番目の式では、通常 1 つ以上のループ変数をインクリメントまた

はディクリメントします。以下に実例を記載します。

/* raise x to the nth power for n > 0 */

power ( x, n )

(

for ( p = 1 ; n > 0 ; --n ) (

p = p * x ;

)

return( p ) ;

)

break文は、最も内側のループを即座に終了させる目的で使用されます。たとえば、以下の関数はシェル

ソートを行います。

/* シリーズ s を 降順にソートします */

shellsort ( s )

(

v = s ;

n = length ( v ) ;

for ( gap = int ( n / 2 ) ; gap > 0 ; gap = int ( gap / 2 ) ) (

for ( k = gap ; k < n ; k++ ) (

for ( j = k - gap ; j >= 0 ; j -= gap ) (

break;

temp = v [ j + 1 ] ;

v [ j + 1 ] = v [ j + gap + 1 ] ;

v [ j + gap + 1 ] = temp ;

)

)

return ( v ) ;

)

この関数では、3 つのループがネスティングされています。1番外側のループでは、比較する要素間の間

隔(gap)が設定されます。gap は、n/2 に初期化され、ループが反復されるたびに 1/2倍され、最終的には

1 になります。中央のループでは、gap だけ離れた 2 つの要素が比較されます。1番内側のループでは、

順番が逆になっている要素が入れ替えられます。要素が正しい順番に並べ替えられると、1番内側のル

ープが終了し、制御が中央のループに戻ります。gap は最終的には 1 になるので、全要素が所定の順番

に並べ替えられます。標準の length 関数は、シリーズの要素数を返します。

continue文は、break文と関係ありますが、break文ほどは使用されません。continue文が実行されると、ル

ープの次の繰り返しが即座に開始されます。たとえば、以下の関数は、シリーズの正数の要素だけを 2倍

にし、負数の要素はスキップします。

/* 正数のみを 2倍する */

pos2 ( a )

(

n = length ( a ) ;

for ( j = 1 ; j <= n ; j++ ) (

-15-

Page 22: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

if ( a [ j ] < 0 )

continue; /* 負数をスキップ */

/* 正数への演算 */

a [ j ] *= 2 ;

)

return ( a ) ;

)

goto文は、ラベル文に即座に制御を移します。goto文は、深くネストされた for ループや while ループから

離脱するのに便利です。

a = 0 ;

for ( j = 1 ; j < n ; j++ ) (

for ( k = 1 ; k < j ; k++ ) (

for ( l = 1 ; l < k ; l++ ) (

a += j * k * l ;

if ( a > n ) goto exitpt ;

)

)

)

exitpt :

return ( a ) ;

この場合は、break文は使えません。break文を使用しても、最も内側のループが終了するだけです。ラベル

の形式は変数名と同じですが、最後にコロン(:)が付きます。ラベルは、goto文と同じ関数の内部であれば、

どの文にも付加することができます。

2.5.3 ループに関する注意点

従来のループ構造はすべてサポートしていますが、SPL はシリーズをベースとする言語です。この非常に

強力な機能により、簡潔かつ極めて高速なルーチンが作成できます。たとえば、シリーズの各要素と平均

値との差分を求めるルーチンについて考えてみましょう。従来の手法では、このコードは以下のようになり

ます。

*/ 平均値との差分を求める 遅い方法 /*

demean1 ( s )

(

outser = gser ( ) ;

n = length ( s ) ;

mn = mean ( s ) ;

for ( j = 1 ; j <= n ; j++ ) (

outser [ j ] = s [ j ] - mn ;

)

return ( outser ) ;

)

-16-

Page 23: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

このコードより、SPL の能力を活用した以下のコードの方がはるかに優れています。

*/ 平均値との差分を求める 早い方法 /*

demean2 ( s )

(

return ( s - mean ( s ) ) ;

)

SPL はシリーズベースなので 数式:s - mean(s) は、シリーズ s の各要素に自動的に適用されます。

伝統的なループの手法に慣れたプログラマの方にとっては、SPL のシリーズ処理機能は分かりにくい部分

があるかもしれません。特定の閾値を上回る要素を置換する関数は、ループを用いると以下のように記述

できます。

/* thresh 以上の値を val に置換する */

replacewith1 ( s , thresh , val )

(

n = length ( s ) ;

outser = s ;

for ( j = 1 ; j <= n ; j++ ) (

if ( outser [ j ] > thresh ) (

outser [ j ] = val ;

)

)

return ( outser) ;

)

前述の replace 関数をもとに、2進数のシリーズを使用すると、以下の極めて高速なルーチンが作成できま

す。

/* 2進数を用いた高速置換 */

replacewith2 ( s , thresh , val )

(

cond = s > thresh ;

result = s * not ( cond ) + val * cond ;

return ( result ) ;

)

最後に、異常値(所定の条件に適合しない値)を、その前後の正常値に基づく直線補間値に置き換える関

数について考えてみましょう。従来の手法では、ネストされたループと、比較的複雑なチェックおよび計算が

必要になります。SPL では、標準の DADiSP 関数を巧妙に利用することにより、以下のような高速かつエレ

ガントなコードを記述することができます。

/* 異常値の線形補間値置換 */

outlier ( s , cond )

(

return ( xyinterp ( delete ( xvals ( s ), cond ) , delete ( s , cond ) ) ) ;

)

たとえば、outlier(w1, w1 > .1)は、W1 の要素のうち、0.1 を上回るすべての要素を、前後の正常値による直

線補間値で置換します。XYシリーズは、Y値および対応する X値をシリーズから取り除くことにより作成さ

-17-

Page 24: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

れます。直線補間は、DADiSP 標準関数 xyinterp によって実行されます。異常値が連続して発生しても支

障はなく、異常値の条件は自由に設定できます。この関数は汎用的かつ高速であり、ループを必要としま

せん。

高速で簡潔な SPL 関数を記述するために、ループによってシリーズの各要素を操作するのではなく、シリ

ーズの自動処理機能を活用することをお勧めします。

2.6 SPL のホット変数

SPL には、非常に強力で、特殊な変数型が用意されています。SPL のホット変数は、DADiSP のウィンドウと

同様に、数式を変数に関連付けます。数式の従属要素が変化すると、ホット変数も自動的に再計算されま

す。ホット変数への代入には、:=演算子を使用します。以下の例をご覧ください。

svar = integ ( w1 )

hvar := integ (w1 )

標準変数 svar には、W1 を積分することによって生成されるシリーズが代入されます。これに対して、ホット

変数 hvar には、integ(w1)という数式が代入されます。hvar の値も、W1 を積分することによって生成される

シリーズです。ただし、ウィンドウ 1 の値が変更された場合、hvar の値は自動的に更新されますが、svar の

値は変化しません。

ホット変数の代入、参照には、sethotvar 関数および gethotvar 関数も使用できます。

ホット変数はグローバルなので、通常のグローバル変数とホット変数に同じ名前を付けることはできませ

ん。また、ホット変数を自動的に更新させるには、ホット変数の数式が、ウィンドウや他のホット変数に依存し

ていなければなりません。

ウィンドウと異なり、ホット変数は標準変数がサポートする任意のデータ型をとることができます。たとえば、

w1 のデータを対象とする移動平均関数の効果を検討するには、スカラ値のホット変数を設定します。

mlen := 10

w2 において、

movavg ( w1, mlen )

ここで、移動平均長を 20 に変更するため、以下の式を入力します。

mlen := 20

すると、W2 のデータが自動的に更新されます。

-18-

Page 25: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2.7 SPL のマクロプリプロセッサ

SPL では、C と同様のプリプロセッサ命令によって、ファイルの取り込み (インクルード)やマクロ置換が行え

ます。たとえば、

#include “ dsp.spl “

#define EPS 1.0e-14

は、現行の SPL ファイルに dsp.spl ファイルを取り込み、定数 EPS を定義します。これにより、EPS という表

現は、すべて 1.0e-14に置き換えられます。C と異なり、SPL のマクロはグローバルであり、セッション全体で

有効です。以下のように、引数の付いたマクロも指定できます。

#define SQR ( S ) ( S * S )

このマクロ名が使用されている箇所は、マクロの本体に置き換えられます。すなわち、

SQR ( 9 )

は、以下の式に置換されます。

( 9 * 9 )

プリプロセッサは文字どおりのテキスト置換を行うだけなので、引数付きマクロではカッコの使い方に注意

する必要があります。たとえば、以下の式、

SQR ( 9 + 1 )

の結果は、 ( 9 + 1 * 9 + 1 ) = 9 + 9 + 1 = 19

SQR マクロは、以下のように定義するとよいでしょう。

# define SQR ( ( S ) * ( S ) )

この場合、 SQR ( 9 + 1 )

の結果は、 ( ( 9 + 1 ) * ( 9 + 1 ) ) = ( ( 10 ) ) * ( ( 10 ) ) = 100

SPL では、以下のプリプロセッサ命令が使用可能です。

命令 説明

#define マクロの定義

#deffun 関数の定義

#include ファイルのインクルード

#undefine マクロの削除

-19-

Page 26: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2.8 SPL 関数についての補足

ユーザー定義関数は、複数の方法で作成できます。1 行の関数は、#deffun命令を使用することにより、コマ

ンドラインで直接的に定義できます。

#deffun 名前(引数 1, 引数 2, 引数 3, ,,,, 引数 N) 文

ここで、名前は関数名であり、引数 Nは任意の数の引数です。関数の本体(ボディ)は、文で指定します。通

常、関数の本体は引数を含んだ 1 つ以上の式で構成されます。以下に実例を記載します。

#deffun normal ( s ) return ( s / max ( s ) )

関数を呼び出すには、関数名と適当な引数を指定します。

normal ( w1 )

引数を使用しない場合は、引数リストは省略します。

#deffun minmax max - min

関数名の大文字/小文字は区別されません。また、C と異なり、関数の型(戻り値の型)は明示的に指定する

必要はありません。

複数の行からなる関数は、ASCIIファイルで定義します。関数の本体は()で囲みます。また、引数リストが存

在する場合は、このリストを ( ) で囲み、関数名の直後に配置します。

normal ( s )

(

return ( s / max ( s ) ) ;

)

以下の関数は、フィボナッチ数を格納したシリーズを作成します。

! フィボナッチ数をシリーズとして返す

fib ( x )

(

a = 0 ;

b = 1 ;

j = 1 ;

sig = gser ( 0 ) ;

while ( b < x ) (

c = b ;

b = a + b ;

a = c ;

sig [ j ] = a ;

j = j + 1 ;

)

return ( sig ) ;

)

-20-

Page 27: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

この関数は、以下のようにコンパクトに記述することもできます。

fib2 ( n )

(

j = 1 ;

f = gser ( 1, 1 ) ;

while ( f [ j ] + f [ j + 1 ] < n ) (

f [ j + 2 ] = f [ j ] + f [ j + 1 ] ;

j = j + 1 ;

)

return ( f ) ;

)

delfun 関数を使用すると、現行のセッションから関数を削除できます。

2.8.1 値の受け渡し

SPL では、C と同様に、関数の引数には値が渡されます。関数が受け取るのは、引数として指定された変

数のコピーです。したがって、関数からこの変数を直接変更することはできません。関数から見れば、それ

ぞれの引数は、関数が呼び出された時に初期化されるローカル変数です。C と異なり、この受け渡し方式

は、配列やシリーズの引数にも適用されます。唯一の例外は、[]によって各要素を明示的に参照することに

より、引数として渡された配列やシリーズを直接操作する場合です。この場合に限り、もとの配列やシリー

ズが変更されます。以下のコードをご覧ください。

double1( x )

(

x *= 2 ;

return ( x ) ;

)

double2 ( x )

(

n = length ( x ) ;

for ( j = 1 ; j <= n ; j++ ) (

x [ j ] *= 2 ;

)

return ( x ) ;

)

これらの関数は、両方ともシリーズの各要素を 2倍にします。ただし、double1 はもとのシリーズを変更しま

せんが、double2 はこのシリーズを変更します。また、double1 はスカラ値にも適用でき、処理も高速ですが、

double2 はシリーズ(配列)以外には適用できません。たとえば、

a = gser ( 1 , 2 , 3 )

とすると、

double1 ( a ) は、 2、4、6からなるシリーズを返します。

シリーズ a は、1、2、3 のままです。

-21-

Page 28: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

double2 ( a ) も、2、4、6からなるシリーズを返します。

しかし、シリーズ a は、2、4、6に変更されます。

[ ] による参照を使用し、しかも上記の例外を回避するには、引数として渡されたシリーズをいったんローカ

ル変数に代入します。

double3 ( x )

(

local_x = x ;

n = length ( x ) ;

for ( j = 1 ; j <= n ; j++ ) (

local_x [ j ] *= 2 ;

)

return ( local_x ) ;

)

2.8.2 再帰的な関数

関数は再帰的に呼び出すこともできます。すなわち、関数の内部で、その関数自体を直接的、間接的に呼

び出すことが可能です。以下に実例を記載します。

fax ( x )

(

if ( x < = 0 ) return ( 1 ) ;

else return ( x * fax ( x - 1 ) ) +

)

再帰関数が呼び出されるたびに、引数およびローカル変数のコピーが作成されます。

実数関数の根を求める古典的な問題に、再帰的実行の興味深い例を見ることができます。 f(x) = 0 を満足

する実数 x は、関数 fの根と呼ばれます。ここでは、fが実数値をとる関数であり、区間[a, b]で連続的である

と仮定します。f(a)と f(b)で符号が逆になったとすると、関数の連続性により、区間[a, b]の間に根が必ず存

在することになります。

f(a)と f(b)の符号が逆であるという条件は、f(a)と f(b)の積が負であることと等価です。2等分法は、以下のよ

うに進められます。区間の中点を m とします。f(m) = 0 であれば、根が見つかったことになります。f(m) ≠ 0

の場合は、f(a)と f(m)の符号、または f(m)と f(b)の符号が逆になるはずです。前者の場合は、区間[a, m]の間

に根が存在するので、この区間を対象に 2等分法を再び適用します(後者の場合も同様)。これが繰り返さ

れるたびに、区間が絞り込まれていきます。区間の幅が十分に小さくなったら、中点 m を fの根と解釈しま

す。

以下のコードには、任意の関数の値を求める小規模なルーチン、 feval が含まれています。再帰的実行を

利用することにより、froot のコードは極めて明瞭かつ簡潔になります。

/* fで与えられる関数名に val で与えられる値を代入して計算させる */

feval ( f , val )

(

return ( eval ( stract ( f , “ ( val ) “ ) ) ) ;

)

-22-

Page 29: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

/* インターバル[a,b]での関数 fの根を見つける */

froot ( f , a , b , eps , m )

(

m = ( a + b ) / 2.0 ; /* インターバルの中間地 */

/* 根を見つける */

if ( feval ( f , m ) == 0.0 || b - a < eps )

return ( m ) ;

/* 左エッジ */

else if ( feval ( f, a ) * feval ( f , m ) < 0.0 )

return ( froot ( f , a , m , eps ) ;

/* 右エッジ */

else

return ( froot ( f , m , b , eps )) ;

)

標準関数 eval は、渡された文字列を、コマンドラインから入力された式と同様に評価します。また、標準関

数 strcat は、2 つ以上の文字列を連結します。m はローカル変数として使用されますが、事前に定義された

マクロとの競合を避けるため、froot の引数リストの中で指定されています。このテクニックについては、後

ほど詳しく解説します。

試しに、froot を使用して、5次の多項式 p(x)の根を求めてみましょう。

p ( x )

(

return ( x ^ 5 + x + 3.0 ) ;

)

このとき、

froot ( “p”, -2 , 0 , 1e-6 ) の戻り値は、-1.13299799 になります。

ただし、

froot ( “p”, -2 , 0 , 1e-7) の戻り値は、p: Function Nested Too Deep となります。(ネストが深すぎ

ます)

これは、froot 関数の内部で、p のネストが深くなりすぎたことを意味しています。

2.8.3 引数の省略

関数を呼び出すときに、関数の本体で参照されない引数は省略されます。

func1 ( x , y )

(

if ( x < 0 ) return ( y ) ;

else return ( x ) ;

)

func1( 1 )の戻り値は、1 になります。

-23-

Page 30: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

func1( -1 ) の戻り値は、y: Unknown Variable になります。

isformal マクロを使用すると、引数の指定が省略されたかどうかがチェックできます。

optfun ( a , b )

(

/* 初期値の b は指定されていません */

if ( not ( isformal ( b ))) b = 10 ;

return ( a * 10 ) ;

)

optfun( 2 , 3 ) の戻り値は、6になります。

optfun( 2)の戻り値は、20 になります。

2.8.4 マクロとの競合の回避

SPL のマクロはセッション全体にわたって有効なので、マクロの定義と関数の変数が競合する可能性があ

ります。

#define a 10

myfun( x )

(

a = sin ( x ) + x ;

return ( a * a ) :

)

a はマクロとして定義されているので、myfun は以下のように展開されます。

myfun( x )

(

10 = sin ( x ) + x ;

return ( 10 * 10 ) ;

)

定数には値を代入できないので、このままではエラーが発生してしまいます。エラーの発生を回避するに

は、関数のローカル変数を引数リストの中に配置します。

myfun( x , a )

(

a = sin ( x ) + x ;

return ( a * a ) :

)

このようにすれば、変数 aはmyfunの公式なパラメータとして認識されるので、マクロ置換は発生しません。この関数は、通常どおりに呼び出すことができます。引数とローカル変数を区別するため、

両者の間にタブまたは数個のスペースを挿入してください。

-24-

Page 31: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

2.9 SPL 関数のコンパイル

SPL 関数は、利用する前に DADiSP にロードしておかなければなりません。そのためには、“ツール”プルダウ

ンメニューから、“SPL”-“SPL ファイルの読み込み”を選択して、該当する SPL ファイル(ソースファイル)を読

み込みます。コマンドラインを利用する場合は、splread コマンドを入力して、SPL ファイルを直接読み込みま

す。シンタックスエラーが発生しなければ、ファイル内の関数が DADiSP環境にロードされます。プログラムフ

ァイルが正常に機能することが確認されたら、splload 関数によって SPL ファイルのコンパイル版(.opl拡張子

の付いたファイル)を作成すると、ファイルのロードが大幅に高速化されます。たとえば、splload("myfun")コマ

ンドの動作は、以下のようになります。

1. 拡張子が指定されていないので、まず myfun.spl のコンパイル版、すなわち myfun.opl の読み込みを試

みます。

2. myfun.opl が存在しない場合は、myfun.spl をコンパイルして myfun.opl を作成し、このファイルをロードし

ます。

3. myfun.opl と myfun.spl の両方が存在する場合は、両者の作成日を比較します。myfun.spl の方が新しい

場合は、このファイルを再コンパイルし、それ以外の場合は myfun.opl を直接ロードします。

splcompile 関数は、SPL ファイルをコンパイルし、.opl ファイルを作成しますが、関数の DADiSP環境へのロ

ードは行いません。

.opl ファイルは、対応する.spl プログラムファイルの効率的な低レベル表現であり、特定のコンピュータプラ

ットフォームのマシン語ではありません。

2.10 SPL のエラーファイル

splread、splload、splcompile が使用するソースファイルに、シンタックスエラーが含まれており、コンパイルや

ロードに失敗した場合は、エラーファイルが作成されます。エラーファイルは、拡張子が .err であることを除

けば、ソースファイルと同名です。このファイルには、エラーが発生したルーチン名と、エラーのおよその発

生箇所が記録されます。

2.11 SPL 関数の自動ロード

DADiSP は、起動時に 2 つの SPL ファイル、すなわち dadisp.spl と system.spl を自動的に読み込みます。

system.spl ファイルには、DADiSP のユーザーインターフェースをサポートする各種のルーチンが記述され

ており、通常は変更できません。これに対して、dadisp.spl ファイルは、ユーザー定義関数のために特別に用

意されたファイルです。このファイルに#include命令を追加することにより、他の SPL ファイルを自動的にロ

ードできます。dadisp.spl ファイルはユーザー定義関数専用のファイルなので、標準のインストールでは作

成されません。このファイルは、ユーザー自身が作成する必要があります。

2.11.1 SPLMAIN関数の使用

splmain 関数が定義されている場合は、DADiSP の起動時に、この関数が自動的に呼び出されます。このユ

ーザー定義関数は、SPL ルーチンによる DADiSP のカスタマイズに利用すると便利です。たとえば、以下の

ルーチンは、最初のツールバーの 8番目の位置に、ランダム雑音を発生するカスタムボタンを配置します。

-25-

Page 32: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

splmain( )

(

toolbar ( 1 , 8 , 4 , red , “ Rand “ , Gnorm( 100 , 0.01 ) “ ) ;

)

この関数を dadisp.spl ファイルに記述しておくと、起動時に splmain が自動的に実行され、ツールバーに新

しいボタンが表示されます。カスタムボタンの作成については、toolsbar 関数を参照してください。

2.12 SPL 関数の一覧表示

“ツール”プルダウンメニューから“SPL”-“リスト関数”を選択するか、コマンドラインに functions コマンド

を入力すると、現行のセッションで使用可能な SPL 関数の一覧が表示されます。関数は定義された順に表

示されるので、最後に作成された関数がリストの先頭に表示されます。ただし、アンダースコアで始まる関

数(_myfunc など)は、リストには表示されません。これらの関数を含むすべての関数を参照するには 、

allfunctions コマンドを入力する必要があります

2.13 SPL 関数の ASCIIファイルへの書き出し

現行セッションの SPL 関数は、splwrite コマンドによってテキストファイルに保存することができます。たとえ

ば、

splwrite ( “ myfunc.spl “ , 1 , 25 )

は、functions コマンドによって作成される関数リストのうち、関数 1~関数 25を、myfunc.spl ファイルに記録

します。

-26-

Page 33: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

SPL コマンド一覧

以下の表に、SPL に関連する関数を記載します。

関数 説明

ALLFUNCTIONS 現行セッションのすべての関数を表示する。

ALLVARIABLES 現行セッションのすべての変数を表示する。

DELALLFUNCTIONS 現行セッションのすべての関数を削除する。

DELALLVARIABLES 現行セッションのすべての変数を削除する。

DELFUN 現行セッションの特定の関数を削除する。

DELVARIABLE 現行セッションの特定の変数を削除する。

FUNCTIONS アンダースコアで始まる関数を除く、すべての関数を表示す

る。

GETHOTVARIABLE ホット変数の値を取得する。

GETLOCALVARIABLE ローカル変数の値を取得する。

GETVARIABLE グローバル変数の値を取得する。

SETHOTVARIABLE ホット変数の数式を設定する。

SETLOCALVARIABLE ローカル変数の値を設定する。

SETVARIABLE グローバル変数の値を設定する。

SPLCOMPILE SPL ファイルを OPL ファイルにコンパイルする。

SPLLOAD SPL ファイルをコンパイルし、現行セッションにロードする。

SPLREAD SPL ファイルを現行セッションにロードする。

SPLWRITE SPL 関数を ASCIIファイルに書き出す。

VARS アンダースコアで始まる変数を除く、すべての変数を表示す

る。

-27-

Page 34: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

3章  DADiSP のマクロ

マクロは、DADiSP ワークシートの関数や他のマクロを組み合わせることで作成されるユーザー定義関数

です。DADiSP のマクロは単純な置換テキストであり、数値や計算結果を保存するのに使用されます。

マクロは、単純なコマンド文字列のこともあれば、非常に複雑な数式のこともあります。非常に複雑なマクロ

は、実際には小規模な「プログラム」です。この章では、マクロの作成および使用について解説します。この

章には、以下の情報が記載されています。

・マクロの作成

・マクロの編集

・マクロの保存

・マクロファイルの利用

3.1 マクロの作成

マクロ定義は、マクロ名、マクロの実行に必要な引数、およびマクロ拡張 (マクロの本体)で構成されます。た

とえば、以下のマクロは、移動平均を使用して、シリーズの平滑化を行います。

SMOOTH ( S ) MOVAVG( S , CEIL ( 0.1 * LENGTH ( S )))

この例では、マクロ名は SMOOTH です。引数リストには、ただ 1 つの引数、すなわち S が含まれています。

MOVAVG(S,CEIL(0.1*LENGTH(S)))の部分は、マクロ拡張です。このマクロは、窓のサイズがシリーズ長の

10 分の 1(整数に四捨五入)の移動平均を実行して、データシリーズを平滑化します。SMOOTH マクロを使

用するには、以下のコマンドを入力します。

SMOOTH ( W1 )

マクロは、テキスト置換にすぎないことに注意してください。ワークシートのコマンドラインに SMOOTH(W1)

とタイプすることは、以下の文字列をタイプすることと等価です。

MOVAVG( W1, CEIL( 0.1 * LENGTH( W1 )))

マクロでは、10 個までの引数を指定できます。引数の名前やデータ型に制約はありません。ただし、引数の

省略は認められません。マクロ名は最大 15文字です。マクロ定義は 1 行に制限されます。すなわち、マクロ

名、引数リスト、およびマクロ拡張の合計文字数(スペースを含む)は、255文字以下でなければなりません。

3.1.1 “ツール”プルダウンメニューを用いたマクロ定義

DADiSP のセッションでは、マクロを様々な方法で定義できます。Tools プルダウンメニューからマクロを定

義するには、以下の手順を実行します。

1. “ツール”-“マクロ”-“マクロファイル新規作成”を選択します。

2. マクロ名、引数、数個のスペース、およびマクロ拡張を入力して、改行キーを押します。

3. 定義するマクロの名前を入力して、拡張子を*.mac にし保存します。

-28-

Page 35: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4. “ツール”-“マクロ”-“マクロファイルを読み込む”を選択します。

例:

ここでは、引数を 1 つだけ受け取り、その 2乗を返すマクロ、SQUAREVAL を定義することにします。

“ツール”-“マクロ”-“マクロファイルの新規作成”を選択すると、空のテキストファイルが開きます。

そのテキストファイルに、以下の文字列を入力して、改行キーを押します。

SQUAREVAL( a ) ( a ) ^ 2

このダイアログボックスにマクロ名、SQUAREVAL.mac を入力し、保存します。

“ツール”-“マクロ”-“マクロファイルを読み込む”を選択します。

このマクロを使用するには、以下のコマンドを入力します。

SQUAREVAL( 10 )

改行キーを押すと、画面の下部に値 100 が表示されます。

SQUAREVAL( W1 )

は、W1 の各点を 2乗したシリーズを返します。

3.1.2 コマンドラインでの#DEFINE文の使用

マクロを定義する別の方法として、DADiSP のコマンドラインで#DEFINE文を使用することもできます。

#DEFINE コマンドのフォーマットは、以下のとおりです。

#DEFINE name ( agr1, arg2, . . . . , argn ) expansion

ここで、

name は、マクロ名です(最大 15文字)。

argn は、引数です(n ≦ 10)。

expansion は、引数を含む数式です。この数式は、マクロが呼び出された時に評価されます。

マ ク ロ定義は 1 行 に制限さ れ ま す 。 た と え ば 、 シ リ ー ズ から DC オフセッ ト を除去す る マ ク ロ

"REMOFFSET"は、以下のように記述できます。

#DEFINE REMOFFSET( S ) ( S ) - MEAN ( S )

引数 S には、シリーズを返す任意の数式が指定できます。REMOFFSET は、以下のように有効なワークシ

ート関数として使用できます。

REMOFFSET( W2 )

-29-

Page 36: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

マクロは引数をとるとは限りません。たとえば、ウィンドウの表示色は、以下のマクロで定義できます。

#DEFINE MYWAY WINCOLOR( BLACK , GREEN )

単に"MYWAY"とタイプするだけで、ウィンドウの色が設定されます。

また、定数マクロも定義可能です。

#DEFINE SIGGAIN 10

3.1.3 コマンドラインでの DEFMACRO文の使用

コマンドラインでマクロを定義するもう 1 つの方法として、DEFMACRO 関数を使用する方法があります。

DEFMACRO 関数のシンタックスは、#DEFINE文とは多少異なります。

DEFMACRO( “ name( arg1, arg2, . . . , argn )” , “ expansion” , quote_type )

ここで、

name は、マクロ名です(最大 15文字)。

argn は、引数です(n ≦ 10)。

expansion は、引数を含む数式です。この数式は、マクロが呼び出された時に評価されます。

quote_type は、結果の前後に配置する引用符の種類を表す整数です(1=引用符なし、2=シングルクオート、

3=ダブルクオート)。

たとえば、定数 MyMultiplier を定義するには、

DEFMACRO( “ MyMultiplier “ , 15 , 1 )

MyMultiplier は、定数 15として定義されます。W1*MyMultiplier とタイプすると、W1 の各要素を 15倍したシ

リーズが返されます。

以下の例では、関数の結果が定数として定義されます。

DEFMACRO( “ MyConstRMS” , RMS( curr ) , 1 )

MyConstRMS とタイプすると、現行ウィンドウの RMS値が返されます。MyConstRMS は、マクロシートでも

定数として定義されます。したがって、別のウィンドウに移動し、MyConstRMS とタイプした場合にも、そのウ

ィンドウのシリーズに関係なく、ステータス行に先ほどと同じ値がエコーバックされます。

ウィンドウに依存し、呼び出すたびに計算されるマクロを定義するには、数式を引用符で囲みます。

DEFMACRO( “ MyConstRMS” , “ RMS( curr ) ” , 1 )

w1 に移動し、MyRMSVal とタイプすると、W1 の RMS値が返されます。W2 に移動し、同様に MyRMSVal とタ

イプすると、W2 の RMS値が返されます。

DEFMACRO 関数の 3番目の引数、quote_type は、文字列マクロの定義を可能にします。

-30-

Page 37: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

例:

DEFMACRO( “ Dt “ , getdate( curr ) , 2 )

コマンドラインで Dt とタイプすると、ステータス行にシリーズの取得 (作成)日が表示されます。マクロシート

では、この日付はシングルクオートで囲まれた文字列('1-20-1986'など)として定義されます。

Dt を以下のように定義すると、

DEFMACRO( “ Dt “ , getdate( curr ) , 1 )

取得日が 1986年 1 月 20日だとすると、Dt は 1-20-1986として定義されます(引用符は付きません)。この

場合には、コマンドラインで Dt とタイプすると、ステータス行に-2005が表示されてしまいます(1-20-1986 =

-2005)。これで、引数 quote_type の重要性がご理解いただけたと思います。この引数によって、マクロの定

義、解釈の方法が違ってきます。

3.1.4 マクロのネスティング

マクロ定義の中で他のマクロを参照する、すなわち、マクロをネスティングすることが可能です。

複雑なマクロを、手順ごとに小規模なマクロに分割すると、「メインのマクロ」の構築、動作チェック、および判

読が容易になります。また、この小規模なマクロを、他のマクロから参照することも可能になります。

メインのマクロおよび個々のマクロでのネスティングの実例を、以下のコードに示します。 LEFTC および

RIGHTC は、指定のウィンドウの左端および右端のカーソルを検出します。DISTC は、これらのカーソルの間

に存在するデータポイント数を計算します。メインのマクロ、EXTRACTC は、指定のウィンドウのシリーズのう

ち、これらのカーソルで挟まれた部分(カーソル位置を含む)を抽出します。

LEFTC( WIN ) FLOOR( MIN( GSER( CURPOS( WIN ), CURPOS2( WIN ))))

RIGHTC( WIN ) FLOOR( MAN( GSER( CURPOS( WIN ), CURPOS2( WIN ))))

DISTC( WIN ) FLOOR( ABS( CURPOS( WIN )-CURPOS2( WIN )))

EXTRACTC( WIN ) EXTRACT( WIN, LEFTC( WIN ), DISTC( WIN ) + 1 )

サブマクロとネスティングのテクニックを使用しないとすると、EXTRACTC(WIN)のマクロ拡張は以下のよう

に定義しなければなりません。

BIGEXTRACT( WIN ) EXTRACT(WIN, FLOOR( MIN( GSER( CURPOS( WIN ), CURPOS2( WIN

)))), FLOOR( ABS( CURPOS( WIN )-CURPOS2( WIN )) + 1 )

上記のマクロ拡張は複数行にわたって記述されていますが、ワークシートでは、このテキストを 1 行でタイ

プしなければなりません。

マクロは単なる置換テキストなので、実行される前に DADiSP内部で完全に展開されます。マクロは以下

の 2段階の手順で処理されます。まず、マクロおよびサブマクロが完全に展開され、パージング(構文解析)

され、コンパイルされます。その後で、数式全体が実行されます。

マクロの直接的、間接的な再帰的実行は不可能です。すなわち、マクロ定義の中で、自分自身を参照する

ことはできません。これを行うと、定義の段階ではエラーにはなりませんが、マクロが使用されるときにエラ

ーが発生します。

-31-

Page 38: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

3.1.5 マクロの変数としての使用

マクロは本当の意味での変数ではありませんが、DADiSP の関数の助けを借りることにより、スカラ変数と

して動作させることができます。前述の DEFMACRO 関数は、マクロにスカラ値を「代入」します。これに対し

て、EVAL 関数はマクロの値を返します。

DADiSP の入力コマンドは、本来は 2段階に分けて処理されます。すなわち、数式はまず展開、パージング、

コンパイルされ、その後で評価されます。EVAL 関数は、マクロの展開を評価段階まで遅らせます。これによ

り、最新かつ適切な値が利用可能になります。

下記のマクロ、MyExtract は、「マクロ変数」N_PTS を定義し、この値を使用して、指定のウィンドウからデー

タシリーズを抽出します。

MyExtract( WIN ) DEFMACRO(“N_PTS”, 25, 1 ) ; EXTRACT( WIN, 1, N_PTS)

MyExtract(W1)の実行結果は、ワークシートで N_PTS マクロが定義済みかどうかによって異なります。N_PTS

マクロが事前に定義されていない場合は、N_PTS: Unknown Variable というエラーメッセージが返されます。こ

のエラーの原因は、MyExtract マクロの本体が、展開、評価という 2段階の手順で処理されることにあります。

DADiSP は、展開の段階で、EXTRACT文の N_PTS を置換しようとしますが、この段階では N_PTS は定義され

ていません。これに対して、N_PTS マクロが定義済みの場合、たとえば、75という値に定義されている場合は、

この事前に定義された値が、EXTRACT文のデータポイント数として使用されてしまいます。この状況を改善

するには、以下のように EVAL文を使用して、N_PTS の置換を評価段階まで遅らせます。

MyExtract( WIN ) DEFMACRO(“N_PTS”, 25, 1 ) ; EXTRACT( WIN, 1, EVAL( “ N_PTS” ))

3.2 マクロの一覧表示

“ツール”プルダウンメニューから、“マクロ”-“マクロのリスト”を選択すると、現行のワークシートで使用可

能なマクロの一覧が表示されます。このリストは、マクロ名、引数、および本体 (マクロ拡張)の一覧表です。

マウス、[↑]/[↓]キー、および[Page Up]/[Page Down]キーを使用することにより、マクロシート上の強調表

示部分を任意の位置に移動できます。

-32-

Page 39: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

マクロシートは、FILO(First In, Last Out)順のリストです。新たにマクロを定義すると、このマクロが先頭に表

示され、定義済みのマクロはすべて下方向にずらされます。特定のマクロの表示位置を変更するには、移

動先の 1 行下にカーソルを合わせ、[Insert]キーを押し、マクロ名をタイプして、改行キーを押します。これに

より、マクロシートが更新され、指定のマクロ(その引数と本体を含む)が指定の位置に移動します。

3.3 マクロの編集

定義済みのマクロは、編集することができます。マクロの編集手順は以下のとおりです。

1. “ツール”プルダウンメニューから、“マクロ”-“マクロを開く”を選択します。

2. マウスまたは矢印キーを使用して、編集するマクロを選択します。OK をクリックすると、このマクロがテ

キストファイルに表示されます。

3. マクロ拡張を編集します。上書き保存後、マクロをロードします。

3.4 マクロファイルの利用

アプリケーション用に多数のマクロを作成する場合は、これらのマクロをマクロファイルで定義すると便利

です。マクロファイルは、マクロ名、引数リスト、およびマクロ拡張を記録した ASCIIテキストファイルです。こ

のファイルには、マクロの使用法についてのコメントも記録できます。macrosサブディレクトリには、DADiSP

に付属のマクロファイルが多数収録されています。このセクションでは、マクロファイルの作成、読み込み、

書き出し、および取り込み(インクルード)について説明します。

3.4.1 マクロファイルの作成と編集

新しいマクロファイルを作成するには、“ツール”プルダウンメニューから、“マクロ”-“マクロファイル新規

作成”を選択します。これにより、エディタが起動し、空白のファイルがオープンします。既存のマクロファイ

ルを編集する場合は、“ツール”プルダウンメニューから、“マクロ”-“マクロファイルを開く”を選択します。

ダイアログボックスでドライブ、ディレクトリ、およびファイル名を選択すると、このファイルを対象とするエデ

ィタが起動します。

-33-

Page 40: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

マクロファイルは ASCIIテキストファイルなので、任意のワードプロセッサやテキストエディタで作成するこ

とが可能です。マクロファイルでは、DADiSP のコマンドラインと同様に、各行にマクロ定義を 1 つずつ記述

します。ただし、マクロ定義の先頭の文字列、#DEFINE は必要ありません。マクロファイルの各行は、以下の

ようになります。

SMOOTH( S ) MOVAVG( S , 6 )

ファイルのサイズに制限はありません。また、各行の任意の位置に、感嘆符 (!)に続けてコメントを記述する

ことができます。空白行は無視されます。ファイルから読み込まれるマクロには、ワークシートとともにロード

されるマクロと同様の優先規則が適用されます。すなわち、ファイルから読み込まれたマクロは、同名の既

存のマクロを上書きします。

3.4.2 マクロファイルの読み込み

マクロファイルを読み込んで、ワークシートにマクロ定義をロードするには、“ツール”プルダウンメニューか

ら、“マクロ”-“マクロファイルの読み込む”を選択します。ダイアログボックスが表示されたら、読み込むマ

クロファイル名を選択して、OK をクリックします。

-34-

Page 41: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

このほか、MACREAD コマンドを使用することにより、ディスク上のマクロファイルを現行のワークシートにロ

ードすることもできます。たとえば、"tables.mac"ファイルに行列操作マクロが記録されているとすると、

MACREAD( “ tables.mac “ )は、"tables.mac"のすべてのマクロを、現行のワークシートに再ロードします。

3.4.3 マクロファイルの書き出し

現行のワークシートの全マクロをマクロファイルに保存するには、“ツール”プルダウンメニューから、“マク

ロ”-“マクロの保存”を選択します。表示されたダイアログボックスで、ドライブ、ディレクトリ、およびファイル

名を指定すると、このファイルにワークシートの全マクロが書き出されます。

MACWRITE コマンドは、ワークシートの一部または全部のマクロを、外部ファイルに書き出します。このコマ

ンドでは、ファイルに書き出す最初のマクロと最後のマクロを、インデックス番号で指定することができます。

3.4.4 マクロファイルの取り込み(インクルード)

作成したマクロが増えてきたら、#include文を使用することによって、マクロファイルの内容を別のマクロフ

ァイルに取り込むと便利です。マクロファイルに以下のような行を記述することは、

#include macros\series.mac

上記の#include文で指定されたファイルを、このファイルに実際にコピーすることと同じです。ただし 、

#include文は行の先頭に記述しなければなりません。

3.5 マクロの有効範囲(スコープ)、優先度、持続性

マクロはワークシートの内部に保存されます。ディスクからワークシートをロードすると、そのワークシートで

定義されたマクロが、ワークシートとともに読み込まれます。ただし、これには 1 つだけ例外があります。アン

ダースコア(_)で始まるマクロは、一時的なマクロであり、ワークシートには保存されません。

DADiSP のセッションが同じであれば、マクロはワークシートからワークシートへと継承されます。すなわち、

現行のワークシートで定義されたマクロは、セッションが終わるまで有効であり、別のワークシートをロードした

場合は、このワークシートに組み込まれます。新たにロードしたワークシートに、既存のマクロと同名のマクロが

含まれている場合は、既存のマクロが上書きされます。警告メッセージは表示されません。

新規のワークシートを作成すると、事前定義マクロが自動的にロードされます。ワークシートを保存すると、

現行のマクロリストが、ワークシートの必須データとして保存されます。新しく作成したマクロは、現行のワ

-35-

Page 42: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

ークシートのマクロリストに追加されます。ただし、ユーザーが定義したマクロは、現行のセッションの間に

保存したワークシートだけに記録されるので、このマクロを別のセッションで利用するには、このワークシー

トをロードしなければなりません。マクロ定義のディスクへの書き出しについては、「マクロファイルの利用」

をご覧ください。

3.5.1 DADiSP の事前定義マクロ

DADiSP には、事前定義マクロが用意されています。この中には、標準関数と同様に DADiSP に内蔵されて

いるものもあれば、起動時にファイルから自動的に読み込まれるものもあります。system.mac ファイルのマク

ロは、起動時に自動的に読み込まれ、DADiSP のメニューシステムと連携して、標準的な分析やアプリケーシ

ョン制御を行います。system.mac ファイルのマクロは編集しないでください。

DADiSP には、下記のマクロファイルが付属しています。これらの ASCIIファイルには、ワークシートで使用

可能な各種のマクロが記録されています。各マクロの説明は、マクロファイルの内部に記述されています。

これらの付属マクロファイルは、macrosサブディレクトリに保存されています。

3DPLOT.MAC‐3D プロット用のマクロが記録されています(ウォーターフォールスペクトルプロット、XYグリ

ッド、ソンブレロなど)。

BITS.MAC‐ビット演算/数値演算用のマクロが記録されています(ビットの抽出、10進数/非 10進数の桁の

抽出、符号付き整数/符号なし整数の相互変換、8進数/10進数/16進数の相互変換、バイト/16 ビット整数/

32ビット整数の相互変換、バイト/浮動小数点数の相互変換、バイトの畳み込みなど)。

CURSOR.MAC‐カーソルを使用して、シリーズの抽出、ズーミング、データポイントの抽出を行うマクロが記

録されています。

FIND.MAC‐所定の条件に適合する値を検索したり、シリーズの中に埋め込まれた別のシリーズを検索し

たりするマクロが記録されています。

FREQ.MAC‐FFT に関するマクロが記録されています(畳込みおよび相関用の周波数領域マクロ、スペクトル

密度およびコヒーレンス用の時間領域/周波数領域マクロ、群遅延、FFT のパディング、2 次元 FFT など)。

LOOP.MAC‐一般的なループ操作用のマクロが記録されています。

MATRIX.MAC‐基本的な行列演算用のマクロが記録されています(行、列、および行列全体の統計情報の

算出、Toeplitz行列および Vandermonde 行列の生成、行列の整形など)。

MISC.MAC‐様々なマクロが記録されています(量子化、複素数シリーズ、精度、条件、ファイル出力など)。

PEAK.MAC‐ピーク分析用のマクロが記録されています。

POLARPLT.MAC‐極座標におけるプロットと面積計算を行うマクロが記録されています。

SERIES.MAC‐基本的なシリーズ演算用のマクロが記録されています(インデックスと X値の相互変換、X

値に基づくデータポイントの抽出、積および絶対値の算出、直線の生成、シリーズの右または左へのラッピ

ング、シリーズまたは定数の埋め込みなど)。

STRING.MAC‐文字列と ASCIIコードを変換するマクロが記録されています。

TIMEDATE.MAC‐時刻および日付を各種のフォーマットに変換するマクロが記録されています。

WINDOW.MAC‐Blackman ウィンドウおよびフラットトップウィンドウを用いてシリーズを生成、乗算するマク

ロが記録されています。

XYSERIES.MAC‐XYシリーズの回帰、ビニング、領域用のマクロが記録されています。

-36-

Page 43: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

3.5.2 起動時のマクロのロード

DADiSP のセッションを開始すると、ワークシートに system.mac ファイルおよび dadisp.mac ファイルが読み

込まれます。system.mac ファイルは製品に付属しています。このファイル中のマクロは、DADiSP のメニュー

システムと連携して、標準的な分析やアプリケーション制御を行います。system.mac ファイルのマクロは編

集しないでください。dadisp.mac ファイルは、ユーザーが作成するファイルであり、製品には付属していませ

ん。このファイルによって、起動時にロードするマクロを指定することができます。起動時に自動的にロード

するマクロは、dadisp.mac ファイルに直接記述するか、#include文によってこのファイルにインクルードして

ください。

3.6 マクロコマンド一覧以下の表は、オープン中のワークシートで使用可能なマクロコマンドの一覧です。これらのコマンドの詳細につ

いては、DADiSP Function Reference Manual を参照してください。

マクロコマンド 説明

#DEFINE マクロを定義する。

#UNDEFINE マクロを削除する。

#UNDEFALL 現行のワークシートのマクロリスト全体を削除する(このコマンドは、現行

のワークシートだけに適用されます)。

#DEFAULT system.mac ファイルおよび dadisp.mac ファイルを使用して、マクロを再初

期化する。

MACROS 現行のワークシートのマクロリストを表示し(アンダースコアで始まるマク

ロを除く)、マクロ定義の編集を可能にする。

ALLMACROS 現行のワークシートのマクロリストを表示し(アンダースコアで始まるマク

ロを含む)、マクロ定義の編集を可能にする。

DEFMACRO マクロを定義する。(このコマンドの動作は、#DEFINE とまったく同じです。

ただし、このコマンドは、ワークシートから得られるスカラ定数の定義、保

存に使用できます。)

MACREAD 外部ファイルのマクロ定義を、現行のワークシートに読み込む。

MACWRITE ワークシートのマクロリストの一部または全部を外部ファイルに書き出す。

-37-

Page 44: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4章  DADiSP メニューの作成

DADiSP のメニューシステムを活用すれば、詳しい操作を習得しなくても操作することが可能な、洗練され

たカスタムアプリケーションが作成できます。

メニューは単なる ASCIIテキストファイルです。使用可能な文字に制限はありません。したがって、メニュー

に表示する情報を、そのまま記述することが可能です。メニューからは、DADiSP の関数、マクロ、およびコマ

ンドファイルに自由にアクセスできます。メニューから別のメニューを呼び出したり、メニューごとに専用のヘ

ルプファイルを設けることもできます。メニューを使用して、新たなメニューを構築することさえ可能です。

DADiSP の メ イ ン メ ニ ュ ー は 、 automenu.men フ ァ イ ル に 記録さ れ て い ま す 。 コ マ ン ド ラ イ ン で

MENUFILE( “automenu.men” )と入力すると、このメニューが呼び出されます。automenu.men ファイルを編

集することにより、ユーザー自身の「メインメニュー」が作成できます(オリジナルの automenu.men ファイル

はバックアップしておいてください)。さらに、カスタムメニューファイルを呼び出すツールバーボタンを作成

することもできます。

この章には、以下の情報が記載されています。

・メニューの呼び出し

・カスタムメニューの作成

・メニューファイルオプション

・メニューコマンドとキーワードの使用

4.1 メニューの呼び出し

4.1.1 MENUFILE コマンドの使用

メニューを呼び出すには、MENUFILE コマンドを使用します。メニューファイル名が判明している場合は、コ

マンドラインに以下のコマンドを入力します。

MENUFILE( “menuname.men” )

たとえば、メインメニューを呼び出すには、以下のコマンドを入力します。

MENUFILE (“automenu.men” )

注意) メニューファイルの読み込みに失敗した場合は、サブディレクトリを指定してみてください。以下に、実

例を記載します。

MENUFILE ( “subdirectory\menuname.men” )

-38-

Page 45: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4.1.2 ツールバーボタンの使用

カスタムツールバーボタンを作成して、メニューを呼び出すこともできます。たとえば、ツールバーからシリー

ズの統計情報にアクセスするには、以下の設定を行います。まず、Tools プルダウンメニューから、“ツール”

-“ツールバー”-“ボタンを加える”を選択します。表示されたダイアログボックスで、ボタン番号、表示色、

ラベル、メッセージ、およびコマンドを指定します(次図参照)。OK をクリックすると、このボタン("Stats"ボタン)

がツールバーに表示されます。シリーズが含まれているウィンドウに移動し、"Stats"ボタンをクリックすると、

そのシリーズの統計情報が表示されます。

4.1.3 メニュー項目の選択

メニューがポップアップすると、カーソルが最初のメニュー項目に自動的に移動します。別のメニュー項目

に移るには、[↑]/[↓]キーまたはマウスを使用します。所定の項目をダブルクリックするか、改行キーを押

してください。キャンセルボタンまたは右マウスボタンを押すと、メニューが消去されます。

ダイアログボックスやパネルメニューでは、[Tab]キーを押すことにより、別のフィールドに移ることができま

す。

4.2 カスタムメニューの作成

カスタムメニューはテキストエディタで作成します。たとえば、UNIXでは vi や emacs、MS-Windows(TM)では

Notepad などが利用できます。OKボタン、Cancelボタン、および Helpボタンは、自動的に用意されます。

例:

テキストファイル、simple.men に、以下の内容を記述します。

最大値 ~max

最小値 ~min

このファイルをメニューファイルとして使用すると、MINコマンドまたは MAXコマンドの実行が可能になりま

す。コマンドの実行結果は、画面下部のステータス行に表示されます。メニューファイルの最後のテキスト

行に、改行コード(キャリッジリターン)を付けることを忘れないでください。

-39-

Page 46: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4.2.1 テキストと特殊文字

先ほどのサンプルメニューファイルを使って、メニューの構成を詳しく見ていくことにしましょう。DADiSP のメ

ニューは、テキストと特殊文字(キーワード)で構成されます。前述のサンプルでは、最大値、max、最小値、

min がテキストであり、ティルデ( ~ )が特殊文字です。

メニューの概念は極めて単純です。

ティルデ( ~ )までのテキストは、ポップアップメニューに「そのまま」表示されます。

ティルデ( ~ )以降のテキストは、該当するメニュー項目が選択されたときに実行されるコマンドで

す。このテキストは、メニューには表示されません。

ユーザーがメニュー項目を選択すると、ティルデ( ~ )以降のコマンドが実行され、画面上のメニュ

ーが消去されます。

メニューファイルは、ティルデ( ~ )を境に 2 つの部分に分割されます。すなわち、ティルデ( ~ )の前はメニュー

に表示されるテキストであり、ティルデの後ろはメニューが選択されたときに実行されるコマンドです。

注意) メニューファイルの最下行の行末に、改行コード(キャリッジリターン)を必ず付けてください。

4.2.2 コメントの埋め込み

以下のメニューファイルは、先ほどより多少複雑です。このメニューは、MENUFILE("simple.men")コマンドを

実行することにより呼び出されます。

! Simple.men

! menu1

タイトル付きメニュー

-------------

最大値 ~max

最小値 ~min

レンジ ~max-min

このファイルの最初の 2 行は、感嘆符(!)で始まります。!で始まるテキスト行は、コメント行として解釈されま

す。この行の!から行末までのテキストはすべて無視され、メニューにも表示されません。

4.2.3 表示行の埋め込み

ティルデ( ~ )や感嘆符( ! )が含まれていない最初の行は、メニューのタイトルになります。タイトルは、メニュ

ー上部のラベル部分に表示されます。これ以降の行(行頭が感嘆符でないもの)は、すべてメニューに表示

されます。

ティルデ( ~ )が含まれていない行は、選択することはできません。この行は、単なる表示テキストととして取

り扱われます。

先ほどの例では、ティルデ( ~ )が含まれていない行は、"A Simple Menu"および"____________"の 2 つです。こ

れらはコメント行ではない( ! が使われていない )ので、表示テキストになります。カーソルを動かしても、こ

の 2 つの行が強調表示されることはありません。カーソルは、ティルデ( ~ )が含まれている行だけに移動し

ます。

-40-

Page 47: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4.2.4 メニューのネスティング

メニューから別のメニューを呼び出すこともできます。このテクニックは、「メニューのネスティング」と呼ばれ

ます。以下に、この例を記載します。

! Simple.men

! menu2

ネスト メニュー

-------------

最大値 ~max

最小値 ~min

レンジ ~max-min

詳細 ~menufile(“moreinfo.men”)

ユーザーが 詳細 を選択すると、コマンド MENUFILE("moreinfo.men")が実行され、新たなメニューがポップ

アップします。

4.2.5 マクロからのメニューの呼び出し

以下のマクロを作成すると、

#DEFINE M MENUFILE(“SIMPLE.MEN”)

M に続けて改行キーを押すことにより、先ほどのメニューが表示されます。

4.2.6 カスタムヘルプファイルの指定

メニューやパネルには、ユーザーが定義したヘルプ情報を付加することができます。これを行うには、キー

ワード@h を使用します。たとえば、パネルの定義に以下の行を組み込むと、

@h panel.hlp

"panel.hlp"が、このパネルのヘルプファイルとして登録されます。メニューファイルの先頭に同様の行を追

加すると、このメニューに Helpボタンが自動的に追加されます。Helpボタンをクリックするか、[F1]キーを押

すと、指定のヘルプファイルがポップアップします。

ヘルプファイルは、Helpボタンを通じてアクセスされる点を除けば、通常の ASCIIテキストファイルです。こ

のため、DADiSP の高機能なメニュー作成テクニックを自由に適用できます。たとえば、ヘルプファイルのネ

スティングや、対話型ヘルプの作成などが可能です。

4.3 メニューファイルオプション

メニューファイルに制御文字を組み込むことにり、メニューの動作を指定することが可能です。具体的には、

以下の動作を制御するキーワードおよび特殊文字が用意されています。

・メニューの表示位置

・表示形式(レポートパネルまたは情報パネル)

-41-

Page 48: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

・ユーザー入力の受け入れ

・ユーザーに提供するトグルオプションやリストボックスオプション

・メニューに関連付けるヘルプファイル

・メニュー表示するデフォルト値

キーワードは@で始まる文字列であり、メニューファイルの先頭で指定します。詳細については、以下の記

述をご覧ください。

4.3.1 メニューの表示位置

ポップアップメニューは、デフォルトでは画面の中央に表示されますが、キーワード@x および@y を使用す

ることにより、表示位置を指定することもできます。原点、すなわち座標(x=0, y=0)は、画面の左上の角に相

当します。画面は 80桁(x)×24行(y)なので、右下の角の座標は(x=80, y=24)になります。たとえば、以下の

simple.men メニューは、画面の左から 2文字目、上から 4文字目に配置されます。

! Menu3 :

@x2

@y4

位置指定メニュー

-----------

最大値 ~max

最小値 ~min

レンジ ~max-min

詳細 ~menufile(“moreinfo.men”)

表示位置を@x0 および@y0 で指定したメニューは、他にメニューが表示されていなければ画面の左上に配

置されますが、既に他のメニューが表示されている場合は、そのメニューの右下に重ねて配置されます。つ

まり、このメニューは積み重ねて(カスケード状に)表示されます。メニューをネスティングする場合は、各メニ

ューの位置を@x0 および@y0 で指定するだけで、これらのメニューをカスケード表示することができます。

4.3.2 レポート形式によるメニュー表示

メニューは、情報の表示にも使用できます。メニューがポップアップすると、 { } で囲まれた数式が自動的に

計算され、その結果(スカラ値または文字列)が表示されます。たとえば、前述のメニューの ~ を { } に置き換

えると、

! Menu 4

レポート形式

-------------------

最大値 {max}

最小値 {min}

レンジ {max-min}

詳細 ~menufile(“moreinfo.men”)

メニューに現行のウィンドウの最大値、最小値、およびデータ範囲が表示されます。選択可能なメニ

ュー項目は、"More Info"だけになります。

-42-

Page 49: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4.3.3 情報のテキストファイルへの保存

メニューの表示中に[ALT]-[P]を押すと、メニューの表示情報がテキストファイルに保存されます。プロンプトで格納先のファイル名を指定してください。

4.4 ユーザー入力の受け付け

カスタムメニューは、様々な方法でユーザー入力を受け付けることができます。ダイアログボックスやパネ

ルメニューでは、フリーフォーマットのテキスト入力が可能であり、ドロップダウンリストボックスやポップアッ

プメニューでは、あらかじめ定義された選択肢の中から選択が行えます。メニューを作成する場合には、こ

れらの機能を自由に利用できます。以下のセクションでは、ユーザー入力の受け付け手段について解説し

ます。

4.4.1 ダイアログボックスとメニューパネル

ダイアログボックスやメニューパネルには、複数の入力項目を設けることができます。メニューパネルは特

殊なメニューであり、ユーザーが必要な入力を終えるまで画面に表示され続けます。メニューパネルやダイ

アログボックスの各入力項目は、INPUT 関数またはトグル選択機能によって設定されます。すべての入力

を終えて、OKボタンをクリックすると、パネルの内容が確定し、メニューの実行部分に記述された文が評価

され、このメニューが画面上から消去されます。

メニューをパネルメニューやダイアログボックスとして機能させるには、メニューファイルの先頭に特殊なキ

ーワード、@panel を埋め込みます。このメニューは、ユーザーが OKボタンまたは Cancelボタンをクリックす

るまで表示されたままになります。

! Menu 5

@panel

@x2

@y4

パネル メニュー

--------------

波形生成 < > ~ < >(100, 0.1) ~ <GRANDOM><GNORMAL>

4.4.2 ドロップダウンリストボックス

ドロップダウンリストボックスを利用すると、メニューの選択が容易になります。入力フィールドの隣に付加さ

れた下向き矢印ボタンを、左マウスボタンでクリックすることにより、複数の選択肢が表示されます。

Menu 5の"波形生成"行を見てください。

この行は、ティルデ(~)によって 3 つの領域に分割されています。各領域は以下のとおりです。

1 2 3

波形生成 < > ~ < >(100, 0.1) ~ <GRANDOM><GNORMAL>

表示領域 数式領域 入力領域

1. 最初のセクション、表示領域は、画面に表示される文字列です。<>の間のスペース数により、表示される

-43-

Page 50: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

入力フィールドの長さが決定されます。

2. 2番目のセクション、数式領域は、DADiSP に渡される数式です。このセクションは動的に作成され、3番

目のセクションからの選択肢が格納されます。<>の間のスペース数は重要な意味を持ちません。ただし、

少なくとも 1 個のスペースを挿入しておく必要があります。ユーザーが所定の入力を終えて、パネルが

評価されると、リストボックスで最後に選択された値が、この数式に代入されます。

3. 3番目のセクション、入力領域は、入力項目の記述部分です。ダイアログボックスのリストボックスまた

はフィールドをクリックすることにより、ユーザーがこの行を選択すると、この部分が評価されます 。

INPUT 関数は、入力媒体として機能します。Menu 5では、リストボックスから選択を行うことができます。

ドロップダウンリストボックスの表示項目は、他の項目と異なり、<>で囲みます。この例では、最初の項目

がデフォルトの選択肢になります。

リストボックスの矢印ボタンをクリックすることにより、GRANDOM または GNORMAL のどちらかを選択でき

ます。選択の結果は、メニューに表示されます。たとえば、GNORMAL を選択して、OKボタンをクリックしたと

すると、数式領域に記述された文、すなわち以下の文が実行されます(< >の部分は GNORMAL に置き換

えられます)。

GNORMAL (100, 0.1)

Cancelボタンをクリックした場合は、数式領域の文は実行されません。

4.4.3 入力情報のマクロへの格納

以下のメニューは、ユーザーからの入力情報をマクロに格納します。

! Menu6

@panel

@x2

@y4

マクロへ格納

----------------------

データ長 : < > ~defmacro( “ len”, < >, 1) ~input( 2, “データ長“ )

インターバル : < > ~defmacro( “ rt”, < >, 1) ~input( 1, “ インターバル” )

~menuclear( ) ; grandom( len, rt )

最初の項目、データ長を選択すると、数式 Input(2, "データ長:")が評価されます。この INPUT 関数により、ダイ

アログボックスに Length値を入力することが可能になります。入力された整数値は、プロンプト領域、すな

わち最初の< >の部分に表示されます。さらに、2番目の(数式領域の)< >も、この値に置き換えられます。た

とえば、100 を入力したとすると、2 つの< >が、数値 100 に置き換えられます。

最初のメニュー項目は、以下の行で指定されています。

データ長 : < > ~defmacro( “ len”, < >, 1) ~input( 2, “データ長“ )

OKボタンをクリックして、パネルの内容を確定すると、以下の式が評価されます。

defmacro( “len”, 100, 1 )

この DEFMACRO 関数は、定数"len"を作成し、この値を 100 に設定します。後続行(2 つの~で挟まれた部

分)も、同様に処理されます。最後の行、

-44-

Page 51: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

~menuclear( ) ; grandom( len, rt )

は、最後に評価されます。これにより、メニューパネルが消去され、マクロ"len"および"rt"で指定された乱数

シリーズが生成されます。

4.4.4 デフォルト値の設定

パネルメニューでは、デフォルト入力値を設定することができます。これを行うには、数式領域でデフォルト

値を指定します。以下のメニューでは、データ長および インターバル のデフォルト値が設定されています。

! Menu7

@panel

@x2

@y4

マクロへ格納(初期値)

----------------------

データ長 : < > ~defmacro( “ len”, <100 >, 1) ~input( 2, “データ長“ )

インターバル : < > ~defmacro( “ rt”, < 0.01 >, 1) ~input( 1, “ インターバル” )

~menuclear( ) ; grandom( len, rt )

これで、メニューがポップアップすると同時に、デフォルト値が表示されます。

4.4.5 既存値の記憶

以前に入力された値を、デフォルト値として使用することもできます。この場合は、{ } を使用します。たとえば、

"len"が 200 に、"rt"が 0.02 に設定されているとすると、以下のパネルは、これらの値をデフォルト入力値と

して表示します。

! Menu 8

@panel

@x2

@y4

マクロへ格納

----------------------

データ長 : < > ~defmacro( “ len”, < { len } >, 1) ~input( 2, “データ長“ )

インターバル : < > ~defmacro( “ rt”, < { rt } >, 1) ~input( 1, “ インターバル” )

~menuclear( ) ; grandom( len, rt )

DEFMACRO文のマクロ名が{}で囲まれていることに注意してください。この {}は、"len"および"rt"の現在値

を表示することを意味します。新しい値を入力すると、この値がマクロ定数に代入されます。このパネルで

は、マクロの値がデフォルト値として使用されるので、ユーザーが最後に入力した値が、新しく表示されるデ

フォルト値になります。

4.4.6 リストボックスの選択項目

リストボックスの選択項目を定義するには、入力領域を以下のように変更します。

データ長 : < > ~defmacro( “ len”, < { len } >, 1) ~ < 100 > < 200 > < 300 >

インターバル : < > ~defmacro( “ rt”, < { rt } >, 1) ~ < 0.01 > < 0.02 > < 0.03 >

ドロップダウンリストボックスでも、{}を使用することにより、デフォルト値を設定することが可能です。

-45-

Page 52: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

以下のように、選択項目を別のメニューファイルで指定することもできます。

データ長 : < > ~defmacro( “ len”, < { len } >, 1) ~ menufile(“choices.men”)

"choices.men"の内容は、以下のようになります。

! choices.men

100 点 ~100

200 点 ~200

4.4.7 ダイアログボックスメニューの例

以下のダイアログボックスには、ドロップダウンリストボックス、ユーザー入力フィールド、デフォルト値、およ

び出力先ウィンドウの指定機能が含まれています。リストボックスは、波形の選択肢(Line、Sinc、Square

Root)を提供します。デフォルトの出力先ウィンドウは、現行ウィンドウです。メニューファイルの最終行のコ

マンドは、文字列を連結し、SETWF関数を使用して、出力先ウィンドウの数式を設定します。

! Sample1.pan

@panel

波形生成

タイプ : < > ~ defmacro( “ sig ”, “ < { sig } > “, 2) ~<LINE><SINC><SQRT>

データ点数 : < > ~ defmacro( “ pts ”, “ < { pts } > “, 2 ) ~input( 2 )

インターバル : < > ~ defmacro( “ spc ”, “ < { spc } > “, 2 ) ~input( 1 )

周波数 : < > ~ defmacro( “ frq ”, “ < { frq } > “, 2 ) ~input( 1 )

オフセット: < > ~ defmacro( “ phs ”, “ < { phs } > “, 2 ) ~input( 1 )

以下のダイアログボックスでは、入力元ウィンドウおよび出力先ウィンドウが指定できます。また、ファイル

の先頭に"@h"が含まれているので、ヘルプボタンが付加されます。ヘルプボタンをクリックすると 、

VIEWFILE 関数によって指定のファイルが表示されます。この例では、VIEWFILE("Helpfile.hlp")が実行され

ます。

このメニューファイルの末尾には、ティルデ( ~ )で始まる 2 つの行があります。OKボタンをクリックすると、ま

ず数式領域(~で挟まれた部分)が実行され、次にティルデ( ~ )で始まる最後の 2 行が実行されます。

! Sample2.pan

@panel

@h helpfile.hlp

データ切り出し

入力シリーズ < > ~defmacro( “ s1 “ , “ < { s1 } > “ , 2 ) ~ input( 5 )

開始点 < > ~defmacro( “ sp “ , “ < { sp } > “ , 2 ) ~ input( 2 )

データ長 < > ~defmacro( “ np “ , “ < { np } > “ , 2 ) ~ input( 2 )

出力ウィンドウ W< > ~defmacro( “dw“,strcat(“w”, “ < {getwnum} > ” ) ,2) ~input( 2, 1, numwin )

~_mc ; if( strcmp( s1, dw )==0, defmacro(“s1” , ’curr’ , 2 ) )

~eval( strcat( “SETWF(“, dw,” , ’EXTRACT(“,s1”, ”,sp,”, ”,np,” ) ’ ) ” ) )

-46-

Page 53: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

4.5 メニューコマンド/キーワード一覧

4.5.1 関連コマンド

以下の表に、メニューに関するコマンドを記載します。詳細については、 DADiSP Function Reference

Manual をご覧ください。

関数 説明

MENUFILE メニューファイルをロードし、実行する。

MENULIST DADiSP の内部でメニューを作成する。

VIEWFILE ファイルの内容をそのままポップアップ表示する。

MENUPRINT メニューファイルを(画面ではなく)出力ファイルに送出する。

MENUCLEAR メニューを終了し、消去する。

INPUT ユーザーからの入力を受け付ける。

4.5.2 メニューファイルのキーワードと特殊文字

メニューでは、専用の制御構造によって、画面に表示する情報と DADiSP に渡す情報が区別されます。以

下の表は、これらの制御構造の一覧です。

キーワード 説明

~ メニューファイルの記述を、コマンドフィールドと画面に表示するテキストフィ

ールドに分離する。

{ } 内容を評価し、その結果を所定の位置に表示する。

< > トグルバーまたはパネル入力の内容に置き換える。

@x nn メニューを左から nn文字目に配置する(nn = 0 の場合はネスト表示)。

@y nn メニューを上から nn文字目に配置する(nn = 0 の場合はネスト表示)。

@display メニュー項目の選択後に、メニューを自動的に消去しない。

@panel ファイルをメニュー(選択および入力用)として取り扱う。

@f fn Helpボタンまたは[F1]キーが押されたときに、ファイル"fn"をロードする。

! メニューファイルにコメントを付加する。

-47-

Page 54: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

5章  コマンドファイルの使用

DADiSP が実行するコマンドは、通常はワークシートのコマンドライン、またはメニューを通じて入力されま

すが、コマンドファイルと呼ばれるディスクファイルから命令を読み込むこともできます。DADiSP のコマンド

ファイルは、DOS のバッチファイルや UNIXのスクリプトと同様に、繰り返し実行する作業や、長いコマンドシ

ーケンスを自動化するのに役立ちます。このほか、コマンドファイルを使用することで、ユーザー独自のアプ

リケーションルーチン、デモンストレーション、チュートリアルを作成することもできます。

DADiSP Trial は、デモンストレーション/チュートリアル用のコマンドファイルの一例です。DADiSP のメイン

ディレクトリに収録されている demo.dsp ファイルのコピーを出力し、このデモを実行しながらコマンドファイ

ル命令を追跡してみてください。これにより、DADiSP のコマンドファイル言語のシンプルさ、有効性がお分

かりいただけると思います。

この章では、DADiSP のコマンドファイルの概要を紹介します。この章には、以下の情報が記載されていま

す。

・コマンドファイルの作成

・コマンドファイルのロード

・コマンドファイルにおけるキーストロークと関数

・コマンドファイルにおけるユーザーとの対話

・コマンドファイルの例

5.1 コマンドファイルの作成

DADiSP のコマンドファイルは、DADiSP のコマンドおよびキーストロークを記述した ASCIIテキストファイル

です。コマンドファイルの目的は、DADiSP のセッション(またはその一部)を自動的に実行することにありま

す。コマンドファイルでは、既存のワークシートのロード、ワークシートの新規作成、標準関数やユーザー定

義関数(およびマクロ)の実行、ワークシートウィンドウのレイアウトと配置、メニューやメッセージを使用した

ユーザーとの対話などが行えます。コマンドファイルを記述するときは、その目的を明確にする必要があり

ます。コマンドファイルは、以下の目的に使用できます。

• 繰り返し実行されるコマンドを自動化する。

• 簡単な選択を行うだけで複雑な分析が実行できるように、カスタムインターフェースを作成する。

• 複数のシリーズやデータセットをバッチ処理し、その結果を出力する。

• デモプログラムを作成する。

いずれの目的でも、DADiSP の機能および関数を使用することにより、単純な、または複雑なコマンドファイ

ルが作成できます。コマンドファイルを作成するには、“ツール”プルダウンメニューから、“コマンドファイル”

-“コマンドファイル新規作成”を選択します。もしくはテキストエディターで作成します。コマンドファイルの

ファイル名は、オペレーティングシステムで設定可能なものであれば何でも構いません。ただし、慣用として 、

通常は".dsp"拡張子が付けられます。

-48-

Page 55: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

コマンドファイルでは、複数のコマンドを 1 行に記述できますが、コマンドごとに改行すると、判読が容易に

なります。大文字/小文字は区別されません。ただし、DADiSP のラボブック名、ワークシート名、データセット

名、およびシリーズ名は例外です。たとえば、シリーズ"RUN1.1.ANALOG1"は、"Run1.1.Analog1"と同じでは

ありません。コマンドファイルの最後に、キャリッジリターン/ラインフィードを付加することを忘れないでくだ

さい(つまり、ファイルの末尾に空白行を設ける必要があります)。

注意) コマンドファイルは任意のテキストエディタで記述できます。MS-Windows(TM)では NotePad、DOS

Editor、MS-Write などが、UNIXでは emacs、vi などが使用できます。

5.1.1 コマンドファイルの構成要素

DADiSP のコマンドファイルは、以下の要素で構成されます。

・キーボードからの入力として解釈される文字列

・@で始まる特殊なキーストローク文字列

・@で始まる特殊なコマンドファイル関数

・コメント(説明情報)

5.1.2 コマンドファイルのコメント

コマンドファイルに、実行手順に関するコメントを記述すると便利です。コメントを付加するには、行頭に感嘆

符(!)を付けます。!から行末までのテキストは、すべてコメントとして解釈されます。コメントは、実行時には無

視されますが、コマンドファイルの作成者やユーザーが、このファイルを後で見直すときに役立ちます。

注意) コマンドファイルでは、感嘆符(!)はコメントを意味するので、この文字を論理否定(NOT)として使用すること

はできません。たとえば、!(W1 == 25)は、対話型セッションのコマンドラインでは有効ですが、コマンドファイ

ルではコメントとして解釈されてしまいます。コマンドファイルでは、代わりに NOT(W1 == 25)を使用してく

ださい。

5.2 コマンドファイルのロード

コマンドファイルは、起動時にロードすることも、セッションの途中でワークシートのコマンドラインからロード

することもできます。また、別のコマンドファイルやメニューからロードすることも可能です。

5.2.1 起動時のロード

MS-Windows と UNIXでは、起動時のロード手順が異なります。

5.2.2 MS-Windows(TM)環境における手順

プログラムマネージャで DADiSP アプリケーションを選択し、「アイコン」メニューから、「登録内容の変更」を

選択して、「アイコンの登録内容の変更」ダイアログボックスのコマンドラインフィールドに、"/C="パラメータ

を追加します。たとえば、

タイトル(D): DADiSP 2000

-49-

Page 56: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

コマンドライン(C): D:\DSP2000\DADiSP.EXE /C=MYFILE.DSP

実行時のディレクトリ(W): C:\DSP2000

この設定により、DADiSP の起動時にコマンドファイル"myfile.dsp"が自動的にロードされます。

DADiSP をアイコンの状態で起動し、DADiSP のコマンドファイルを実行させながら、デスクトップで他のアプ

リケーションを使用する場合は、コンフィギュレーションパラメータ、CTRL_BREAK_YIELD を 1 に設定し、「ア

イコンの登録内容の変更」ダイアログボックスの「アイコンの状態で実行」チェックボックスをオンにします。

ただし、CTRL_BREAK_YIELD を 1 に設定し、DADiSP をバックグラウンドで実行すると、DADiSP の処理速度

が大幅に低下します。

5.2.3 UNIX環境における手順

オペレーティングシステムのプロンプトで、オプションのコマンドラインパラメータ、"-c="を使用します。たと

えば、

Xdadisp -c = myfile.dsp

このコマンドにより、DADiSP が起動し、コマンドファイル"myfile.dsp"が自動的にロードされます。DADiSP をア

イコンの状態で実行する場合は、オプションのコマンドラインパラメータ、"-iconify"を使用します。たとえば、

Xdadisp -iconify -c = myfile.dsp

5.2.4 セッションからの呼び出し

セッションの途中でコマンドファイルを呼び出すには、“ツール”プルダウンメニューから、“コマンドファイル”-

“コマンドファイルのロード”を選択し、使用するコマンドファイルのディレクトリとファイル名を指定します。プル

ダウンメニューの代わりに、LOAD 関数または CALL 関数を使用することもできます。LOAD("コマンドファイ

ル名")は、指定のコマンドファイルをロードし、実行します。CALL("コマンドファイル名", n)は、指定のコマンドフ

ァイルをロードし、n回続けて実行します。

コマンドファイルの内部から、別のコマンドファイルを呼び出すこともできます。この場合は、@LOAD 関数ま

たは@CALL 関数を使用します(下記参照)。コマンドファイルをメニューから呼び出すには、メニューファイル

に LOAD コマンドまたは CALL コマンドを組み込みます。所定のメニュー項目が選択されると、コマンドファ

イルがロード、実行されます。

5.3 コマンドファイルにおけるキーストロークと関数

対話型のセッションで使用される通常の入力文字は、コマンドファイルでもそのまま使用できます。キーボ

ードの特殊キー(HOME、END、ENTER など)を表現するには、"@"で始まる専用のキーストロークを使用しま

す。同様に、"@"で始まるコマンドファイル専用の関数も多数用意されています。これらの関数は、メッセー

ジの表示や、コマンドファイルの実行制御を行います。以下のセクションでは、これらのキーストロークや関

数について解説します。

コマンドファイルの各行は、DADiSP のセッションでコマンドラインから入力されるコマンドと同様に処理されます。

特に、[Enter]キーが必要な箇所に、@CR を付け忘れることが多いのでご注意ください。

-50-

Page 57: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

5.3.1 コマンドファイル専用のキーストローク

以下に、コマンドファイルで特殊キーストロークの表現に使われる特殊文字の一覧を記載します。

キーストローク 説明(対応キー)

@BACK_SPACE Backspace キー

@CANCEL ダイアログボックスの Cancelボタン

@CNTL_DN Control - ↓ キー

@CNTL_END Control - End キー

@CNTL_HOME Control - Home キー

@CNTL_LF Control - ← キー

@CNTL_PG_DN Control - Page Down キー

@CNTL_PG_UP Control - Page Up キー

@CNTL_UP Control - ↑ キー

@CR キャリッジリターン (ENTER キー)

@DEL Delete キー

@DN ↓ キー

@END End キー

@ESC Esc キー

@F1 F1 キー

@F2 F2 キー

@F3 F3 キー

@F4 F4 キー

@F5 F5 キー

@F6 F6 キー

@F7 F7 キー

@F8 F8 キー

@F9 F9 キー

@F10 F10 キー

@HOME Home キー

@INS Insert キー

@LF ← キー

@NEXT_FIELD ダイアログボックス内で次のフィールドに移動

@OK ダイアログボックスの OKボタン

@PG_DN Page Down キー

@PG_UP Page Up キー

@RT → キー

@SP スペース キー

@SHIFT_TAB Tab キー

@UP ↑ キー

5.3.2 コマンドファイル専用の関数

以下の表は、コマンドファイルで使用可能な特殊関数の一覧です。各関数の詳細については後述します。

これらの関数は、通常のコマンドや関数に渡す引数として使用することはできません。また、最後に@CR を

付ける必要はありません。

関数 説明

@BEEP ビープ音を発生させる。

@CALL現行のコマンドファイルの内部から、指定のコマンドファイル

を n回実行する。

@HIGHLIGHT_MESSAGE ステータス行にメッセージを反転表示する。

-51-

Page 58: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

@LOAD現行のコマンドファイルの内部から、指定のコマンドファイル

を実行する。

@MESSAGE ステータス行にメッセージを通常表示する。

@PAUSE コマンドファイルの実行を指定の秒数だけ停止させる。

@POP 画面にポップアップテキストボックスを表示する。

@PULLDOWN プルダウンメニューを起動する。

@RETURN コマンドファイルを終了する。

@SUSPEND

指定の終了キーストロークのいずれかが入力されるまで、

コマンドファイルの実行を一時的に停止する。終了キースト

ロークはコマンドファイルに渡される。

@SUSPEND_NOPASS

指定の終了キーストロークのいずれかが入力されるまで、

コマンドファイルの実行を一時的に停止する。終了キースト

ロークはコマンドファイルには渡されない。

@UNPOP 画面上のポップアップテキストボックスを消去する。

@WAIT コマンドファイルの実行を指定の秒数だけ停止させる。

@WAITKEY任意のキーが押されるまで、コマンドファイルの実行を停止

する。

以下に、上記の各関数の詳細を記述します。

@BEEP(n)

ビープ音を発生させます。引数 n で、ビープ音の長さ(発生回数)を指定します。たとえば、@BEEP(1)は

非常に短いビープ音を、@BEEP(100)は長いビープ音を発生させます。

@CALL("コマンドファイル名", n)

現行のコマンドファイルの内部から、指定のコマンドファイルを n回実行します。呼び出されたコマンド

ファイルの実行が完了すると、現行のコマンドファイルの次の文から処理が再開されます。@CALL は、

コマンドファイルにおけるループ処理に便利です。呼び出されたコマンドファイルから戻るには 、

@RETURNを使用します。

@HIGHLIGHT_MESSAGE("テキスト")

ステータス行にメッセージを反転表示します。

@LOAD("コマンドファイル名")

現行のコマンドファイルの内部から、指定のコマンドファイルを実行します。呼び出されたコマンドファ

イルの実行が完了すると、現行のコマンドファイルの次の文から処理が再開されます。呼び出された

コマンドファイルから戻るには、@RETURNを使用します。

@MESSAGE("テキスト")

ステータス行にメッセージを通常表示します。

-52-

Page 59: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

@PAUSE(t)

コマンドファイルの実行を、指定の秒数だけ停止させます。たとえば、@PAUSE(3)は、3秒間の停止期

間後に、コマンドファイルの処理を再開します。この関数は、ポップアップテキストボックスやステータス

行にメッセージを表示するときに便利です。ユーザーが任意のキーを押すと、停止期間が直ちに終了

します(スペースバーを押すのが最も安全です)。

@POP("テキストボックス名", x, y, "テキスト")

画面にポップアップテキストボックスを表示します。たとえば、@POP("p1", 4, 3, "This is my message")

は、x=4、y=3 の位置にテキストボックスを表示し、その中に"This is my message"というメッセージを表

示します。テキストボックスの左上の頂点は、左から x文字目、上から y文字目に配置されます。画面

の左上の角が原点(0, 0)であり、画面の寸法は 80桁(x)×24行(y)です。例外として、テキストボックス

を画面の中央に配置するには、x = -1、y = -1 に設定します。ユーザーにメッセージを読み取る時間を

与えるため、@PAUSE または@WAIT を併用してください。画面上のテキストボックスを消去するには、

@UNPOP を使用します。セッションの途中でコマンドラインから入力されるほとんどの関数と異なり、テ

キストボックス名や、その中の表示テキストは、ダブルクオート(")で囲まなければなりません。引用符

を含んだテキストを表示する場合は、シングルクオート(')を使用してください。

@PULLDOWN

プルダウンメニューを起動します。たとえば、@PULLDOWN F O S は、ファイル、開く、シリーズの 3項目

からなるプルダウンメニューを実行します。

@RETURN

コマンドファイルを終了します。@CALL や@LOAD で呼び出されたコマンドファイルの場合は、呼び出し

たコマンドファイルに制御を返します。

@SUSPEND("終了キーストローク")

指定の終了キーストローク(終了文字)のいずれかが入力されるまで、コマンドファイルの実行を一時

的に停止します。実行の停止中は対話型モードになり、通常どおりのコマンド入力が可能になります。

終了キーストロークが入力されると、コマンドファイルの実行が再開されます。終了キーストローク (最

後に押されたキー)は、DADiSP に渡されます。

たとえば、

@SUSPEND(“ @F1 @F2 @F4 ”)

は、F1 キー、F2 キー、F4キーのいずれかが押されるまで、コマンドファイルの実行を停止します。押さ

れたキーは DADiSP に渡され、コマンドファイルの処理が再開されます。

@SUSPEND(“ @CR ”)

は、キャリッジリターン(改行)が押されるまで、コマンドファイルの実行を停止します。キャリッジリターン

は、コマンドファイルに返されます。この文は、INPUT文の次に記述すると便利です。たとえば、

-53-

Page 60: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

! suspend.dsp

mystring = input ( 3 ) @CR

@suspend(“ @CR “)

echo( mystring ) @cr

@return

注意: @SUSPEND 関数に関するエラーチェックは行われません。終了キーストロークが検出されると、

対話型モードでの操作の成功/失敗に関係なく、コマンドファイルが強制的に再開されます。

@SUSPEND_NOPASS("終了キーストローク")

指定の終了キーストローク(終了文字)のいずれかが入力されるまで、コマンドファイルの実行を一時

的に停止します。実行の停止中は対話型モードになり、通常どおりのコマンド入力が可能になります。

終了キーストロークが入力されると、コマンドファイルの実行が再開されます。@SUSPEND 関数と異な

り、終了キーストローク(最後に押されたキー)は、DADiSP には渡されません。

たとえば、

@SUSPEND_NOPASS(“ @F9 @SP Z Q ”)

は、F9 キー、スペースバー、Zキー、Qキーのいずれかが押されるまで、コマンドファイルの実行を停止

します。コマンドファイルは、押されたキーを DADiSP に渡すことなく実行を再開します。以下のコマンド

ファイルは、キャリッジリターン(改行)が押されるまで、テキストボックスを表示し続けます。この例で 、

@SUSPEND_NOPASS の代わりに@SUSPEND を使用すると、キャリッジリターンがコマンドファイルに

渡され、ウィンドウの切り替えが発生してしまいます。

! suspNop.dsp

moveto(w1) @CR

grandom(100, 0.01) @CR

@POP(“ pop1”, -1, -1

This is random data.

Hit the [ENTER] key

to continue.

“)

@suspend_nopass(“@CR”)

@unpop(“pop1”)

@return

注意: @SUSPEND_NOPASS 関数に関するエラーチェックは行われません。終了キーストロークが検

出されると、対話型モードでの操作の成功/失敗に関係なく、コマンドファイルが強制的に再開されま

す。

@UNPOP("テキストボックス名")

画面上のポップアップテキストボックスを消去します。たとえば、@UNPOP("p1")は、ポップアップテキス

トボックス"p1"を消去します。複数のポップアップテキストボックスを同時に表示した場合は、これらを

作成時とは逆順に消去してください。ポップアップテキストボックスの消去を怠ると、その後ろのビット

マップが適切に更新されません。また、存在しないポップアップテキストボックスを消去しようとすると、

エラーメッセージが出力されます。

-54-

Page 61: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

@WAIT(t)

コマンドファイルの実行を、指定の秒数だけ停止させます。たとえば、@WAIT(3)は、3秒間の停止期間

後に、コマンドファイルの処理を再開します。この関数は、ポップアップテキストボックスやステータス行

にメッセージを表示するときに便利です。@PAUSE と異なり、停止期間を無効にすることはできません。

すなわち、ユーザーがどのキーを押したとしても、指定の秒数が経過するまでコマンドファイルが再開

されることはありません。

@WAITKEY

任意のキーが押されるまで、コマンドファイルの実行を停止します。この関数は、ポップアップテキスト

ボックスやステータス行にメッセージを表示し、ユーザーからの(キーを押すことによる)確認が得られ

るまで、コマンドファイルの実行を停止したいときに便利です。

5.4 コマンドファイルにおけるユーザーとの対話

コマンドファイルは、様々な作業に使用できます。たとえば、バッチ処理に使用する場合は、各種のデータシ

リーズを既存のワークシートにロードし、結果を出力または保存することができます。この場合は、ユーザー

との対話は不要です。コマンドファイルを他の用途で使用する場合は、ユーザーとの対話が必要になるか

もしれません。コマンドファイルは、メッセージを表示したり、ユーザーに質問を行って Yes/No の応答を受

け付けたり、メニューを表示することができます。これにより、ユーザーがコマンドファイルの実行手順を指

定したり、自動分析の条件を設定したりすることが可能になります。以下のセクションでは、ユーザーとの対

話方法について解説します。

5.4.1 コマンドファイル実行中のメッセージ

コマンドファイルの実行中に、ユーザーに指示を与えたり、特定のウィンドウをハイライト表示したり、処理

手順についての情報を表示したい場合があります。メッセージは各種の方法で表示できます。メッセージの

中には、ユーザーからの応答があるまでコマンドファイルの実行を停止するものもあれば、画面に一定期

間表示された後、自動的に消去されるものもあります。このセクションでは、"@"で始まる特殊な関数の使

用法について説明します。これらの関数の詳細については、前述の「コマンドファイル専用の関数」をご覧く

ださい。

① ステータス行のメッセージ

ステータス行は、DADiSP のアプリケーションウィンドウの下部に設けられた表示行です。この行には、スカ

ラ値の計算結果(MAX(W1)など)や、"Calculating Window, please wait...."などのメッセージが表示されます。

ステータス行にメッセージを表示する場合は、ユーザーにメッセージを判読する時間を与えるため、コマン

ド フ ァ イ ル の 実 行 を 一 時 的 に 停 止 す る 必 要 が あ り ま す 。 こ れ に は 、

@PAUSE、@SUSPEND、@SUSPEND_NOPASS、@WAIT、@WAITKEYといったコマンドが使用できます。

対話型のセッションでは、ECHO コマンドを使用することにより、ステータス行にテキストや計算結果を表示

できます。コマンドファイルでは、ECHO コマンドに加えて、2 つの特殊な関数、すなわち@MESSAGE および

@HIGHLIGHT_MESSAGE が使用できます。@MESSAGE("テキストメッセージ")は、ステータス行の中央にテ

キストメッセージを表示し、@HIGHLIGHT_MESSAGE("テキストメッセージ")は、ステータス行の中央にテキ

ストメッセージを反転表示します。

@MESSAGE および@HIGHLIGHT_MESSAGE は、両方とも固定された文字列を受け取ります。つまり、これら

のコマンドに式を渡して、表示前に評価させることはできません。これに対して、ECHO コマンドは、式を受け

-55-

Page 62: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

取り、その評価結果を表示することができます。

以下のコマンドファイルは、ステータス行のメッセージ表示の実例です。

! statLine.dsp

@message(“ I do not know how many Windows there are in this Worksheet. ”)

@pause(10)

@highlight_message(“ I wish I knew the number of Windows in this Worksheet ”)

@pause(10)

echo(strcat(“ There are ”, strnum(numwin), “ Windows in this Worksheet. ”))@cr

@pause(10)

@return

以下の文は、有効なコマンドファイル文ではありません。

@message(strcat(“ There are ” , strnum(numwin), ” Windows “))

ステータス行のメッセージは、他のメッセージで上書きされるまで表示され続けます。ステータス行のメッセ

ージ表示機能を利用することで、不要なメッセージをユーザーから「隠す」こともできます。たとえば、コマン

ドファイルで SPLREAD や MACREAD を使用して、関数やマクロを読み込む場合は、これらのコマンドが終

了時に表示する確認メッセージ("64 Macros read from file macros\mymacros.mac"など)を、ユーザーに気

付かれたくないことがあります。この場合は、SPLREAD 文や MACREAD 文の直後に、以下のような

@MESSAGE文を記述します。

splread(“spl\formula.spl”)@cr

@message(“ “)

ステータス行の長さは、アプリケーションウィンドウの幅に依存します。したがって、アプリケーションウィンド

ウのサイズが変更されると、長いメッセージが表示しきれなくなることがあります。この場合は、別のメッセ

ージ表示オプションを使用する必要があります。

②ポップアップテキストボックス

ポップアップテキストボックスは、非常に効果的なメッセージ表示手段です。ポップアップテキストボックスを

表示するには、@POP 関数を使用します。@POP 関数は、テキストボックス名、表示座標、およびテキストメッ

セージを引数として受け取ります。

ポップアップテキストボックスには、ステータス行より長いメッセージが表示できます。また、複数のポップア

ップテキストボックスに、それぞれ異なる名前を付けることにより、同時に複数のメッセージを表示すること

も 可 能 で す 。 ユ ー ザ ー に メ ッ セ ー ジ を 判 読 す る 時 間 を 与 え る た め 、

@PAUSE、@SUSPEND、@SUSPEND_NOPASS、@WAIT、または@WAITKEYを使用して、コマンドファイルの実

行を一時的に停止してください。停止期間が終了したら、@UNPOP を使用して、テキストボックスを消去しま

す。複数のポップアップテキストボックスを同時に表示した場合は、これらを作成時とは逆順に消去しなけ

ればなりません。

ポップアップテキストボックスに表示されるメッセージは固定されています。つまり、@POP は固定された文

字列を受け取ります。@POP に DADiSP のコマンドを渡して、その評価結果を表示させることはできません。

また、ポップアップテキストボックスの表示位置は、@POP に渡される XY座標で決定されます。ポップアップ

テキストボックスの位置を、ユーザーが変更することはできません。

ポップアップテキストボックスの表示色は、dspcolor ファイルのグローバルカラー(下記参照)によって設定さ

れています。

-56-

Page 63: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

RED ! 8 popmes_background_color

WHITE ! 12 popmes_foreground_color

WHITE ! 24 pop_hilite

WHITE ! 25 pop_shadow

コマンドファイルに SETGCOLOR コマンドを記述することにより、表示色を変更することもできます。たとえ

ば、以下のコマンドは、テキストを明るい赤(light red)、背景を黒(black)に設定します。

setgcolor( 8, black) ; setgcolor( 12, lred)

ポップアップテキストボックスのフォントを動的に変更するには、SETCONFを使用して、dadisp.cnfファイル

の POPBOXに関するパラメータ(POPBOX_FONT など)を変更します。詳細については、dadisp.cnfファイル、

または DADiSP User Manual の"DADiSP コンフィグレーションファイルの変更"を参照してください。

以下のコマンドファイルは、ポップアップテキストボックスのメッセージ表示の一例です。

! PopText.dsp

@pop("p1", -1, -1,

"This message uses default colors and

is centered in the application window.")

@PAUSE( 5 )

@POP("p2", 3, 3,

"

This message is displayed near the upper

left corner of the application window and

is double spaced.

")

@PAUSE( 8 )

@UNPOP("p2") @UNPOP("p1") ! note: unpop p1 and p2 in reverse order

setgcolor(8, lpurple) @CR

setgcolor(12, yellow) @CR

@POP("p3", -1, -1,

" This message is a different color. ")

@PAUSE( 8 )

@UNPOP("p3")

setgcolor(8, black) @CR

setgcolor(12, lred) @CR

@POP("p1", -1, -1,

" This message is light red on black. ")

@PAUSE( 8 )

@UNPOP("p1")

@RETURN

(1) GUI メッセージボックス

MESSAGE コマンドは、GUI(MS-Windows または Motif)の標準形式のメッセージボックスを表示します。メッ

セージボックスは非常に効果的なメッセージ表示手段であり、単なる情報の表示だけでなく、コマンドファイ

ルの実行に関して、ユーザーから確認の応答を受け取ることもできます。MESSAGE 関数のフォーマットに

は、ラベル、テキストメッセージ、ボタン(OK、CANCEL、YES、NO の組み合わせ)、およびメッセージボックスに

-57-

Page 64: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

表示するアイコン(?、!、I(情報)、STOP 記号)を含めることができます。MESSAGE 関数の詳細については、

DADiSP リファレンス マニュアル を参照してください。

メッセージボックスが表示されると、コマンドファイルの実行が停止します。ユーザーがメッセージボックスの

ボタンをクリックすると、メッセージが消去され、コマンドファイルの実行が再開されます。MESSAGE 関数を

使用した場合は、@PAUSE、@WAIT、@WAITKEYなどによる実行の停止は必要ありません。また、MESSAGE

関数は、ユーザーの選択に応じて、1、0、または-1 の戻り値を返します(1 = Yes、0 = No または Cancel、-1 =

Cancel)。この戻り値は、コマンドファイルでの分岐制御に使用できます。メッセージボックスのサイズは固定

されており、変更することはできません。

メッセージボックスは、アプリケーションウィンドウの中央に表示されます。ユーザーは、メッセージボックス

をアプリケーションウィンドウ内の任意の位置に移動できます。この機能は、メッセージを消去する前に、ア

プリケーションウィンドウの表示内容を確認したいときなどに便利です。

MESSAGE コマンドの大きな利点は、コマンドファイルの実行中に表示するテキストメッセージを、コマンドフ

ァイル作成時に確定しておく必要がないことです。すなわち、メッセージの文字列は、DADiSP の式でも構い

ません。この式は、コマンドファイルの実行中に評価され、その結果が画面に表示されます。たとえば、以下

の文によって表示されるメッセージには、ウィンドウの番号が組み込まれています。

MESSAGE(“Note”, strcat(“The data in W”, strnum(getwnum), “contains no outliers.”), 3)

以下のコマンドファイルは、メッセージボックスの機能を使用した一例です。

! Message.dsp

!

MESSAGE("Message Demo","This demonstrates the MESSAGE function.",3) @CR

MESSAGE("Warning", "Value out of Range. Continue?",7) @CR

!

! To make a mult-line message, use the STRESCAPE function

! and the \n escape sequence

!

MESSAGE("Multi-line ", strescape("Line 1.\n\nLine 3.\nLine 4."),3) @CR

Grandom(100,.01) @CR

MESSAGE("Stats", STRCAT("Mean: ", STRNUM(mean)," Std. Dev: ", STRNUM(stdev)),3) @CR

@RETURN

5.4.2 ユーザー入力の受け付け

コマンドファイルの実行中に、処理に必要な情報をユーザーに問い合わせたり、処理の途中経過に応じて、

ユーザーに意思決定を行わせたい場合があります。コマンドファイルには、ユーザーに情報の入力を要求

する各種の方法が用意されています。一部の方法では、@SUSPEND 関数によって、コマンドファイルの実

行を強制的に停止させる必要があります。

(1) INPUT 関数

INPUT 関数は、最も基本的な情報入力手段であり、単一の情報(実数値、整数値、文字列、ウィンドウの数

値/シリーズ)を受け付けます。ヘルプメッセージやプロンプトメッセージを表示することも可能です。INPUT

関数をコマンドファイルで使用する場合は、ユーザーにプロンプトに応答する時間を与えるため、 @

SUSPEND 関数によってコマンドファイルの実行を一時的に停止する必要があります。ユーザーからの入

力情報を利用するには、この情報を使用するコマンドの中に INPUT 関数を直接組み込むか、マクロまたは

変数にユーザーからの入力を代入します。

-58-

Page 65: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

以下に、INPUT 関数を使用したコマンドファイルの実例を示します。

! input1.dsp

message("INPUT Example", "We're going to add Windows.",3) @CR

addwin(input(2,"Number of windows")) @CR

@SUSPEND("@CR")

@POP("p1",-1,-1,"Now, let's capture the user input as a variable.")

@PAUSE(5)

@UNPOP("p1")

!

! prompt here for the input

Sin_Freg = INPUT(1,"Sinewave Frequency", "Enter Value between 1 and 25") @CR

@SUSPEND("@CR")

GSIN(100,.01,Sin_Freg) @CR

@pop("p1",-1,-1,"Now, let's capture the user input as a macro.")

@PAUSE(5)

@UNPOP("p1")

defmacro("UsrString", INPUT(3, "Enter Text", "Text will be the plot Label."), 2)@CR

@SUSPEND("@CR")

grandom(100, .01) @CR

eval(strcat("LABEL(' ",UsrString," ')")) @CR

@RETURN

(2) メニューパネルとダイアログボックス

DADiSP のメニューパネルおよびダイアログボックスは、最も高機能な情報入力手段であり、複数の情報

(実数値、整数値、文字列、ウィンドウの数値/シリーズ)を一度に受け付けます。ヘルプメッセージを表示す

ることも可能です。メニューパネルおよびダイアログボックスの作成方法については、第 4章「DADiSP メニ

ューの作成」をご覧ください。

コマンドファイルの実行中に、メニューパネルやダイアログボックスを通じて、ユーザーからの入力を受け

付ける場合は、@SUSPEND 関数によって、コマンドファイルの実行を一時的に停止する必要があります。

MENUFILE文の直後に@SUSPEND 関数を記述すると、メニューが表示され、指定のキー(通常は OKボタ

ンまたは Cancelボタン)が押されるまで、コマンドファイルの実行が停止します。

以下のコマンドファイルは、メニューパネルの機能を使用した一例です。

! MenuPan.dsp

@POP("p1",-1,-1,

"

This command file displays a dialog box, waits for the user to fill in the required information, and

generates the specified waveform in the window.

"

@PAUSE(10)

@UNPOP("p1")

menufile("dialog.pan") @CR

@SUSPEND("@CR @ESC @OK @CANCEL")

MESSAGE("Note", "The command file halted until the OK or Cancel button was pressed.", 3) @CR

@RETURN

前記のコマンドファイル"MenuPan.dsp"で使用されるメニューパネル、"Dialog.pan"の内容は以下のとおり

です。

-59-

Page 66: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

! Dialog.pan – Generate a Specific Waveform

@panel

Select Function to Generate

Wave : < > ~_defsig(strcat(“’”,”<{_SIG}>”,”’”)) ~<SQRWAVE><TRIWAVE><EXP>

Length : < > ~_defpts(strcat(“’”,”<{_PTS}>”,”’”)) ~_inint(“No. Of Pts”)

Spacing : < > ~_defspc(strcat(“’”,”<{_SPC}>”,”’”)) ~INREAL(“Sample Int”)

Dest.: W< >~defmacro(“_dwin”, strcat(“W”, ”<{getwnum}>”), 2) ~input(2, 1, numwin)

~_MC | eval(strcat(“setwf(“, _dwin,”, ‘G”, _SIG, ”(“,_PTS,”, “,_SPC,”, 1, 0)’)”))

5.4.3 コマンドファイルの制御と分岐

コマンドファイルの実行中に、ユーザーからの入力に応じて異なる処理を実行したり、特定の条件が満たさ

れたときに、別のコマンドファイルを呼び出したいことがあります。この処理を可能にするため、メインのコマ

ンドファイル(「親」コマンドファイル)から「子」コマンドファイルに制御を移す特殊な関数、@LOAD および

@CALL や、条件分岐関数、IFおよびWHILE が用意されています。

@LOAD 関数および@CALL 関数は、実行中のコマンドファイルの内部から、別のコマンドファイルをロードし、

実行します。「子」コマンドファイルの実行が完了すると、「親」コマンドファイルに制御が返されます。特に

@CALL 関数は、コマンドファイル内でループを作成するのに役立ちます。

IF関数および WHILE 関数は、条件に応じて別のコマンドファイルに分岐する機能を提供します。これらの

関数は、コマンドファイル専用の関数である@CALL や@LOAD ではなく、対話型のセッションのコマンドライ

ンで使用される CALL 関数や LOAD 関数を引数として受け取ります。IF関数や WHILE 関数と、CALL 関数

や LOAD 関数を組み合わせることにより、「親」コマンドファイルから「子」コマンドファイルに分岐した場合

は、「子」コマンドファイルの実行が完了しても、「親」コマンドファイルに制御は戻りません。

このほか、ユーザーに選択リスト型のメニューを表示し、選択されたメニュー項目に応じて、コマンドファイル

を呼び出すこともできます。これを行うには、MENUFILE 関数によって選択メニューを表示し、@SUSPEND

関数を使用して、[Enter]キーまたは[OK]キーが押されるまで実行を停止します。

以下のコマンドファイルは、各種の分岐制御を使用した実例です。コマンドファイル "branch.dsp"は、

MESSAGE 関数と IF関数を使用して、ユーザーに Option 1 と Option 2 のどちらを実行するか選択させま

す。ユーザーがメッセージボックスで"Yes"を選択した場合は、コマンドファイル"opt1.dsp"が実行されます。

"No"を選択した場合は、コマンドファイル"branch.dsp"の実行が続けられ、@CALL文によって、コマンドファ

イ ル"opt2.dsp"が呼び出されます 。 "opt2.dsp"の実行が完了す る と、制御が親コ マ ン ドファイル 、

"branch.dsp"に返されます。

! Branch.dsp

!

REMOVEWIN(-1) @CR

ADDWIN(4) @CR

MOVETO(W1) @CR

MESSAGE("Choices for Analysis:", "Choose either Option1 or Option2",3) @CR

IF(MESSAGE("What kind of Analysis", "Do you want to select Option 1?",5),load(opt1.dsp")) @CR

@CALL("opt2.dsp",1)

moveto(w1) @CR

@pop("p1",-1,-1,

" Notice that after opt2.dsp completed

execution, the 'parent' command file

resumed execution. ")

-60-

Page 67: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

@PAUSE(5)

@UNPOP("p1")

MESSAGE("Complete", "This completes the Branching Demo.",3) @CR

@RETURN

"branch.dsp"から呼び出されるコマンドファイル、"opt1.dsp"の内容は以下のとおりです。

! opt1.dsp

!

@POP("p1",-1,-1,

"

This is the command file for

Option 1 of the analysis.

")

@PAUSE(5)

@UNPOP("p1")

MOVETO(w1) @CR

GRAND(100,.01)*0.1 @CR

SETWF(w2,"GSIN(100,.01,3)") @CR

MOVETO(w3) @CR

w1 + w2 @CR

LABEL("Noisy Sine Wave") @CR

SETWF(w4,"SPECTRUM(w3)") @CR

@RETURN

"branch.dsp"から呼び出されるコマンドファイル、"opt2.dsp"の内容は以下のとおりです。

! opt2.dsp

!

@POP("p1",-1,-1,

"

This is the command file for

option 2 of the analysis.

")

@PAUSE(5)

@UNPOP("p1")

MOVETO(w1) @CR

GSIN(100,.01) + (GSIN(100,.01,3)/3) @CR

SETWF(w2,"GSIN(100,.01,5)/5") @CR

MOVETO(w3) @CR

W1 + W2 @CR

LABEL("Summation of 3 Sine Waves") @CR

SETWF(w4,"SPECTRUM(w3);STICKS") @CR

@RETURN

-61-

Page 68: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

5.4.4 DADiSP のアイコン状態での実行

コマンドファイルの実行時は、DADiSP をアイコン化することにより、デスクトップで他のアプリケーションを

操作することができます。

(1) MS-Windows(TM)における手順

DADiSP をアイコンの状態で起動するには、プログラムマネージャの「アイコン」メニューから「登録内容の

変更」を選択し、「アイコンの登録内容の変更」ダイアログボックスの「アイコンの状態で実行」チェックボッ

クスをオンにします。

コマンドファイルを実行しながら、デスクトップで他のアプリケーションを使用する場合は、以下のコマンドに

より、コンフィギュレーションパラメータ、CTRL_BREAK_YIELD を 1 に設定しなければなりません。

SETCONF(“CNTL_BREAK_YIELD”, “1”)

これにより、コマンドファイルの実行中に、他のアプリケーションに制御が渡されます。DADiSP を、コマンドフ

ァイルの起動後にアイコン化する場合は、DADiSP をバックグラウンドに移行させる必要があります。これを

実現する最も簡単な方法は、コマンドファイルに@PAUSE文を組み込むことです。コマンドファイルが

@PAUSE文に到達したら、DADiSP のアプリケーションウィンドウをアイコン化してください。これにより、他

のアプリケーションを操作することが可能になります。

なお、CTRL_BREAK_YIELD を 1 に設定し、DADiSP をバックグラウンドで実行すると、DADiSP の処理速度

が大幅に低下します。

(2) UNIX環境における手順

DADiSP をアイコンの状態で起動し、コマンドファイルを実行させる場合は、オペレーティングシステムのプ

ロンプトで、オプションのコマンドラインパラメータ、"-iconify"を使用します。たとえば、

Xdadisp -iconify -c=myfile.dsp

5.5 コマンドファイルの例

以下に、コマンドファイルの実例を記載します。DADiSP Trial には、多数のコマンドファイルが含まれていま

す。詳しくは、DADiSP アプリケーションの DEMODIRサブディレクトリを参照してください。コマンドファイルに

は、".dsp"拡張子が付けられています。

! vibes.dsp

removewin(-1) @CR

addwin(6) @CR

moveto(w1) @CR

@POP("p1",-1,-1,

"

This command file creates a Worksheet that

analyzes vibration data; it calculates the

spectrum, and identifies the magnitude and

frequency of the 3 major components.

")

-62-

Page 69: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

@PAUSE(10)

@UNPOP("p1")

!

Loadseries("Vibration.1.RSensor");label("Vibration.1.RSensor")@CR

wincolor(black, yellow) @CR

!

moveto(w2) @CR

Spectrum(extract(w1-mean(w1),1,1024));sticks @CR

label("Spectral Content");wincolor(blue, yellow) @CR

scales(2) @CR

@CR

zoom @CR

!

! The next command stops the execution of the command file

! until the user presses the OK button. The advantage is that

! the user has control, and can move the message box anywhere

! in the Worksheet.

!

message("Spectrum of Vibration Data", "Displays Magnitude vs. Frequency",3) @CR

!

@ESC ! unzooms the window

!

moveto(w3) @CR

Getpeak(w2) @CR

wincolor(black, lcyan) @CR

!

moveto(w4) @CR

w3>0.1 @CR

wincolor(black, lgreen) @CR

!

moveto(w5) @CR

setprecision(4) @CR

Ravel(Delete(w4*xvals(w3),w4==0),delete(w4*w3,w4==0));tableview @CR

label("Frequency Components2) @CR

wincolor(white, black) @CR

setcomment("Hz",1,1) @CR

setcomment("Amp1",1,2) @CR

@RETURN

以下のコマンドファイルは、別のコマンドファイルを呼び出します。

! Master.dsp

removewin(-1) @CR

addwin(6) @CR

moveto(w1) @CR

@POP("p1",-1,-1,

"

This command file asks the user a series of

questions to determine the type of analysis

which the user desires.

Note the use of Message boxes and different

-63-

Page 70: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

command files called from this 'master' file.

")

@PAUSE(10)

@UNPOP("p1")

message("Two Options for Analysis:", "Statistics or Vibration",3) @CR

if(Message("Analysis", "Do you want to perform Statistical Analysis?",5),load("stats.dsp")) @CR

@CALL("vibes.dsp",1)

moveto(w1) @CR

@CR

zoom @CR

message("Vibration Analysis", "This is the raw data.",3) @CR

@ESC

moveto(w5) @CR

@F10

message("Vibration Analysis", "These are the 3 major components.",3) @CR

@ESC

@RETURN

"Master.dsp"から呼び出されるコマンドファイル、"Stats.dsp"の内容は以下のとおりです。

! stats.dsp

removewin(-1) @CR

addwin(6) @CR

moveto(w1) @CR

@POP("p1",-1,-1,

"This command file creates a Worksheet that

performs statistical analysis; it calculates

and compares linear and polynomial regression. ")

@PAUSE(10)

@UNPOP("p1")

!

Loadseries("TENSILE.1.STRAIN_RATE");label("TENSILE.1.STRAIN_RATE") @CR

wincolor(black, yellow) @CR

!

moveto(w2) @CR

linreg(w1);label("Linear Regression") @CR

!

moveto(w3) @CR

polyfit(w1,3,-1);tablev @CR

wincolor(white,blue) @CR

message("Polynomial Fit", "These are the polynomial coefficients.",3) @CR

!

moveto(w4) @CR

polygraph(w3, xvals(w1));wincolor(black,lred); label("Polynomial Regrression") @CR

!

moveto(w5) @CR

w1;overplot(w2, lgreen); overplot(w4, red) @CR

wincolor(lgrey); label("Comparison of Regressions") @CR

@F10

message("Comparison", "Raw Data with Liner & Polynomial Regression",3) @CR

@ESC

!

-64-

Page 71: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

moveto(w6) @CR

w3-w1; label("Residuals") @CR

@RETURN

-65-

Page 72: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

6章  他プログラムとの通信

DADiSP の実行中に、外部プログラムを起動したり、外部プログラムと通信したりする必要が生じることが

あります。DADiSP では、外部プログラムとの通信手段として、以下の機能が利用できます。

・DADiSP のパイプライン

・UNIXのパイプ

・MS-Windows(TM)環境における DDE(Dynamic Data Exchange)

6.1 DADiSP のパイプラインの使用

DADiSP のパイプラインを使用すると、DADiSP ワークシートの内部から、外部のソフトウェアプログラムを

実行できます。実行する外部プログラムは任意の言語で記述することが可能であり、その目的にもほとん

ど制限はありません。

DADiSP のパイプラインは、DADiSP の機能と柔軟性を向上させます。たとえば、DADiSP のワークシートを

起動したまま、外部プログラムを起動してデータを収集し、このデータをワークシートのウィンドウに取り込

むことができます。また、DADiSP のパイプラインと簡単なコマンドファイルを併用することにより、DADiSP

の分析ウィンドウのデータを外部ファイルに書き出し、外部プログラムによってこのデータを処理し、その結

果を DADiSP に戻すこともできます。DADiSP のパイプラインは、DADiSP からのユーザープログラムの実

行を可能にすることにより、データ処理の柔軟性を大幅に向上させます。

6.1.1 RUNコマンドの実行

外部プログラムを実行するには、RUN関数を使用します。たとえば、ワークシートのコマンドラインに以下の

文を入力すると、テキストエディタが起動します。

(1) UNIX環境

RUN(“vi”)

(2) MS-Windows(TM)環境

RUN(“notepad.exe”)

プログラム名はダブルクオート(")で囲まなければなりません。

例:

以下のコマンドは、カレントディレクトリのデータファイル名をリストアップしたファイルを作成し、このファイル

の内容を DADiSP ワークシートに表示します。

RUN(“DIR /B *.DAT > MYDATA.TXT”, -1); VIEWFILE(“MYDATA.TXT”)

RUN関数の第 2引数を-1 に設定すると、コマンド(この例では"DIR _B *.DAT > MYDATA.TXT")の実行

が完了するまで、DADiSP の実行が停止します。すなわち、"MYDATA.TXT"ファイルが作成された後で、

VIEWFILE 関数によってその内容が表示されます。

-66-

Page 73: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

DADiMP(DADiSP のデータ読み込みユーティリティ)によって多数の生データファイルを取り込む場合も、

DADiSP のパイプラインを使用することにより、読み込み作業を自動化することができます。ここでは、デー

タファイル名とヘッダファイル名の番号を、テストごとに 1 ずつ増加させる場合を考えます。

データファイル 関連ヘッダファイル

data1.dat test1.hed

data2.dat test2.hed

data3.dat test3.hed

以下の SPL 関数、Imp_Exmp1 は、RUN関数を使用して DADiMP を実行し、データファイルを読み込みます。

ワークシートに SPL ファイルをロードしたら(“ツール”、“SPL”, “SPL ファイルの読み込み”を使用)、以下の

コマンドをコマンドラインに入力します。

Imp_Exmp1(“data”, “test”, 3)

Imp_Exmp1 の内容は以下のとおりです。

Imp_Exmp1(datfilstr, hedrfilstr, numfls)

(

/*

* datfilstr: データファイル名のコア文字列

* hedrfilstr: ヘッダファイル名のコア文字列

* numfils: インポートされるファイルの数

* DADiSP: データインポートプログラム

for( j=1; j <= numfils ; j++ ) (

dfile = strcat(datfilstr, strnum(j), “.dat”);

hfile = strcat(hedrfilstr, strnum(j), “.hed”);

dstr = strcat(“DADiMP -L=”, getlabname,” -H= “,hfile,” “,dfile);

run(dstr, -1);

)

)

6.2 UNIXのパイプ

UNIXワークステーションでは、名前付きパイプを通じて他のプログラムと通信することができます。UNIXの

名前付きパイプは、複数のプログラムから読み書きすることが可能な共有ファイルです。パイプの作成に

は、UNIXの mknod コマンドを使用します。UNIXのパイプは、共有可能であるだけでなく、システムメモリを

通じてプログラム間の直接的な通信を可能にすることにより、ディスクドライブをバイパスします。これによ

り、全体的な処理速度が向上し、オーバーヘッドが抑えられます。

以下の UNIXコマンド、

mknod dsppipe p

は、dsppipe という名前付きパイプ(FIFO)を作成します。ディレクトリのリスト(ls -l など)では、dsppipe は"p"

属性の付いたファイルとして表示されます。

UNIXのパイプは、実際には単なるファイルなので、1 つの方法として、パイプをコマンドファイルとして

DADiSP にロードすることができます。たとえば、DADiSP のコマンドラインに以下のコマンドを入力します。

-67-

Page 74: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

Load(“dsppipe”)

UNIX側からは、ターミナルウィンドウに以下のコマンドを入力することにより、パイプに対話的にコマンドを

入力します。

cat > dsppipe

上記の cat コマンドによって、DADiSP のコマンドをターミナルウィンドウから対話的に入力することが可能

になります。実行可能プログラムからは、標準のファイル関数を使用することにより、パイプにテキストを書

き出すことができます。

上記の例では、UNIXのターミナルウィンドウに入力されたテキストは、すべて dsppipe に出力されます。ユ

ーザーがテキストを入力し、改行キーを押すたびに、そのテキストが DADiSP に自動的に送出されます。パ

イプはコマンドファイルとしてロードされているので、このテキストは DADiSP のコマンドとして解釈されます。

たとえば、ターミナルウィンドウで GSIN(100,.01) @cr とタイプすると、DADiSP は 100 個のデータからなるサ

イン波を生成します。@cr コマンドは、(コマンドファイルに記述した場合と同様に)改行キーの押下をシミュレ

ートします。

DADiSP は、パイプから受け取ったコマンドをすべて実行します。このリンクを終了するには、DADiSP に

@return コマンドを送出します。DADiSP は、@return を受け取ると、コマンドファイルの読み込みを終了し、対

話型モードに復帰します。上記の例では、UNIXのターミナルウィンドウで CNTL-D を押すことにより、リンク

を終えることもできます。 CNTL-D は、UNIX の cat コマンドを終了させ、パイプを通じて DADiSP に

EOF(end-of-file)文字を送出します。DADiSP は EOFをコマンドファイルの終了と解釈し、対話型モードに移

行します。

DADiSP のセッションがスレーブモードで動作している場合は、制御側のプログラムから DADiSP のコマン

ド、EXIT(0)を送出することにより、DADiSP のセッションを終了させることもできます。

6.3 DDE(Dynamic Data Exchange)の使用

DDE(Dynamic Data Exchange)は、アプリケーション間でデータを交換する機能です。一方のアプリケーショ

ンがメモリに書き込んだデータを、もう一方のアプリケーションが読み取ります。DDE アプリケーションは、デ

ータをリクエストする「クライアント」、またはデータを提供する「サーバ」として機能します。DADiSP は、クラ

イアントおよびサーバの両方の機能を備えています。

DADiSP が DDE のクライアントとして動作する場合は、DADiSP に用意された DDE 関数によって、以下の

操作が行えます。

・他のアプリケーションを起動する。

・他のアプリケーションにデータを送出する。

・他のアプリケーションのデータをマニュアル操作で取得する。

・他のアプリケーションのデータが変更されたときに、このデータを自動的に取得する。

・他のアプリケーションでコマンドを実行する。

DADiSP は DDE のサーバでもあるので、他のアプリケーションからも、DADiSP を同様に操作できます。

-68-

Page 75: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

6.4 DDE の有効化

DADiSP の DDE 機能は、コンフィギュレーションファイル(DADiSP.CNF)の DDE_ENABLED フラグによってコ

ントロールされます。DDE_ENABLED を 1 にセットすると、DADiSP の起動と同時に DDE 機能が有効になり

ます。DDE を使用しない場合は、DDE_ENABLED を 0 にセットすることにより、不要な DDE メッセージの処

理を禁止するとよいでしょう。

DADiSP には、DDE 操作機能として、Copy/Paste Link メニューおよび DDE 関数が用意されています。

Copy/Paste Linkメニューは、非常に簡単に使用できますが、限定された目的にしか使用できません。 DDE

関数は、広範囲な DDE 機能を提供しますが、使用法は多少難しくなります。

6.4.1 コピー / 貼り付け及びリンク メニューの使用

コピー / 貼り付け及びリンク メニューは、DADiSP と他のアプリケーション間の自動的なデータ交換を実現

する簡単な手段です。転送データは、“編集”-“ウィンドウからのコピー”メニューによって単純に「コピー」

されます。転送先のアプリケーションは、“編集”-“貼り付け及びリンク”メニューによって DDE リンクを確

立します。たとえば、DADiSP のウィンドウ 1 のデータを、Excel の第 1列に転送するには、

1. DADiSP で W1 を選択します。

2. Windowメニューから、“編集”-“ウィンドウからのコピー”を選択します。

3. Excel でセル A1 を選択します。

4. “編集”-“貼り付け及びリンク”を選択します。

Excel は、W1 のデータが変更されるたびに、更新データを受け取ります。DADiSP にデータを転送することも

できます。たとえば、Excel の一定範囲のデータを DADiSP のウィンドウに転送するには、

1. Excel で、コピーするセル範囲を選択します。

2. “編集”-“コピー”メニューを選択します。

3. DADiSP で W2 を選択します。

4. “編集”-“貼り付け及びリンク”メニューを選択します。

指定のセル範囲内のいずれかのセルが変更されると、セル範囲のデータ全体が、DADiSP の W2 に自動

的に転送されます。DADiSP は、このデータを既存のデータの後ろに自動的に追加します。

6.4.2 DDE 関数の使用

コピー / 貼り付け及びリンク メニューによるデータ交換は非常に簡単ですが、DADiSP に用意された DDE

関数を使用すると、より高度な DDE アプリケーションが作成できます。DDE 関数は、DADiSP が DDE のクラ

イアントとして動作するときに使用されるのが普通です。

以下の表に、使用可能な DDE 関数とその機能を記載します。

関数 DDE 動作

DDEINITIATE DDE 通信を開始し、チャンネル番号を返す。

DDEREQUEST 他のアプリケーションのデータを、テキストとして受信する。

DDEPOKE 他のアプリケーションに、データをテキストとして送信する。

-69-

Page 76: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

DDEGETDATA 他のアプリケーションのデータシリーズを受信する。

DDEEXECUTE 他のアプリケーションのコマンドを実行する。

DDEADVISE 他のアプリケーションのデータシリーズが変更されたときに、

このデータを自動的に受信する。

DDEUNADVISE DDEADVISE の処理を終了する。

DDELINK 他のアプリケーションのデータシリーズが変更されたときに、

このデータを自動的に受信する。(チャンネル番号は内部的

に管理されます。)

DDEUNLINK DDELINK の処理を終了する。

DDEGETLINK クリップボードからリンク名を取得する。

DDESTATUS 最後の DDE 操作のステータス情報を取得する。

DDETERMINATE DDE 通信を終了する。

6.4.3 DDE 関数の呼び出し

DDE アプリケーションは、DDE 通信によって、他のアプリケーションとデータを交換します。DDE 通信は、通

信の確立時に割り当てられる固有のチャンネル番号によって識別されます。このチャンネル番号は、後続

の DDE 関数の引数として使用されます。DDE 関数の基本的な使用手順は、以下のようになります。

1. DDEチャンネルをオープンします。DDE を使用するには、まず通信相手のアプリケーションとのチャン

ネルをオープンする必要があります。DDEINITIATE 関数は、アプリケーションとのコネクションを確立

し、後続の DDE 関数で使用されるチャンネル番号を返します。

2. データを送信またはリクエストします。チャンネルをオープンすることにより、データの交換が可能にな

ります。DDEREQUEST 関数は、他のアプリケーションのデータを文字列として受信し、DDEGETDATA

関数は、他のアプリケーションのデータシリーズ全体を受信します。また、DDEPOKE 関数は、他のアプ

リケーションにデータを文字列として送出します。さらに、DDELINK 関数および DDEADVISE 関数は、

他のアプリケーションのデータシリーズが変更されるたびに、このデータを自動的に受信します。

3. DDEチャンネルをクローズします。DDETERMINATE 関数は、DDE 操作の完了後に、アプリケーション

間のチャンネルをクローズします。

たとえば、DADiSP と Excel 間の基本的なデータ交換手順は、以下のようになります。

chan = ddeinit( “Excel” , “Sheet1”) ! Excelへチャンネルを開きます

aval = dderequest( chan , “R1C1”) ! Excel のセル A1 のデータを取り込む

ddepoke( chan , “R1C1” , max(w1)) ! W1 の最大値をセル A1へ送る

ddeterm( chan ) ! DDE を終了する

6.5 DDEチャンネルのオープン

ほとんどのアプリケーションでは、3種類の情報、すなわちアプリケーション(アプリケーション名)、トピック

(基本データグループ)、およびアイテム(トピック内の特定のデータ)によって、DDE 操作を指定します。上記

の例では、アプリケーションは Excel、トピックは Sheet1(Excel のワークシート)、アイテムは R1C1、すなわち

A1 です(DDE 操作では、Excel のセルは行列表記で表現されます)。

DDEINIT 関数は、特定のアプリケーションおよびトピックとのチャンネルをオープンします。トピックは、通常

は当該アプリケーションでオープンされる文書です。通信の開始時は、通常はアイテムの指定は必要あり

ません。DDEINIT 関数は、通信相手のアプリケーションが起動していない場合に、このアプリケーションを

起動する機能も備えています。たとえば、

ddeinit( “Excel”, “Sheet1”, “”, “c:\excel\excel”, 1)

は、Excel を起動した後で、DDE リンクを確立します。第 3引数はオプション引数であり、この例では必要あ

りません(このため、空白になっています)。 第4引数、C:\excel\excel は、アプリケーションの実行名です。

-70-

Page 77: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

アプリケーションの実行名は、DDE名と同じであるとは限りません。最後の引数、すなわち 1 は、アプリケー

ションが未起動の場合に、このアプリケーションを自動的に起動することを意味します。

アプリケーション、トピック、およひアイテムを、単一の文字列として渡すこともできます。この場合の書式は、

アプリケーション|トピック!アイテムになります。したがって、上記の例は、以下のように記述することもできま

す(アイテムは未指定です)。

ddeinit( “Excel | Sheet1”, “c:\excel\excel”, 1)

注意: 上記の例は、Excel のバージョン 4.0 を対象としています。

6.6 アプリケーションからのデータの受信

DDEREQUEST 関数は、特定のデータアイテムの値を文字列の形式で返します。前述の例では、 DADiSP

の変数 aval に、セル A1 の値が代入されます。当然ながら、aval を数値形式に変換することが可能です。

aval = numstr( aval )

DDEGETDATA 関数は、データシリーズ全体を返します。たとえば、

ddegetdata( chan, “R1C1:R100C1”)

は、R1C1~R100C1 の全データをデータシリーズの形式で受け取り、このシリーズを現行のウィンドウに格

納します。

ddedata = ddegetdata( chan, “R1C1:R100C1”)

は、上記と同じデータシリーズを受け取り、変数 ddedata に代入します。

6.7 アプリケーションへのデータの送信

DDEPOKE 関数は、DADiSP のデータアイテムを、文字列の形式でアプリケーションに送信します。前述の

DDEPOKE 関数の使用例では、W1 の最大値が文字列に変換され、セル R1C1 に格納されます。送信デー

タは、適切なフォーマットに自動的に変換されます。たとえば、Excel に 100 個のデータで構成されるデータ

シリーズを送信するとします。

ddepoke( chan, “R1C1:R100C1”, Gsin(100, 0.01, 1))

は、100 個のデータからなるサイン波を生成し、このデータを R1C1~R100C1 に格納します。このデータは、

CR-LF(キャリッジリターン、ラインフィード)で区切られた ASCII 文字列として渡されます。

-71-

Page 78: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

6.8 アプリケーションでのコマンドの実行

DDEEXECUTE 関数は、他のアプリケーションでコマンドを実行します。たとえば、以下のコマンドは、Excel

にビープ音を発生させます。

ddeexecute( chan, “[beep()]”)

以下のコマンドは、Word文書の現在のカーソル位置にテキストを挿入します。

ddexecute( winchan, ‘ [ Insert “This is a DDE string” ] ’ )

使用可能なコマンドについては、各アプリケーションのマクロ/言語マニュアルを参照してください。

6.9 DDE 通信の終了

DDETERMINATE は、DDE 通信を終了し、関連する DDE リソースを解放します。DADiSP を終了すると、

DADiSP によって開始された DDE 通信もすべて終了しますが、システムリソースを有効に利用するため、

DDE 通信は不要になった時点で終了してください。

6.10 DDE のアドバイスループ‐データの自動転送

これまでの例では、アプリケーションから DADiSP にデータを転送するたびに、所定のコマンドを実行しな

ければなりません。DDE には、変更されたデータを自動的に転送する非常に強力な機能が用意されてい

ます。この機能は、アドバイスループまたはホットリンクと呼ばれます。たとえば、以下のコマンドは、DADiSP

の現行のウィンドウに、Excel のワークシートの最初の 100 行を転送します。

chan = ddeinit( “Excel”, “Sheet1”)

ddeadvise( chan, “R1C1:R100C1”)

第 1列の最初の 100 行のうち、いずれかの行が変更されると、DDEAVDISE 関数が最初に実行されたウィ

ンドウに、この列の全データが自動的に転送されます。新データは、過去のアドバイスデータの後ろに自動

的に追加されます。

データの更新を停止するには、DDEUNADVISE 関数を使用します。

ddeunadvise( chan, “R1C1:R100C1”)

単一のチャンネルで複数のホットリンクを確立することができるので、アイテム(この例では R1C1:R100C1)

は必ず指定する必要があります。アドバイスループを終了しても、DDEチャンネルは依然として有効であり、

収集データもそのまま保持されます。

DDELINK 関数は、実質的には DDEINIT と DDEADVISE を 1 つの関数にまとめたものであり、ホットリンクを

1回の手順で確立できます。たとえば、

ddelink(“Excel”, “Sheet1”, “R1C1:R100C1”)

は、前述の DDEADVISE の使用例と同じ処理を実行します。DDELINK の引数は、DDEINIT と同様に、アプリ

ケーション|トピック!アイテムの形式で指定することもできます。

ddelink(“Excel | Sheet1 ! R1C1:R100C1”)

DADiSP をリンク先として、Paste Linkメニューを実行すると、この形式の DDELINK 関数が呼び出されます。

-72-

Page 79: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

DDEADVISE および DDELINK の結果は、DADiSP のホット変数に代入できます。

hotvar := ddelink(“Excel | Sheet1 ! R1C1:R100C1”)

ホット変数 hotvar は、Excel の指定のデータが変更されるたびに、データを自動的に受信、追加します。ホッ

ト変数の詳細については、付録 A「SPL リファレンス」を参照してください。

DDEUNLINK は、DDELINK の処理を終了します。

ddeunlink(““Excel | Sheet1 ! R1C1:R100C1”)

DDEUNADVISE と同様に、データはそのまま保持されます。

DDE 関数は、DADiSP の標準関数と組み合わせて使用できます。たとえば、以下のコマンドは、単純なリア

ルタイムストリップチャートを作成します。

ddelink(“Excel | Sheet1 ! R1C1”); setx(length-10, length+1)

セル A1 が変更されるたびに、このデータが DADiSP に転送されます。ウィンドウは自動的にスクロールし、

常に最後から 10番目までのデータを表示します。

6.11 DADiSP の DDEサーバとしての使用

DADiSP は、通常は他のアプリケーションにデータをリクエストする DDE クライアントとして機能しますが、

DDEサーバとして動作することも可能です。サーバとしての DADiSP は、以下の DDE トピックをサポートし

ます。

Commands DADiSP との通常の通信

System DDE の情報モード

アプリケーションは、通常は Commands トピックを使用して DADiSP と通信します。Commands トピックを使

用することにより、DADiSP のほとんどすべての式の評価結果が取得できます。たとえば、Excel の内部で

以下の Visual Basic(Excel のコマンド)を使用すると、

chn = DDEInitiate( “DADiSP”, “Commands”)

var = DDERequest( chn, “10*max(w1)”)

DADiSP からW1 の最大値の 10倍が返され、Visual Basic の変数 var に代入されます。

アプリケーションから、DADiSP の任意のコマンドを実行することも可能です。たとえば、Excel に以下のコマ

ンドを記述すると、

chn = DDEInitiate(“DADiSP”, “Commands”)

DDEExecute( chn, “Moveto(w2)”)

DDEExecute( chn, “Gsin(100, 0.01, 2)”)

DADiSP は W2 を選択し、100 個のデータポイントで構成される 2Hzのサイン波を生成します。

DADiSP の任意のウィンドウやホット変数を対象に、アドバイスループ(ホットリンク)を確立することも可能

です。たとえば、DADiSP のデータが以下のように設定されているとします。

W1 : Gnorm(100, 0.01)

hotvar := max(w1)

-73-

Page 80: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

W1 には、100 データポイントの正規分布ランダム雑音が格納されています。ホット変数 hotvar は、W1 の最

大値です。ここで、Excel のセル A1 に以下の式を記述し、

= DADiSP | Commands ! w1

セル A2 に以下の式を記述すると、

= DADiSP | Commands ! hotvar

セル A1 および A2 は、それぞれ W1 のデータシリーズおよび W1 の最大値が変化するたびに更新されま

す。

System トピックは、DDE に関する情報の報告に使用されます。System トピックは、以下のアイテムをサポ

ートします。

SysItems System トピックの全アイテム

Topics 全トピック

Formats 使用可能なクリップボードフォーマット

6.12 DDE の技術的仕様

DADiSP の DDE 機能は、DDEML および DDE管理ライブラリに基づいています。これにより、将来の DDE

機能の拡張に対する互換性が保証されています。また、DDEML により、下位層の DDE メッセージプロトコ

ルも厳密に順守されています。

・DADiSP は、合計 128 の DDE 通信をサポートします。各通信は、複数の DDE 操作を処理することが

できます。

・DADiSP は、合計 128 の DDE アドバイスループ(すなわち、DDELINK 関数または DDEADVISE 関数)

をサポートします。

・アプリケーション文字列の長さは、最大 63文字です。

・トピック文字列の長さは、最大 63文字です。

・アイテム文字列の長さは、最大 128文字です。

・デフォルトの DDE タイムアウト値は、3000 ミリ秒(3秒)です。

-74-

Page 81: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

7章 付録 A SPL リファレンス

この付録では、SPL のシンタックスについて解説します。

・文

・コメント

・キーワード

・インクリメント/ディクリメント演算子

・代入演算子

・フロー制御

・ループ文

・ラベル文

・ジャンプ文

7.1 SPL の文

SPL はフリーフォーマットの言語です。文はセミコロン(;)で区切られ、複数行に記述できます。

たとえば、

a = 10; b = 20;

は、以下のように記述することもできます。

a = 10;

b = 20;

セミコロン(;)は、コマンドファイルから呼び出される単一の文では省略できます。

C言語と異なり、複合文は()で囲みます(C言語では、{}が使用されます)。

( a = 10; b = 20; ); c = a * b ;

-75-

Page 82: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

7.2 コメント

感嘆符(!)は、1 行のコメントを表します。!から行末までの文字は、すべて無視されます。ただし、以下の例外

があります。すなわち、感嘆符と等号の連結(!=)は、不等号演算子として解釈されます。

! this is a comment

a == b; ! a equals b

a != b; ! a does not equal b

C言語と同様に、複数行のコメントも使用できます。/*から*/までの文字は、すべて無視されます(/*および

*/を含む)。

/* this is a single line C-style comment */

/*

** this is a multi-line C-style comment

*/

7.3 キーワード

以下の識別子は、キーワードとして予約されています。

break contivue else for

goto if return while

7.4 インクリメント/ディクリメント演算子

演算子++は変数をインクリメント(増分)し、演算子--は変数をディクリメント(減分)します。これらの演算子は、

接頭辞、接尾辞の両方で使用できます。式++n は、値が使用される前に n をインクリメントしますが、式 n++

は、値が使用された後で n をインクリメントします。

7.5 代入演算子

代入演算子として、+=、-=、*=、および/=が使用できます。e1 および e2 を式とすると、

e1 op= e2

は、

e1 = (e1) op (e2)

と同じです。ただし、e1 は 1回しか計算されません。

-76-

Page 83: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

7.6 制御フロー

以下の書式の条件文が使用できます。

if ( 式 ) 文

if ( 式 ) 文 else 文

式の値が 0 でない場合は文が実行され、0 の場合は else文(省略可能)が実行されます。

以下に、例を記載します。

if ( a < 10 ) echo ( a );

if ( a < 10 ) echo ( a );

else echo(“False”);

複合文は、( )で囲まなければなりません。

if ( a < 10 ) (

b = 1;

c = 2;

)

else (

b = 0;

c = 0;

)

複数の else-if節もサポートされています。

if ( a < 10 ) (

b = 1;

)

else if ( a < 20 ) (

b = 2;

)

else if (

b = 3;

)

-77-

Page 84: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

7.7 ループ文

C言語と同様の while ループと for ループが使用できます。while ループのフォーマットは以下のとおりです。

while( 式 ) 文

式が 0 になるまで、文が繰り返し実行されます。たとえば、

while ( j < 10 ) j++;

以下のように、複合文は( )で囲まなければなりません。

a = 0;

j = 1;

while ( j < 10 ) (

a = a + j;

j += 10;

)

for ループのフォーマットは以下のとおりです。

for ( 式 1 ; 式 2 ; 式 3) 文

for ループでは、まず式 1 が評価されます。この式は、初期化に使用されます。式 2 は、文が実行される前に

評価されます。式 2 が 0 でない場合は、文が実行されます。式 3 は、文が実行された後で評価されます。for

ループの各式はコンマ(,)で区切ります(C言語では、各式は;で区切られます)。以下に例を記載します。

for ( j = 1; j < = 10; j++) echo( j );

while ループと同様に、複合文は()で囲まなければなりません。

a = 0; b = 0;

for( j = 1; j <= 10; j++) (

a += j;

b += a;

)

このコードは、以下のコードと等価です。

a = 0; b = 0;

j = 1;

while( j <= 10 ) (

a += j;

b += a;

j++;

)

ループはネストすることもできます。

for ( j = 0; j < 10; j++ ) (

for ( k = 1; k <= 10; k++ ) (

a += ( j * k );

)

)

-78-

Page 85: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

7.8 ラベル文

文にラベルを付けることができます。このフォーマットは、以下のとおりです。

識別子: 文

識別子は、goto文のジャンプ先として使用されます。

if ( a < 10 ) goto check_point;

b = 10;

c = 5;

check_point:

d = 0;

7.9 ジャンプ文

ジャンプ文は、無条件に制御を移します。

goto 識別子;

continue;

break;

return;

return( 式 );

goto文の識別子は、現行の関数の内部に配置されたラベル文でなければなりません。このラベル文に即

座に制御が渡されます。

if ( a < 10 ) goto label1;

b = 1;

c = 2;

label1:

d = 3;

goto文は、深くネストされた for ループや while ループから脱出するのに便利です。

a = 0;

for ( j = 1; j < n; j++ ) (

for ( k = 1; k < j; k++ ) (

for ( l = 1; l < k; l++ ) (

a += j * k * l;

if ( a > n ) goto exitpt;

)

)

)

exitpt:

return( a );

-79-

Page 86: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

break文は、for ループや while ループを直ちに終了させます。

while ( a < n ) (

if ( a <= 0 ) break;

)

for ( j = 1; j < n; j++ ) (

for ( k = 1; k < j; k++ ) (

a += k;

if ( a > n ) break;

)

)

2番目の break文は、内側の for ループを終了させ、外側の for ループに制御を返します。

continue文は、for ループや while ループの残りの文の実行を中止します。制御はループの終わりに移され、

次のループ判定式が評価されます。

for ( j = 1; j < n; j++ ) (

if ( a > 0 ) continue;

a += j;

)

return文は、現在のループや関数を終了させ、戻り値(省略可能)を返すのに使用されます。戻り値は、( )で

囲まなければなりません。

return;

return ( a + 10 );

7.10 ユーザー定義関数

ユーザー定義関数は、複数の方法で作成できます。1 行の関数は、#deffun コマンドを使用することにより、

直接的に定義できます。

#deffun 名前( 引数 1, 引数 2, 引数 3, ,,,, 引数 N) 文

ここで、名前は関数名であり、引数 Nは任意の数の引数です。関数の本体(ボディ)は、文で指定します。通

常、関数の本体は引数を含んだ 1 つ以上の式で構成されます。以下に実例を記載します。

deffun normal( s ) s / max( s )

関数を呼び出すには、関数名と適当な引数を指定します。

normal(w1)

引数を使用しない場合は、引数リストは省略します。

#deffun minmax max - min

関数名の大文字/小文字は区別されません。

-80-

Page 87: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

複数の行からなる関数は、ASCII ファイルで定義します。関数をファイルで定義する場合は、キーワード

#deffun は省略できます。関数の本体は()で囲みます。また、引数リストが存在する場合は、このリストを()で

囲み、関数名の直後に配置します。

normal( s )

(

s / max ( s );

)

以下の関数は、フィボナッチ数からなるシリーズを作成します。

! Fibonacci numbers returned as series

fib( x )

(

a = 0;

b = 1;

j = 1;

sig = gser( 0 );

while( b < x ) (

c = b;

b = a + b;

a = c;p

sig[ j ] = a;

j = j + 1;

)

return( sig );

)

この関数は、以下のようにコンパクトに記述することもできます。

! another example of creating Fibonacci numbers

fib2( n )

(

j = 1;

f = gser( 1, 1 );

while ( f[ j ] + f[ j + 1 ] < n ) (

f[ j + 2 ] = f[ j ] + f[ j + 1];

j = j + 1;

)

return( f );

)

関数は再帰的に呼び出すこともできます。

! factorial function

fax ( x )

(

if ( x <= 0 ) return( 1 );

else return( x );

)

関数を呼び出すときに、関数の本体で参照されない引数は省略できます。

func1 ( x, y )

(

-81-

Page 88: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

if ( x <= 0 ) return( y );

else return( x );

)

func( 1 )

1

func( -1 )

y: unknown variable

7.11 標準変数

C言語と異なり、SPL では変数の型宣言は不要です。演算子=を使用して変数に値を代入することにより、

所定の変数が作成され、そのデータ型が決定されます。変数名の大文字/小文字は区別されません。変数

には、以下のデータ型が代入できます。

整数 実数 複素数

文字列 シリーズ 配列

a = 10 整数

b = 3.14 実数

c = 1 + 5 i 複素数

d = “This is a string” 文字列

s = gser(1, 2, 3, 4) 4 要素のシリーズ

t = ravel( s , 2) 2×2 の配列

変数のデータ型は、再代入により変更できます。

a = 1;

if (max(w1) < 0 ) a = “Negative Value”;

ユーザー定義関数の内部で使用される変数は、その関数のローカル変数です。関数の評価が完了すると、

その関数で定義されたローカル変数は自動的に削除されます。

fun1 ( x )

(

a = x + 1;

return( a );

)

ここで、以下の対話型セッションを考えてみてください。

a = 1

func1(10)

戻り値: 11

a

戻り値: 1

-82-

Page 89: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

関数 func1 で使用される変数 a は、セッションで定義されたグローバル変数 a とは競合しません。ユーザー

定義関数の内部でグローバル変数を明示的に操作するには、setvar ルーチンを使用します。

fun2( x )

setvar( a , x + 1 );

return( a );

)

a = 1

fun2(10)

戻り値: 11

a

戻り値: 11

7.12 ホット変数

SPL のホット変数は、DADiSP のウィンドウと同様に、数式を変数に関連付けます。数式の従属要素が変化

すると、ホット変数も自動的に再計算されます。ホット変数への代入には、 := 演算子を使用します。以下の

例をご覧ください。

svar = integ( w1 )

hvar := integ( w1 )

標準変数 svar には、W1 を積分することによって生成されるシリーズが代入されます。これに対して、ホット

変数 hvar には、integ(w1)という数式が代入されます。hvar の値も、W1 を積分することによって生成される

シリーズです。ただし、ウィンドウ 1 の値が変更された場合、hvar の値は自動的に更新されますが、svar の

値は変化しません。

ホット変数はグローバルなので、通常のグローバル変数とホット変数に同じ名前を付けることはできませ

ん。ウィンドウと異なり、ホット変数は標準変数がサポートする任意のデータ型をとることができます。

ホット変数を自動的に更新させるには、ホット変数の数式が、ウィンドウや他のホット変数に依存していな

ければなりません。

C言語と異なり、シリーズは SPL の一次データ型です。シリーズは、スカラ値と同様に処理することができ

ます。

a = gser ( 1, 2, 3, 4);

b = a + 1;

c = b ^ 2;

上記の算術演算は、シリーズの各要素に自動的に適用されます。シリーズのインデックスは 1 から始まり

ます。

SPL の配列は、行列の形式で表現されます。すなわち、

data[ 3, 4 ]

-83-

Page 90: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

は、配列の第 3 行、第4列の要素を表します。シリーズと同様に、配列のインデックスは 1 から始まります。

インデックス自体をシリーズにすることも可能です。

a = gser( 10, 20, 30, 40 );

b = a [ gser( 3, 2, 1 ) ];

シリーズ b の各要素は、30、20、10 になります。

7.13 パラメータの受け渡し

スカラ値および文字列変数は、関数に値で渡されます。すなわち、関数が受け取るのは、引数のコピーです

シリーズおよび配列は変数で渡されるので、関数から個々の要素を変更できます。

参考文献

[1] Kernighan & Ritche

The C Programming Language

Second Edition

Prentice Hall, 1988

pp. 191-239

-84-

Page 91: デイ・ディスプ DADiSP...DADiSPカスタマイズ ガイド DADiSPのカスタマイズ機能を利用することにより、データ分析が極めて効率的になります。カスタマイズを

DADiSPカスタマイズ ガイド                    

ご注意

このソフトウェアの著作権は、米国 DSP Development Corporation社にあります。

このソフトウェアおよびマニュアルの一部または全部を無断で使用、複製することはできません。

本書の内容は改良のため予告なしに変更することがあります。

誤った接続や使用結果による影響については、その責を負いかねますのでご了承下さい。

本製品に関するお問い合わせは、ご購入の販売店又は、下記までお願い致します。

DADiSP は、米国 DSP Development Corporation社の登録商標です。

DADiSP カスタマイズ ガイド                                        2010.8

DADiSP 日本総代理店

株式会社CAE ソリューションズ〒102‐0072 東京都千代田区飯田橋 2-1-10

TEL:03-3514-1506   FAX:03-3514-1507

E-Mail:[email protected]

URL:http://www.cae-sc.com/M2078-AB-2008A-400