Euphoriaの問題解決のための手引き

 
動作しないとき次にできることはいくつかあります:

1. - 次のコマンドを入力します: guru
続けて問題と関連性のある語句をいくつか入力します。

例えば、
guru declare global include

2. - 一般的な問題の一覧 (後述)を調べます。
3. - 関連する説明書の一部を読みます。すなわち、 refman.doc または library.docのことです。
4. - 次の命令文を挿入してプログラムを実行してみてください:
        with trace
        trace(1)
メインの.exファイルに挿入するとプログラムの流れを見ることができます。
5. - Euphoria メーリングリスト(英語)検索システムを使用します。これにより過去の全メッセージのアーカイブを検索することができます。今回発生した問題は過去に質問された後に検討された可能性が十分あります。
6. - EUformに質問メッセージを投稿します(英語)

 
ここから一般から報告されたいくつかの問題と( P: ) 解決策( S: )の一覧となります。

P: プログラムをexwで実行後に、処理結果を読もうとしたら突然コンソールウィンドウが閉じられてしまいました。
S: コンソールウィンドウは必要なときに表示され、プログラム実行終了直後に閉じられます。これを防ぐには次のコードのようにします:
        puts(1, "\nPress Enter\n")
        if getc(0) then
        end if
これは、プログラム終了処理の最後に挿入してください。

P: プログラム実行終了後に"Press Enter"が表示されEnterキーを押す必要がありますが、これを省略するにはどうしますか?
S: プログラム終了直前にfree_console()を呼び出します。
        include dll.e
        
        free_console()

P: コンソールウィンドウの設定を変更したいです。
S: Windows95/98/Meではc:\windows\system\conagent.exeで右クリックして"プロパティ(R)"を選択します。Windows 2000以降では スタートメニュー> アクセサリ > コマンドプロンプトで右クリックして"プロパティ(R)"を選択します。これによりフォントといくつかの項目の変更ができます。

P: DOSウィンドウでex.exeを実行すると、小さなDOSウィンドウがフルスクリーンに切り替わってしまいます。
S: これはex.exeを実行後、新規に小さなDOSウィンドウが生成されたとき初回のみ発生します。Alt-Enterを押すと再びウィンドウを小さくできます。その後は切り替わることはありません。プログラムを小さなDOSウィンドウのまま実行するには次のようにします:
        if graphics_mode(-1) then
        end if
これを実行開始直前の行に挿入してくださいこれは少々画面のちらつきが発生することがあります。プログラムはフルスクリーン実行時にテキストウィンドウを強制できます:
        if graphics_mode(3) then
        end if

P: Euphoria CGIプログラムがハングアップまたは出力されません。
S: まずcgi-binディレクトリからex.errファイルを探してください。 with trace / trace(3)を有効にして実行された命令文を解析します(cgi-binにある ctrace.outを参照してください)。 without warningをプログラム先頭に挿入します。Windowsでは、警告が発生したときEuphoriaを終了する前にプロンプトを表示するとCGIプログラムがハングアップする原因になります。 WindowsではCGIプログラムの実行では常にexwc.exeを使用する必要があり、さもなければ標準出力に一切出力されないなど問題が発生します。Apacheウェブサーバでは、プログラムの1行目にシェバング(shebang)構文を記述できます: #!.\exwc.exe これにより現在のディレクトリ(cgi-bin)ではプログラムの実行にexwc.exeを使用します。Linux/FreeBSDでは最初の行の終わりの改行文字をCF+LFにすると、#!を正しく扱えなくなる原因になるため、LFにする必要があることに注意する必要があります。Linuxではex.errおよびctrace.outがサーバプロセスで書き込むことができず、結果として正常に更新されない原因となるため、プログラムの実行権限を正しく設定する必要があります。詳しくはcgi.htmを参照してください。

P: ポートを読み書きする方法は?
S: ジャック・デシェンス(Jacques Deschenes)によって開発された機械語およびDOSシステムルーチン集がありEuphoriaウェブページから入手できます。詳しくはports.eファイルを参照してください。

P: DOS32グラフィックスプログラムを実行すると問題が発生します。その後Ctrl-Breakを押すとシステムが停止したように見えます。
S: DOSまたは、WindowsではフルスクリーンのDOSウィンドウから起動を行わない限りいくつかのグラフィックスプログラムは動作しません。時々、例えばモード18のような低解像度グラフィックスモードを使用するためにプログラムソースを編集する必要があります。いくつかのSGVAグラフィックスモードはDOSウィンドウでは動作しないことがあり、MS-DOSモードでマシンを再起動すると、動作することが割ります。良質なビデオカードドライバでは、この問題は修正されていることがあります。

プログラムを終了するためにはプログラムの説明書に記載されている方法を使用することを推奨します。プログラムをCtrl+CかCtrl+Breakで中断したときはグラフィックスモードは不正なものになり色化けした画像などがスクリーンに残ることがあります。こうなってしまうとキーボードから何かを入力したり、キーボードからの入力結果を読むことが困難か不可能である場合があります。このときシステムは停止しているように見えますが、実際は違います。

次の順にDOSコマンドや操作を問題が解決するまで試みてください:

1. Alt-Enterを入力します:
通常ウィンドウ(非フルスクリーン)が再表示されます。

2. clsを入力します:
キー入力が画面に一切反映されないときでも、これにより画面を消去できることがあります。

3. exを入力します:
Euphoriaインタプリタは通常のテキストモードスクリーンへ復旧を試みます。

4. exitを入力します:
Windowsで実行しているとき、これはDOSセッションの実行を停止します。

5. Control-Alt-Deleteを入力します:
これはWindows下で現在動作中のDOSセッションを強制終了するか、またはDOSであればソフトウェアによるコンピュータの再起動を行います。

6. これら全てが失敗したならば、再起動またはコンピュータの電源を切って復旧します。 起動中にscandiskの実行がされた後にシステムが復旧します。

P: EuphoriaプログラムをSVGAグラフィックスモードで実行するとき、スクリーンに対しての出力がスクリーンに上部に押し込まれて表示されてしまいます。
S: 試してください: machine.eに記述されているuse_vesa(1)

試しに最新のビデオカードドライバをインターネットからダウンロードして導入しなおしてください。

ATI(現AMD): http://www.amd.com/jp-ja/

Nvidia: http://www.nvidia.co.jp/page/home.html

Intel: http://www.intel.com/

Matrox: http://www.matrox.com/jp/

S3 Graphics(現VIA) http://www.s3graphics.com/en/index.aspx

また、最新版のDirectXをインストールすることでビデオカードの他の問題が解決することがあります。

P: 作成したプログラムがDOSウィンドウを汚い状態にしたままにしてしまいます。これを通常のテキストウィンドウと一緒に消去したいのですが。
S: プログラム完了後に、graphics_mode(-1)関数を呼び出して DOSウィンドウの設定を行い通常の状態に復帰する必要があります。すなわち、
        if graphics_mode(-1) then
        end if

P: エディタからプログラムを実行した後にCtrl+Cを押すと、プログラムがオペレーティングシステムのエラーにより停止してしまいます。
S: これは既知の問題です。Ctrl+CまたCtrl+Breakを押す必要があるようなプログラムを実行するときはエディタからではなくコマンドラインから実行してください。

P: プログラムを実行しましたがエラーが発生せず何も起こりません。
S: 恐らくメインの手続きを呼び出し忘れています。実行開始するにはメインの手続きを呼び出しますが、上位命令文の後にメインの手続きが必要となります。

P: library.docで解説されているルーチンを呼び出そうとしましたが、ルーチンが宣言されていない(routine has not been declared)というエラーのままになります。
S: euphoria\includeディレクトリにある必要な.bファイルのインクルードを忘れていませんか? 例えばルーチンを記述する場合の文法が"include graphics.e"であるならばルーチンを最初に呼ぶ前に"include graphics.e" (クォートを除く)をプログラムに記述する必要があります。

P: インクルードファイル内のルーチンを呼び出したいのですが、ルーチンを呼び出そうとしてもルーチンが宣言されていない(routine has not been declared)というエラーになります。宣言したはずなのに。
S: そのルーチンはインクルードファイル側で"グローバル"ルーチンとして宣言することを忘れていませんか?"グローバル"ではないルーチンは、そのルーチンが含まれているファイルの外側では不可視となります。

P: 利用者からテキストを一行入力してもらうには?
S: library.docで解説されているgets()を使用します。gets(0)は通常、標準入力から1行読み取るためにキーボードを使用します。常に行末には\nが付加されます。なお、\n文字を取り除くには:
        line = line[1..length(line)-1]
その他にもget.eにあるprompt_string()を参照してください。

P: gets()により利用者から文字列を入力後に、次行としてスクリーンの出力がは左端から開始されません。
S: プログラムで改行文字を出力する必要があります。すなわち、gets()の後にputs(SCREEN, '\n') を実行します。これは自動的に行われません。

P: なぜ浮動小数点計算の結果が正確なものにならないのですか?
S: x86 CPUと多くのCPUは、端数を表すために2進数を使用します。例えば0.1や0.01および、それらと近い数の10進数小数は正確に表現することができません。例えば、0.1は0.0999999999999999として内部に格納される場合があります。この意味は 10 * 0.1が0.999999999999999という結果になる場合があり、さらにfloor(10 * 0.1)は1ではなく、0になる場合があるというこを予測できません。そのため会計処理をしているとき厄介ですがこれはEuphoria側の問題でありません。これは大部分のプログラミング言語で直面する一般的な問題です。絶対忘れないでください : 浮動小数点数は数学における"本物"の数値に近いです。どのような浮動小数点計算であっても結果として微小な誤差が発生すると思ってください。この問題は場合により四捨五入を行うと解決することができます。すなわち、x = floor(x + 0.5)によりxは最も近い整数に四捨五入されます。ペニー通貨を整数値として格納するより、ドル通貨(または類似通貨)を小数として扱ったほうが有用ですが、いくつかの計算でまだ問題が発生する場合があります。

P: 数値を文字列へ変換するには?
S: library.docにて解説されているsprintf()を使用します。すなわち、
        string = sprintf("%d", number)
%dのほかに、他の形式の使用を試すことができます。例えば%x (16進数) または %f (浮動小数点数)などがあります。

P: 文字列を数値へ変換するには?
S: library.docにて解説されているvalue()を使用するか、ファイルまたはキーボードから読み取るときはget()を使用します。

P: forループ変数が再定義されているとエラーがでます。
S: forループ変数は自動的に宣言されます。どうやらルーチンまたはプログラムの最初で、同名の変数が宣言されているようです。よって、それ以前の宣言を除去するか、ループ変数名を変更してください。

P: ファイル名を指定をしようとした行で"unknown escape character"というエラーメッセージを返されました。
S: "C:\TMP\MYFILE"と記述できません"C:\\TMP\\MYFILE"と記述する必要があります。例えば\n\tといったようにバックスラッシュはエスケープ文字として使用されています。文字列内で単一のバックスラッシュを指定しようとするときは\\と入力する必要があります(訳注: なお、この問題はShiftJISでも悪名高い5C問題として発生するため、ShiftJIS文字列を扱うときは文字列を"文字"ではなく'数値'で表現された2次元シーケンスとして扱う関数を組むことで回避できます)。

P: SVGAグラフィックスモードでマウス入力を使おうとしましたが動作しません。
S: DOSにおいてグラフィックスモード18以上のモードではマウス入力は対応していません(640x480 16色)。 DOS 7.0 (Windows 95/98の一部)は高解像度モードで最低でもx, y座標とボタンの情報を取得できるようですが、自前でマウスポインタを書く必要がある場合があります。この問題はグレーム・バーク(Graeme Burke), ピータ・ブルー(Peter Blue)および他の方々により良い解決方法が用意されております。このファイルについてはEuphoriaウェブページを参照してください。

P: 文字列の表示に printf()を使用しようとしましたが最初の文字だけしか出力されません。
S: printf()の詳細はlibrary.docを参照してください。さて、このままでは単一の文字の値として扱われてしまうため、そのまま文字列を出力したいときはブレースブラケットで括る必要があります。すなわち、これを:
        printf(1, "Hello %s", mystring)
こう記述する必要があります:
        printf(1, "Hello %s", {mystring})

P: print()または?で数値を表示するとき10の有効桁数だけしか表示されません。
S: 通常はEuphoriaでは約10桁のみ表示します。内部では、全計算は最低15の有効桁数を使用して実行します。printf()では桁数をより多く表示することができます。例えば、
        printf(1, "%.15f", 1/3)
これで15桁表示になります。

P: ルーチンの宣言で"a type is expected here(予想できない型)"といった文句を言われます。
S: サブルーチンの引数を宣言したとき、Euphoriaは引数ごとに明確な型を要求します。すなわち、
        procedure foo(integer x, y)         -- 誤り
        procedure foo(integer x, integer y) -- 正しい
その他全ての文脈として、このようなリストは許されています:
        atom a, b, c, d, e

P: いくつかの変数をルーチン内の中間に宣言しましたが文法エラーになります。
S: 全ての実行可能な命令文の前に、プライベート変数は全てサブルーチンの開始直後に宣言する必要があります(プログラムの上位であり、全てルーチンの外側であれば、どこでも変数を宣言することはできます)。

P: エラーが返されました:
文法エラー - 'yyy'ではなく'xxx'を参照する可能性があります (Syntax Error - expected to see possibly 'xxx', not 'yyy')
S: この時点でプログラムの片付けされた変数、キーワード、数値または句読記号のいずれかであるyyyは、それが使用前に存在しないため構文上は適切ではありません。コンパイラはyyyの代わりに、この時点で受け入れることのできる何かの一例として、xxxを提示します。この時点で、xxxはその他多くの合法な(そして以前より良い)ものある可能性があるということに注意すべきですが、少なくともコンパイラはxxxを"考えるため"の手がかりとして提示する場合があります。

P: EuphoriaをDR-DOSで実行しようとしましたが問題があります。
S: config.sysにはEMM386.EXEではなくHIMEM.SYSが記述・設定されている必要があります。

P: exwでプログラムを実行しようとしましたが "this is a Windows NT character-mode executable(これはWindows NTコンソールモードで実行可能です)" と表示されて実行できません。
S: exw.exe32bit Windowsプログラムです。これはWindowsかDOSウィンドウで実行する必要があります。そして生DOSといった古いシステムでは動作しません。ex.exe生DOSで動作します。