書式: | include image.e i = save_bitmap(s, st) |
解説: | 2要素からなるシーケンスsからビットマップファイル(.bmp)を作成します。stは"ビットマップ(.bmp)"ファイル名です。s[1]はパレットです:
{{r,g,b}, {r,g,b}, ..., {r,g,b}} 赤、緑、青の各値は0から255までの範囲を持ちます。s[2]はピクセルグラフィックスイメージを含む入れ子になった2次元シーケンスです。s[2]に含まれるシーケンスの長さは全て同一である必要があります。sの値はread_bitmap()によって返されたフォーマットと同じです。 結果は次のコードのうちいずれか一つです: |
global constant BMP_SUCCESS = 0, BMP_OPEN_FAILED = 1, BMP_INVALID_MODE = 4 -- グラフィックモードが違うか -- 不正な引数 | |
注釈: | この関数を使用する前にget_all_palette()を使用してパレットを返値として取得して、save_bitmap()を呼ぶ前にパレットの返値に対して4で乗算を行うことを忘れないでください。
また、s[2]の2次元イメージを取得するためにsave_image()を使用するかもしれません。 save_bitmap()は2, 4, 16, 256色ビットマップを生成でき、これら全てをread_bitmap()で読み取ることができます。なお、Windowsのペイントといくつかのツールは4色ビットマップをサポートしていません。 |
用例: | |
paletteData = get_all_palette() * 4 code = save_bitmap({paletteData, imageData}, "c:\\example\\a1.bmp") | |
関連事項: | save_image, read_bitmap, save_screen, get_all_palette |
Platform: | DOS32 |
書式: | include image.e s3 = save_image(s1, s2) |
解説: | ピクセルグラフィックススクリーンから矩形領域を保存します。結果として全てのピクセルイメージを含む2次元シーケンスになります。display_image()をイメージを再表示をすることができます。s1は{x1,y1}の2要素からなるシーケンスでイメージ右上のピクセルを指定します。s1は{x2,y2}の2要素からなるシーケンスでイメージ右下のピクセルを指定します。 |
用例: | |
s = save_image({0,0}, {50,50}) display_image({100,200}, s) display_image({300,400}, s) -- 51x51の矩形イメージを保存して、{100,200}と -- {300,400}に再表示します。 | |
関連事項: | display_image, save_text_image |
Platform: | DOS32 |
書式: | include image.e i = save_screen(x1, st) |
解説: | 全スクリーンまたはスクリーンの一部を矩形として扱った領域をWindowsビットマップ(.bmp)ファイルとして保存します。全スクリーン保存を行うには、x1に整数の0を渡してください。スクリーンを矩形領域で保存するには、x1に2つのシーケンスを渡す必要があります: {{左上X座標ピクセル, 左上Y座標ピクセル}, {右下X座標ピクセル, 右下Y座標ピクセル}} stは、"ビットマップ"ファイル(.bmp)の名前を指定します。 結果は次の値のうちひとつがiに返されます: |
global constant BMP_SUCCESS = 0, BMP_OPEN_FAILED = 1, BMP_INVALID_MODE = 4 -- グラフィックモードが違うか -- 不正な引数 | |
注釈: | save_screen()は2, 4, 16,または256色いずれかのビットマップを生成し、これらは全てread_bitmap()で読み出すことができます。なお、Windowsのペイントおよびその他のツールでは4色ビットマップに対応していないことがあります。
save_screen()は ピクセルグラフィックスモードのみ対応しており、テキストモードでは動作しません。 |
用例 1: | |
-- 全スクリーン保存: code = save_screen(0, "c:\\example\\a1.bmp") | |
用例 2: | |
-- スクリーンの一部を保存: err = save_screen({{0,0},{200, 15}}, "b1.bmp") | |
関連事項: | save_image, read_bitmap, save_bitmap |
書式: | include image.e s3 = save_text_image(s1, s2) |
解説: | テキストモードスクリーンからテキストを矩形領域として保存します。結果としてスクリーンからアスキー文字と属性を含む入れ子のシーケンスが返されます。このテキストを再表示するにはdisplay_text_image()を使用できます。s1は左上の文字を指す2要素からなるシーケンス{行1, 桁1}です。s2は左下の文字を指す2要素からなるシーケンス{行2, 桁2}です。 |
注釈: | 文字属性も保存されるため正常な前景色、背景色および文字ごとの設定のままテキストを差表示できます
DOS32では、属性のバイトは文字の前景色と前景色をエンコードした2つの4-bitフィールドからなります。下位4bitが前景色、上位4bitが背景色を決定します。 このルーチンはテキストモードでのみ動作します。なお、この関数は半角英数専用です。マルチバイト文字列に対しては使用できません。この問題は将来解決される予定です。 この機能はテキストモードグラフィカルユーザインタフェースでドロップダウンメニュー、ダイアログボックス、アラートボックス等を表示する前にスクリーンの一部を退避するために使用されるかもしれません。 DOS32では、もしビデオページを変更しているときは、この関数は現在有効なページから読み出すことに注意してください。 |
用例: | スクリーン上2行に次の文字列が表示されているとします: |
Hello World | |
そして次を実行します: | |
s = save_text_image({1,1}, {2,5}) | |
そうするとsはこのようになります: | |
{"H-e-l-l-o-", "W-o-r-l-d-"} where '-' は属性を含むバイトを意味します。 | |
関連事項: | display_text_image, save_image, set_active_page, get_screen_char |
書式: | include graphics.e scroll(i1, i2, i3) |
解説: | 上(i1が正数)また下(i1が負数)へスクリーンのテキスト領域をiスクロールします。i2(先頭行)からi3(最下行)のスクリーン上の連続する行を領域として含みます。新規空行は上部または下部に出現します。 |
注釈: | puts()を連続して呼び出すことによりスクロール操作を行うことができますが、scroll()のほうが高速です。
なお、スクロール後のカーソル位置は未定義です。 |
プログラム例: | bin\ed.ex |
関連事項: | clear_screen, text_rows |
書式: | include file.e i1 = seek(fn, a1) |
解説: | ファイルfn内を任意のバイト位置へシーク(移動)またはファイル終端であるときはa1に-1を返します。開いているファイルごとにファイルI/O操作の結果として現在のバイト位置が更新されます。読み込み、書き込みまたは更新モードでファイルを開いたときはファイルの初期位置は0になります。追記モードでファイルを開いたときはファイル終端が初期位置になります。seek()の返値が0のときはシークが成功しており、非0のときは失敗しています。なお、ファイルの終端を超えてシークをすることができます。もし、あなたがファイルの終端を超えてシークを行ったあと、いくつかのデータが書き込むならば未定義バイトはオリジナルのファイル終端に、あなたが用意した新しいデータの間に空白が挿入されます。 |
注釈: | バイト列に対してシークおよび読み込み(書き込む)後に、たとえ既にあなたが必要とするファイル位置であったとしても、あなたが書き込む(読み込む)バイトを切り替える前にseek()を呼び出す必要があります。
この関数は通常開いたファイルをバイナリモードで扱います。なぜならテキストモードで扱おうとするとDOSではCR+LF入力後にLFをCR+LF出力として変換してしまうためバイト数を計測しているさい、それは想像を絶する混乱の原因になりえるからです。 |
用例: | |
include file.e integer fn fn = open("mydata", "rb") -- ファイルの最初の行を3回読んで表示します: for i = 1 to 3 do puts(1, gets(fn)) if seek(fn, 0) then puts(1, "rewind failed!\n") end if end for | |
関連事項: | where, open |
書式: | i = sequence(x) |
解説: | xがシーケンスであれば1を、それ以外であれば0を返します。 |
注釈: | これはsequence型の雛形となる定義です。また、オブジェクトがシーケンスであるかどうか調べるための関数としても使用できます。 |
用例 1: | |
sequence s s = {1,2,3} | |
用例 2: | |
if sequence(x) then sum = 0 for i = 1 to length(x) do sum = sum + x[i] end for else -- xはアトムでなければならない。 sum = x end if | |
関連事項: | atom, object, integer, アトムとシーケンス |
Platform: | DOS32 |
書式: | include image.e set_active_page(i) |
解説: | すべてのスクリーン出力をビデオページiに切り替えます。 |
注釈: | 複数のページにおいて、"フリッカー(ちらつき)"を発生させること無く全てのスクリーンを即時変更することができます。スクリーンを保存して、迅速に復帰することもできます。
video_config()は現在のグラフィックスモードでページ数がいくつかあるか調べることができます。 有効になっているページと表示中のページの両方の規定値では0です。 これはDOS環境下または全スクリーンDOSウィンドウで動作します。一部のウィンドウスクリーンでは有効なページを変更できません。 |
用例: | |
include image.e -- 有効かつ表示ページは初期値では両方0です。 puts(1, "\nThis is page 0\n") set_active_page(1) -- スクリーン出力はページ1になります。 clear_screen() puts(1, "\nNow we've flipped to page 1\n") if getc(0) then -- キー入力を待ちます。 end if set_display_page(1) -- "現在..." 表示されています。 if getc(0) then -- キー入力を待ちます。 end if set_display_page(0) -- "これは..." 再び表示されます。 set_active_page(0) | |
関連事項: | get_active_page, set_display_page, video_config |
Platform: | DOS32 |
書式: | include image.e set_display_page(i) |
解説: | 表示スクリーンをビデオページiに切り替えます。 |
注釈: | 複数のページにおいて、"フリッカー(ちらつき)"を発生させること無く全てのスクリーンを即時変更することができます。スクリーンを保存して、迅速に復帰することもできます。
video_config()は現在のグラフィックスモードでページ数がいくつかあるか調べることができます。 有効になっているページと表示中のページの両方の規定値では0です。 これはDOS環境下または全スクリーンDOSウィンドウで動作します。一部のウィンドウスクリーンでは有効なページを変更できません。 |
用例: | set_active_page()を参照してください。 |
関連事項: | get_display_page, set_active_page, video_config |
書式: | include machine.e set_rand(i1) |
解説: | rand()呼び出し後に乱数の列を固定値にするために乱数生成器を特定の状態i1に設定します。 |
注釈: | 通常は乱数はrand()によって返されますが関数の結果は予測できないものであり、プログラムを実行するたびに変化します。ときどきプログラムデバックするときに同じ数値の列を反復したいか、ユーザの要望ごとに同じ出力(例えばランダムに画像を扱いたいとき)を生成したいときがあります。そのようなときにset_rand()を使用します。 |
用例: | |
sequence s, t s = repeat(0, 3) t = s set_rand(12345) s[1] = rand(10) s[2] = rand(100) s[3] = rand(1000) set_rand(12345) -- set_rand()は同一値になります。 t[1] = rand(10) -- その前にrand()の引数を同一にします。 t[2] = rand(100) t[3] = rand(1000) -- この時点で s と t は同一になります。 | |
関連事項: | rand |
Platform: | DOS32 |
書式: | include machine.e set_vector(i, s) |
解説: | 割り込み番号iを扱うために新しいアドレスsを設定します。sはプロテクトモードにおいてのfarアドレス形式である必要があります: {16-bitセグメント, 32-bitオフセット} |
注釈: | set_vector()を呼ぶ前にメモリー位置sを使用しているマシン語割り込みを保存する必要があります。
16bitセグメントはEuphoriaによってコードセグメントとして使用できます。このセグメントの値を取得するには、demo\dos32\hardint.exを参照してください。オフセットはallocate()によって返された32-bit値が使用できます。Euphoriaをプロテクトモードで実行すると、コードセグメントとデータセグメントは同じ物理メモリーを指しますが、アクセスモードは異なります。 リアルモードまたはプロテクトモードで発生する割り込みは、どちらもハンドラに渡されます。メモリーの参照を試みる前に割り込みハンドラを正確なデータセグメントにロードする必要があります。 ハンドラはiretdインストラクションを使用している割り込みから復帰するか、最初の割り込みハンドラへ飛ぶかもしれません。変更を行う任意のレジスタは使用前に退避を行い、使用後に復帰する必要があります。 スワップアウトを禁止するためにハンドラで使用されるメモリーを確実にロックする必要があります。詳しくはlock_memory()を参照してください。 割り込みハンドラを記述しようとする前にdemo\dos32\hardint.exを教材として勉強することを強く推奨します。 ハンドラを記述しようとする前にハードウェアレベルのプログラミングについて十分な知識と経験が必要です。 get_vector()によって返されたfarアドレスをset_vector()で使うことにより、ハンドラを元に戻すことができます。 |
用例: | |
set_vector(#1C, {code_segment, my_handler_address}) | |
プログラム例: | demo\dos32\hardint.ex |
関連事項: | get_vector, lock_memory, allocate |
書式: | x2 = sin(x1) |
解説: | x1のサインの値をx2に返します。 x1の値はラジアン(弧度)のみ指定可能です。 |
注釈: | この関数はアトムまたはシーケンスの全ての要素に適用されることがあります。 |
用例: | |
sin_x = sin({.5, .9, .11}) -- sin_x は {.479, .783, .110} | |
関連事項: | cos, tan |
書式: | include misc.e sleep(i) |
解説: | i秒間だけ実行を一時停止します。 |
注釈: | WIN32およびLinux/FreeBSDでは、オペレーティングシステムはあなたのプロセスを停止してほかのプロセスのスケジュールを行います。DOS32ではi秒間ビジーループに入り、その間にほかのプロセスは動作するかもしれませんが、あなたのプロセスとほかのプロセスをCPUの使用率で競合することがあります。
その場合は現在のタスクだけではなく複数のタスク、すべてのプログラムが一時停止します。現在のタスクを一時停止するとき、task_schedule(task_self(), {i, i}を呼び出してからtask_yield()を実行することができます。 |
用例: | |
puts(1, "Waiting 15 seconds...\n") sleep(15) puts(1, "Done.\n") | |
関連事項: | lock_file, abort, time |
書式: | include sort.e s2 = sort(s1) |
解説: | s1を高速なソートアルゴリズムで昇順にソートします。s1の要素はアトムまたはシーケンスの混成も可能です。アトムはシーケンスより優先され、最初の要素が後の要素より意味を持つ箇所であればシーケンスは"アルファベット順"にソートされます。 |
用例 1: | |
x = 0 & sort({7,5,3,8}) & 0 -- x には {0, 3, 5, 7, 8, 0} が設定されます。 | |
用例 2: | |
y = sort({"Smith", "Jones", "Doe", 5.5, 4, 6}) -- y は {4, 5.5, 6, "Doe", "Jones", "Smith"} | |
用例 3: | |
database = sort({{"Smith", 95.0, 29}, {"Jones", 77.2, 31}, {"Clinton", 88.7, 44}}) -- 3つのデータベース"レコード"は最初の"フィールド"であるnameからソートされます。 -- 次のフィールド以降は最初のフィールド(要素)と -- 同等に扱われてソートされます。 -- ソート後のデータベースは次のようになります: {{"Clinton", 88.7, 44}, {"Jones", 77.2, 31}, {"Smith", 95.0, 29}} | |
関連事項: | custom_sort, compare, match, find |
Platform: | DOS32 |
書式: | include graphics.e sound(i) |
解説: | 周波数 iでPCのスピーカーから音を鳴らします。iが0ならば消音をします。 |
注釈: | WIN32 および Linux/FreeBSDでは音は鳴りません。 |
用例: | |
sound(1000) -- 明確な高域音の発音を開始 |
書式: | include misc.e s = sprint(x) |
解説: | xとして表されたもの文字列にして返します。これは正確にはprint(fn, x)と同じですが、ファイルやデバイスに結果が送られるわけではなく、文字のシーケンスとして出力したものが返されます。xは任意のEuphoriaのオブジェクトです。 |
注釈: | xの中にアトムが含まれているときはprint()と同様に最高10桁の有効桁数が出力されます。 |
用例 1: | |
s = sprint(12345) -- s は "12345" | |
用例 2: | |
s = sprint({10,20,30}+5) -- s は "{15,25,35}" | |
関連事項: | print, sprintf, value, get |
書式: | s = sprintf(st, x) |
解説: | これは正確にはprintf()と同じですが、ファイルやデバイスに結果が送られるわけではなく、文字のシーケンスとして出力したものが返されます。stは書式指定するための文字列です、xは整形処理対象の値またはシーケンスの値です。printf(fn, st, x) はputs(fn, sprintf(st, x))と等価です。 |
注釈: | sprintf()にはいくつかの定石としての使用方法があります。
|
用例: | |
s = sprintf("%08d", 12345) -- s は "00012345" | |
関連事項: | printf, value, sprint, get, system |
書式: | x2 = sqrt(x1) |
解説: | x1の平方根を計算します。 |
注釈: | この関数はアトムまたはシーケンスの全ての要素に適用されることがあります。
負数の平方根が発生した場合はランタイムエラーとなりプログラムの実行を中止します。 |
用例: | |
r = sqrt(16) -- r は 4 | |
関連事項: | log, power |
書式: | system(st, i) |
解説: | コマンド文字列stをオペレーティングシステムのコマンドインタプリタに渡します。引数iはsystem()を呼び出して戻るときの方法を表します: iが0ならば、以前のグラフィックモードに戻してスクリーンを消去します。 iが1ならば、以前のグラフィックモードに戻す前にビープを鳴らしてプログラムがユーザのキー入力待ちをします。 iが2ならば、以前のグラフィックモードに戻さずスクリーンを消去しません。 |
注釈: | i = 2を使用する機会としてsystem()によってコマンドが実行されたことがわかっており、その場合はグラフィックスモードを変更しません。 system()およびsystem_exec()を呼び出すさいにEuphroiaを高度な""バッチ""(.bat)言語として使うことができます。 system()を実行すると新規にDOS または Linux/FreeBSDシェルが開始されます。 system()でコマンド文字列 stによる標準出入力によるコマンドラインリダイレクションの使用が許可されています。 DOS32では、Euphoriaは拡張メモリーを使用して動作を開始します。拡張メモリーが不足したとき、プログラムはコンベンショナルメモリーを消費します。コンベンショナルメモリーが不足したとき、仮想メモリーを使用します。すなわちディスクスペーススワップのことです。DOSコマンドはsystem()によって実行されますが、利用可能なコンベンショナルメモリーが不足しているときは実行が失敗します。これを避けるため、DOSエクステンダ(CauseWay)の設定を行うことによってコンベンショナルメモリーの一部を予約することができます: |
SET CAUSEWAY=LOWMEM:xxx | |
xxxは確保するコンベンショナルメモリーの容量をKB単位で指定します。プログラムを実行する前にこの設定を行ってください。なお、この設定はautoexec.batまたはプログラムを実行するバッチファイル(.bat)に記述することができます。例えば: | |
SET CAUSEWAY=LOWMEM:80 ex myprog.ex | |
これはCOPY,MOVE,MKDIRその他の単純なDOSコマンドを実行するのに十分な80KBのコンベンショナルメモリーを確保します。 | |
用例 1: | |
system("copy temp.txt a:\\temp.bak", 2) -- 注意: リテラル文字列から単一のバックスラッシュを得るには2重バックスラッシュが必要です。 | |
用例 2: | |
system("ex \\test\\myprog.ex < indata > outdata", 2) -- myprogを実行することにより標準入力および標準出力がリダイレクトされます。 | |
関連事項: | system_exec, dir, current_dir, getenv, command_line |
書式: | i1 = system_exec(st, i2) |
解説: | stによって与えられたコマンドの実行を試みます。stはいくつかのコマンドライン引数と共に実行可能プログラムを実行するためのコマンドです。プログラムが動作可能であれば、プログラム終了に終了コード i1を返します。プログラムの実行が不可能な場合は、system_exec()は-1を返します。i2はsystem_exec()処理終了後のグラフィックスモードに対しての後処理を指定します。これらの処理指定はsystem()と同一です。 i2が0ならば、以前のグラフィックモードに戻してスクリーンを消去します。 i2が1ならば、以前のグラフィックモードに戻す前にビープを鳴らしてプログラムがユーザのキー入力待ちをします。 i2が2ならば、以前のグラフィックモードに戻さずスクリーンも消去しません。 |
注釈: | DOS32またはWIN32では、system_exec()は.comと.exeプログラムのみ実行できます。.batファイルまたは内蔵DOSコマンドを実行する場合はsystem()を使用します。DELのようなコマンドはプログラムではなく、それらはコマンドインタプリタの内蔵コマンドです。 DOS32およびWIN32では、system_exec()はコマンド文字列 stに対してコマンドラインリダイレクション使用が許可されておらず、空白を含む文字列に対するクォート処理を行うことができません。 通常はDOSまたはWindowsのプログラムにおいて終了コードは0から255までであり、0は"正常"終了を表します。 Euphoriaのプログラムはsystem_exec()でも実行できます。Euphoriaのプログラムはabort()を使用すると終了コードを返すことができます。 system_exec()は新規にDOSシェルを開始しません。 |
用例 1: | |
integer exit_code exit_code = system_exec("xcopy temp1.dat temp2.dat", 2) if exit_code = -1 then puts(2, "\n couldn't run xcopy.exe\n") elsif exit_code = 0 then puts(2, "\n xcopy succeeded\n") else printf(2, "\n xcopy failed with code %d\n", exit_code) end if | |
用例 2: | |
-- myprogは引数として2つファイル名を与えて実行します。 if system_exec("ex \\test\\myprog.ex indata outdata", 2) then puts(2, "failure!\n") end if | |
関連事項: | system, abort |
書式: | x2 = tan(x1) |
解説: | x1のタンジェントを返します。x1はラジアンです。 |
注釈: | この関数はアトムまたはシーケンスの全ての要素に適用されることがあります。 |
用例: | |
t = tan(1.0) -- t は 1.55741 | |
関連事項: | sin, cos, arctan |
書式: | task_clock_start() |
解説: | スケジュールされたリアルタイムタスクのクロックを再起動します。以前task_clock_stop()を呼んだあとに、このルーチンを呼ぶとリアルタイムタスクのスケジュールを継続できます。 |
注釈: | task_clock_start()およびtask_clock_stop()はスケジュールされたリアルタイムタスクの凍結に使用できます。
task_clock_start()はtask_clock_stop()が呼ばれてからの全リアルタイムタスクのスケジュール合計時間を増加させます。これによりゲーム、シミュレーションまたは他のプログラムが円滑に動作を継続することができます。 タイムシェアタスクには影響はありません。 |
用例: | |
-- プレイヤーが電話で話している間はゲームを一時停止します。 task_clock_stop() while get_key() = -1 do end while task_clock_start() | |
関連事項: | task_clock_stop, task_schedule, task_yield, task_suspend |
書式: | task_clock_stop() |
解説: | スケジュールされたリアルタイムタスクを停止します。task_clock_start()が呼ばれるとスケジュールを再開します。タイムシェアタスクは継続できます。それがリアルタイムタスクであり、かつ移譲されない限り現在のタスクは継続できます。 |
注釈: | リアルタイムタスクのスケジュールを小休止したいときにtask_clock_stop()を呼びます。実例として、ゲームまたはシミュレーションを一定期間休止したいときに使用します。
これはtime()関数には影響はありません。 |
関連事項: | task_clock_start, task_schedule, task_yield, task_suspend |
書式: | a2 = task_create(i1, s) |
解説: | タスクを新規作成します。i1はユーザが定義したEuphoriaの手続きのルーチンidです。sはタスク実行開始時に手続きに渡す引数のリストです。a2はシステムによって生成されたタスク識別子です。それはこのタスクと他のEuphroiaマルチタスクルーチンを識別するために使用されます。 |
注釈: | task_create()はタスクを新規作成しますが、タスクの実行を開始しません。 各タスクは自身のプライベート変数と自身のコールスタックの一式を持っています。グローバルとローカル変数は全てのタスクの間で共有されます。 ランタイムエラーが検出されたならば、最初に問題のあるタスクをリストにして、トレースバックは全てのタスクに関する情報を保持します。 全て同一の手続きのタスクを複数生成してパラメータ別で実行することが可能です。 関数の返値を利用する方法がないため、関数からタスクへ派生することはできません。 各タスクidは固有のものです。task_create()は以前と同じタスクidを決して返しません。タスクidは整数値のアトムであり、整数値のアトムの最大値(15桁)の大きさになることがあります。 |
用例: | |
mytask = task_create(routine_id("myproc"), {5, 9, "ABC"}) | |
関連事項: | task_schedule, task_yield, task_suspend, task_self |
書式: | s = task_list() |
解説: | 全ての活動中または休止中のタスクidを含むシーケンスを取得します。 |
注釈: | この関数は現時点でタスクが存在するか知ることができます。なお、停止済みのタスクは含まれません。task_status()にタスクidを渡すことにより特定のタスクの詳細を知ることができます。 |
用例: | |
sequence tasks tasks = task_list() for i = 1 to length(tasks) do if task_status(tasks[i]) > 0 then printf(1, "task %d is active\n", tasks[i]) end if end for | |
関連事項: | task_status, task_create, task_schedule, task_yield, task_suspend |
書式: | task_schedule(a, x) |
解説: | スケジュールはタスクを実行するためにスケジュールパラメータxを使用します。aはtask_create()によって返されたタスク識別子である必要があります。xが正数のアトムならば、xはタスクスケジューラが他のタスクを一気に実行するか検討する前にタイムシェアタスクを何回実行する必要があるか指示します。xがシーケンスならば、リアルタイムタスクaの実行をする前の待ち秒数を表しており、それは2要素のシーケンス {最小, 最大}からなり、両方の値は0より等しいか大きく、最小・最大は最小・最大時間を表します。最小・最大はタスクaを連続実行するさいの時間間隔を指定しますが、別途task_schedule()またはtask_suspend()が呼び出されない限り上書きされます。 |
注釈: | タスクスケジューラは、Euphoriaランタイムシステムに内蔵されており、スケジュールパラメータxを手引きとしてスケジューラがタスクに対して使用します。希望する回数の連続実行または希望する時間フレームを行うことは必ずしも可能ではないかもしれません。実例として、タスクは長い移譲制御を取得する前に、別のタスクが希望する時間ウィンドウを取りこぼすことがあるかもしれません。 リアルタイムタスクはより高い優先度を持ちます。リアルタイムタスクを実行する準備ができていないときはタイムシェアタスクとしてタスクは動作します。タスクはリアルタイムおよびタイムシェアの間の前後で切り替えることができます。タスクは最後に呼ばれたtask_schedule()に全て依存します。スケジューラは時間フレーム(最小値)の開始前にリアルタイムタスクを決して実行せず、さらにタスクの最終期限(最大値)を取りこぼすことを避けようとします。 正確なタイミングのために、最小・最大の同一値を指定することができます。しかし、時間範囲の指定をすることにより、スケジューラにある程度の柔軟性を与えます。これは、効率的にタスクをスケジュールして、非生産的な遅延を避けために余裕を持たせます。スケジューラで遅延が必要なときは、必要とされる非常に短い遅延があるまでsleep()を呼び出します。sleep()はオペレーティングシステムのほかのプログラムでも実行できます。 最小・最大値は小数もありえます。スケジューラのクロック分解能(現在のところWndowsおよびLinux/FreeBSDでは0.01秒、DOSではtick_rate()が呼ばれるまで0.55秒)が最小値より小さいならば正確な時間スケジュールは実行されませんが、しかしスケジューラは希望する近似値にしようと何度かタスクの連続実行を試みます。例えば、最小時間として0.002を求めるならば、スケジューラはクロックが""クロックを刻む""のを.01秒待つ前に、.01/.002 = 5回のタスクの連続実行を試みます。1クロック周期あたり5回タスクを完了できるなら次の0.01秒の間に、その他の別のタスクを5回(まで)実行します。 タイムシェアタスクに対して、パラメータxを増やすことは選択したタスクに与えるCPU時間の割り当てを増加させ、一方では他のタイムシェアタスクの割り当てを減少させます。実際はタスクスイッチごとにわずかな時間を消費するため、プログラムの効率は向上します。task_yield()で同じタスクを継続して実行するときは、より少ない時間を取得します。しかし長期間実行することは他のタイムシェアタスクの動作を遮断するため望ましくないかもしれません。リアルタイムタスクは全てのtask_yield()において常に優先順位を与えられており、一回で起動時間に到達します。 プログラム起動時はシングルタスクとして実行されます。そのタスクidは0であり、まず最初にtask_yield()の実行につきタイムシェアタスクが一つ与えられます。タスク0がtask_yield()を実行するまで、他のタスクは一切実行できません。 タスク0(上位)のメインファイルが終端に到達して実行が終了されるならば、他のタスクが活動中であるかないかに関係なく、全てのプログラムは停止します。 すなわちタスクが二度と再実行されない(タスク0と同等ではない)といったように、スケジューラはタスクが活動していないことを検出したときはabort(0)と同様に終了コード0で、プログラムが停止します。 |
用例: | |
-- 他のタイムシェアタスクに制御権が与えられる前に、タスクt1は連続で最大10回実行されます。 -- リアルタイムタスクが制御権を必要とするならば、t1はリアルタイムタスクの制御権を失います。 task_schedule(t1, 10) -- タスクt2は、今から4秒と5秒の間に実行されるようスケジュールされています。 -- t2の任意の再スケジュールを除き、その後4〜5秒ごとに実行を継続します。 task_schedule(t2, {4, 5}) | |
関連事項: | task_create, task_yield, task_suspend, task_suspend |
書式: | a = task_self() |
解説: | 現在タスクのタスクIDを返します。 |
注釈: | この値は、タスク自身のスケジュール、強制終了、休止をするときに必要になるかもしれません。 |
用例: | |
-- 自分自身のスケジュール task_schedule(task_self(), {5.9, 6.0}) | |
関連事項: | task_create, task_schedule, task_yield, task_suspend |
書式: | i2 = task_status(a) |
解説: | タスクの状態を返します。状態値は 1 (活動中), 0 (休止中), および -1 (タスクが存在しない)です。 |
注釈: | いくつかの処理を継続するか決定するとき、タスクは一つ以上のほかのタスクの状態を知っておきたいときがあるかもしれません。
値-1は既に存在しないタスク、または自然な方法で終了したか強制終了させられたことを表します。 |
用例: | |
integer s s = task_status(tid) if s = 1 then puts(1, "ACTIVE\n") elsif s = 0 then puts(1, "SUSPENDED\n") else puts(1, "DOESN'T EXIST\n") end if | |
関連事項: | task_list, task_create, task_schedule, task_suspend |
書式: | task_suspend(a) |
解説: | 実行中のタスクaを休止します。 |
注釈: | これによりタスクは休止されます。aに対してtask_schedule()が呼び出されていなければタスクの実行は再開されません。aはtask_create()によって返されたタスクidです。
任意のタスクから他の任意のタスクを休止できます。もしタスクが自分自身を休止するならば、task_yield()を呼び出すと即時に休止が開始されます。 |
用例: | |
-- タスク15を休止します。 task_suspend(15) -- 現在のタスクを休止します。 task_suspend(task_self()) | |
関連事項: | task_create, task_schedule, task_self, task_yield |
書式: | task_yield() |
解説: | スケジューラーの移譲を制御します。スケジューラは実行する別のタスクを選択することができるか、現在のタスクの実行を継続します。 |
注釈: | タスクは他のタスクに対して実行する機会を与えるためにtask_yield()を呼ぶ必要があります。 スケジューラがタスクから制御を戻す方法は、task_yield()を呼ぶだけです。これは協調的マルチタスクとして知られています。 タスクはtask_yield()をコード内の異なる様々な場所、および任意の深さのサブルーチンで呼び出すことができます。 スケジューラは現在値として{最小, 最大}または実行時に残された結果として現在の番号を使用することにより、どの段階で現在のタスクに戻るかを決定します。 制御が戻されたとき、task_yield()に続く命令文の実行を継続します。コールスタックおよびプライベート変数はtask_yield()が呼ばれたときに存続されます。他のタスクの処理によってはグローバルまたはローカル変数の内容は変更されるかもしれません。 タスクはリアルタイムタスクで時間ウィンドウを取りこぼす原因を十分に避けるため、およびタイムシェアタスクで法外な期間の遮断を避けるためにtask_yield()を呼び出しを試みる必要があります。一方では、task_yield()を呼ぶ際にわずかなオーバヘッドが生じることがあり、実際に違うタスクへ切り替えが発生したときのオーバーヘッドは多少あります。 いくつかのデータへの排他アクセスを必要とする繊細な操作を行っている最中にタスクがtask_yield()を呼び出すのは避けてください。さもなければ競合状態が発生して、単一のタスクが別のタスクの操作を妨害するかもしれません。この危険性を防ぐために場合によりタスクはデータのいくつかを"施錠"または"解錠"によりマークする必要があるかもしれません。協調的マルチタスクにおいて、これら並列性問題は他の言語が対応しているプリエンプティブ・マルチタスクより問題が非常に少ないものです。 |
用例: | |
-- 言語戦争ゲームより。 -- この小規模なタスクは小型シャトルとEuphoria巨大戦艦のエナジーライフを差し引きます。 -- それは無限ループを"永遠"に実行しているように見えますが、 -- 実際はゲームがリアルタイムタスクを1.7から1.8秒ごとに呼び出します。 -- これは残りエナジーライフの3つまたは13のユニットを各秒ごとに差し引きます。 global procedure task_life() -- タスク依存: 残りエネルギーライフを引きます。 while TRUE do if shuttle then p_energy(-3) else p_energy(-13) end if task_yield() end while end procedure | |
関連事項: | task_create, task_schedule, task_suspend task_suspend |
書式: | include graphics.e text_color(i) |
解説: | テキストの前景色を設定します。いくつかのモードでは16を加えるとテキストが点滅します。利用可能な色のリストはgraphics.eを参照してください。 |
注釈: | text_color()の指定結果は、次回のテキストの出力から色が反映されます。
最後にスクリーンに出力した色はプログラム終了時にそのままになります。もしスクリーンが最下行にあり、'\n'のように何か出力しなければならないとき、テキストの色をWHITEで元に戻してからスクロールアップの準備をします。 |
用例: | |
text_color(BRIGHT_BLUE) | |
関連事項: | bk_color |
Platform: | DOS32, WIN32 |
書式: | include graphics.e i2 = text_rows(i1) |
解説: | 可能であればテキストモードスクリーンの行数をi1に従い設定します。i2には実際の新しい行数が返されます。 |
注釈: | 25, 28, 43 および 50行といった値は多くのビデオカードでサポートされています。 |
関連事項: | graphics_mode |
Platform: | DOS32 |
書式: | include machine.e tick_rate(a) |
解説: | 秒ごとの割り込みタイマ割り込みを指定します。これはtime()ライブラリルーチンの計測制度を設定します。これはタイムプロファイリングのサンプリングレートに影響を及ぼします。 |
注釈: | tick_rate()はWIN32およびLinux/FreeBSDでは無視されます。WIN32での分解能は常に100回割り込み/秒です。
PCでタイマ割り込みは通常の規定値は18.2秒ごとに発生します。tick_rate()はその回数の増減を設定できます。 tick_rate(0)は回数を通常の規定値へ戻します。プログラムでエラーが発生した場合はEuphoriaは自動的に規定値へ戻します。 DOSウィンドウ上でプログラムが規定値以外で動作するさい、time()関数はウィンドウがアクティブではないときは動作を休止します。 DOSにおけるtime()関数では割り込み回数が規定値以外であるとき通常は約1/100秒の間隔で実行される必要があります。WindowsとFreeBSDにおけるtime()は通常は非常に高速で実行されます。 ex.exe動作中は、システムは正常な時刻を保持しています。しかし、もしex.exeが異常終了した場合(すなわち、"CauseWay"...のエラーが発生したとき)、割り込み回数が高いままになり、あなた(またはプログラムの利用者)は割り込み回数を正常な値に復帰するために再起動をする必要があるかもしれません。再起動をしない場合、システムタイマは狂ってしまい非常に早く進んでしまうかもしれません。この問題はDOSまたはWindows 3.1だけで発生しWindows 95/98/NTでは発生しません。なお、再起動したときはバッテリ駆動のシステムタイマから正常な時刻を復帰します。 |
用例: | |
tick_rate(100) -- 現在time()は.01秒ごとではなく -- 通常の.055秒ごとに進みます。 | |
関連事項: | time, time profiling |
書式: | a = time() |
解説: | 固定地点からの経過秒数を返します。 |
注釈: |
time()による計測値を2回読み込んで相違を得ます。たとえば、コードの実行時間を計測して処理にかかる時間を得ることができます。 DOS32においての分解能は通常は約0.05秒です。WIN32およびLinux/FreeBSDにおいての分解能は通常は約0.01秒です。 DOS32ではtick_rate()を呼ぶことにより分解能を向上させることができます。 DOS32では通常計測可能な期間は24時間に限定されます。その後、値はtime()によって返され値のリセットが行われて計測が再開されます。tick_rate()を呼び出したならば、タイマ割り込みは通常の18.2/秒で進んでいます。このときEuphoriaはtime()により直接的にタイマ割り込み処理を継続し、大きい値の32bit変数に秒数を格納します。 Windows XP下でのDOSエミュレーションは完全ではありません。時間プロファイリング(with profile_time)をtime()関数と比べると数パーセント精度が落ちるかもしれません。この問題はWindows ME/98/95下では発生しません。 いくつかのマシンでは、time()は負数を返すことがあります。しかし、time()を別々に呼び出して経過時間を計測することができます。 |
用例: | |
constant ITERATIONS = 1000000 integer p atom t0, loop_overhead t0 = time() for i = 1 to ITERATIONS do -- time an empty loop end for loop_overhead = time() - t0 t0 = time() for i = 1 to ITERATIONS do p = power(2, 20) end for ? (time() - t0 - loop_overhead)/ITERATIONS -- power()が一回呼ばれたときの時間(秒)を計算します。 | |
関連事項: | date, tick_rate |
書式: | with trace trace(i) |
解説: | iが1また2のとき、フルスクリーンインタラクティブ命令文トレース/デバッガが有効になります。iが3のとき、命令文のトレース結果はctrace.outというファイルに保存されます。iが0のとき、トレース機能は無効になります。トレーススクリーンはiが1のときカラー表示、iが2のとき白黒表示になります。トレースは"with trace"によって翻訳されたルーチンで生じるだけであり、trace()はプログラムが"with trace"の部分を実行しない限り影響はありません。
詳しくは、第一部 - 3.1 デバッグにあるトレース・デバッグに関する全ての議論を参照ください。 |
注釈: | あなたのシステムでカラー表示で見づらいときにtrace(2)を使用します。
trace()の全ての形式はインタプリタで対応しています。 trace(3)はEuphoria → C トランスレータのみ対応しています。 |
用例: | |
if x < 0 then -- わかった。この場合ここをデバッグしたい... trace(1) -- など。 ... end if | |
関連事項: | profile, デバッグとプロファイル |