FreeBASIC LangQB
FreeBASIC は、言語互換モードを変更するために使う、-lang コマンドライン・オプションを導入しました。
コンパイル時に -lang qb オプションを使うと、最も QB 互換性のある構文解析ツールを選択できます。
以下にリストされている相違のすべては、-lang qb を使ったことを前提としています。
(-lang qb を使っても、完全に QB 互換になるわけではなく、下記の差異は生じる、という意味です。)
アーキテクチャ/プラットホームの非互換性
-
FreeBASIC は、32ビットのオペレーティング・システムと、32ビットの DOS 拡張のために書かれています。16ビットのDOS、16ビットのアセンブリ、または16ビット・メモリ・モデルに依存するコードを、利用できません(segment & offset, XMS/EMS, ...)。
-
DEF SEG は、もう必要なく、また働きません。 - この方法で、ビデオメモリに POKE する、いずれのコードも、もう機能しません。しかし、DOSに関しては、DPMI 機能を使って、容易にそれを書き直すことができます。
-
CALL INTERRUPT は、もう機能しません。これは、16ビットの DOS を当てにするからです。
DOS 中断は、DOS32バージョンで、DPMI ライブラリを使用することによって、呼ぶことができます。しかし、プロセッサが、32ビット-16ビット-32ビットのモード変更を行うため、動作が遅くなるでしょう。
あいまいさのための変更
-
同じ名前と接尾語を持つ、スカラ変数と配列は、同じ名前を共有できません。
-
SHARED は、SUB か FUNCTION の中で使用できません。
SHARED が、主プログラムで定義されない共用変数をもたらすことになるからです。
主プログラムで、適切な DIM SHARED を使わなければなりません。
-
COMMON 宣言は、宣言される順番に依存しません。そして、変数は名前によって照合されます。そして、この理由で、命名された COMMON はもうサポートされません。
すべての COMMON 配列は、FB では、可変長の配列です。
-
一行の IF が、THEN の直後にコロン(不要)を持っていると、FB では、END IF で終えられなければなりません。
その不要なコロンを取り除くと、FB は QB として振る舞います。
設計の相違
-
描画サポートは内部的に再設計されました。GfxLib の概要 を参照下さい。
-
CLEAR は、すべての変数をリセットして、スタックを設定するためには、もう使用されません。
変数は、ひとつずつリセットしなければなりません。そして、スタック・サイズは、コンパイラ・コマンド・ラインで変えることができます。
キーワード CLEAR は、FB では、メモリーを満たすために使用されます。
-
文字列 DATA 項目は、FB では引用符で囲まなければなりません。QBでは、これは任意でした。
-
すべての関数は、宣言されなければなりません。FreeBASIC の CALL があってもです。
CALL について、QuickBASIC では、プロト型なしの関数を呼び出すことは、可能でした。
(これは、将来 -lang qb でサポートされるべきです)
-
FreeBASIC では、すべての配列を、明示的に宣言しなければなりません。
(インタープリタの QuickBASIC の配列は、最大 10 の添え字で、自動的に作成されました。)
- fbc バージョン 1.20.0 以降の STRING*N 型の固定長文字列を除く文字列は、Cライブラリや Windows API との互換性を保つためにヌル(char 0)終端を使用するため、そのような固定長文字列は chr$(0) 文字を含むことができない。
-
C ライブラリと Windows API と互換性のために、文字列は、ヌル(文字 0)の終端識別を使用しています。固定長文字列は、当分 chr$(0) 文字を含むことができません。
- fbc version 1.20.0 以降の STRING*N 型の固定長文字列を除く固定長文字列では、TYPE フィールドであっても、FreeBASIC は LEN に 1(ヌル文字)を足した値を実長として与えます。
-
INKEY[$] が拡張キー(Num Pad、矢印...)を読むとき、2文字列を返します。
FB では、先頭文字は、CHR[$](255) です。QB では、この最初の文字は、CHR$(0) です。
-
固定長文字列で、FreeBASIC は LEN プラス 1(ヌル文字)として、本当の長さを与えます。TYPE 項目の場合でもです。
- fbc バージョン1.20.0以降、STRING*N 型の固定長文字列以外の固定長文字列が宣言され、まだ初期化されていない場合、FreeBASIC でも QB でも、すべての文字は 0 に設定されます。fbc バージョン1.20.0以降、STRING*N 型の固定長文字列が宣言され、まだ初期化されていない場合、すべての文字はスペースに設定されます。
-
FreeBASICでは、固定長文字列の未使用の文字は、0 で設定されています。どの "-lang" コンパイラ・オプションを使った場合も、同じです。
QBでは、未使用の文字は、32(ASCIIで、スペース または " ") で設定されています。
-
固定長文字列が宣言されて、まだ初期化されていないとき、すべての文字は、0 に設定されています。FreeBASIC と QB の両方で同じです。
-
配列は、FB では、行優先順で保存されます。QB のデフォルトでは、列優先順で保存されました。
行優先順:
最後のインデックスが同じデータは、隣に並びます。
列優先順:
最初の索引が同じデータが隣に並びます。
例えば、DIM A(1 TO 3, 1 TO 8) が、あるとします。
行優先順では、メモリで、A(3,5) のあとに、A(3,6) が続きます。
列優先順では、メモリで、A(3,5) のあとに、A(4,5) が続きます。
-
コマンドラインで、-e か -ex か -exx オプションを使わない場合、プログラムは、ランタイム・エラーで止まりません。
このオプションを使うと、QB スタイルのエラー処理 (ON ERROR, RESUME...) を実現できます。
-
8進数は、 &o... と書いて下さい。
QB では、8進数を、 &o... か &... と書くことができましたが。
-
FB では、Sub/Function 内の FOR ループは、カウンタとして 引数を byref で受けません。
局所変数を使用しなければなりません。
-
FB の LOCATE は、カーソルの形のための 4番目と 5番目の引数を尊重しません。
-
FB の SCREEN (Graphics) は、可視性の切り換えと、作業ページを、許容しません。
代わりに SCREENSET を使用します。
-
FB の COLOR は、枠線色のための 3番目の引数を許容しません。
-
FB の TIMER は、コンピュータが始動してからの、秒の数を返します。QB の TIMER は、真夜中から数えた秒の数を返します。
(Win32 と Linux の場合のみ:
真夜中で、秒はリセットされません!)
-
QB では、文字列の中の chr$(13) は、PRINT したとき、CR+LF になります。
FB では、CHR(13) は、その文字コードが意味する CR だけを印刷します。
-
EOF を、空の comms(通信) バッファを検出するために、使用できません。
FB では、空のバッファは、LOC を 0 と比べながら、テストします。
また、RANDOM か BINARY モードで開かれたファイルでは、EOF は、ちょうどそのファイル・サイズを読み終えると、非ゼロを返します。Eof を参照下さい。
-
整数変数は、FB では、オーバーフロー・エラーを警告しません。-ex オプションを選択しても、同じです。
QB のコードで、整数オーバーフロー・エラーを取得して分岐するようなコードは、FB では働きません。
古いコマンド
-
BSAVE と BLOAD は、FB では、画面か描画のバッファを、保存して、検索するためだけに、使用できます。
これらは gfxlib が繋がる場合にだけ、働きます。gfxlib は、描画画面モードが、プログラムのどこかで要求されると、つながります。
コンソールは、BSAVE で保存できません。また、BLOAD で検索できません。
BSAVE-BLOAD のもう一方の用法、完全な配列を、保存して、読み込むことは、GET と PUT を使って、容易に達成できます。
-
実行時の項目の定義のための FIELD 命令文は、横にどけられて、使えません。
FB のキーワード FIELD は、TYPE 変数で、項目配置を指定するために、使います。
-
PC Speaker コマンドはもう機能しません:
SOUND か PLAY 命令文へのどんな参照も、エラーになります。
この機能をまねる、利用可能な第三者ライブラリがありますが、それは FreeBASIC には含まれていません。
-
模倣のイベント駆動型プログラム(ON KEY、ON PEN、ON STRIG、ON TIMER)は、もう働きません。
これらは、個々のライブラリで代用することができます。
-
QB4.0 以前のマイクロソフト独占の浮動小数点形式(MBF)をサポートする、MKSMBF$ とすべての MKxMBF$ コマンドは、実装されません。
-
関数に渡す引数に丸括弧を使って、値渡しをまねることは、受入れられません。
CALL の気まぐれで、すべての引数が、値渡しする結果になることは、もう有りません。
適切な BYVAL と BYREF キーワードを使用しなければなりません。
-
FILES は実装されません。
代わりに、PDS 7.1 コンパチブルの、DIR[$] を使用できます。
-
IOCTL と ERRDEV と ERRDEV$ 、ハードウェアにアクセスする、低レベルの関数は、これらが OS 依存なので、実装されません。
-
行内マシン・コードを実行するための、CALL ABSOLUTE は、もうサポートされません。
代わりに、行内アセンブラ・コマンドを挿入する ASM...END ASM ブロックを使用できます。
または、ASM... 1行コマンドを使用します。
ページ歴史:2023-07-09 00:53:59
日本語翻訳:WATANABE Makoto、原文著作者:JasonFirth