FreeBASIC マニュアルのトップに戻る

FreeBASIC TutPortingFromQB

目次→教本→いっしょに学ぼうCompiling a Big QB program in FB←オリジナル・サイト

大きな QB プログラムをFB でコンパイル 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る


2番の結果 QB と FB の互換性を確認するために、QBの大きな(4,000行以上)描画プログラムを FreeBASIC でコンパイルしてみましょう。

例として Jark の TCRay を使います。これは、2004年のプログラムで、2次曲面、立方体、二次式の形を備えた、パーリンノイズ(perlin noise)を持つ素晴らしい光追跡です。

渡辺注:Wikipedia によると、パーリンノイズとは、コンピュータ描画でリアリティを増すために使われる、物の表面の質感を表す技法。見た目は擬似乱数的ですが、細部のスケール感が一定になります。
パーリンノイズを理解する:
https://postd.cc/understanding-perlin-noise/

下記の URL で、TCRay.zip を手に入れることができます。
http://www.petesqbsite.com/downloads/graphics.shtml
渡辺注:下記URLは、生きています。
右の画像は、TCRay.zip を解凍してできる tcray21c.exe を実行して、オプションの2を選択した結果です。
画像選択メニュー
http://www.siteadvisor.com/sites/petesqbsite.com/downloads/startat180/
http://www.petesqbsite.com/downloads/TCRay.zip

注意:TCRay は QB4.5 インタープリタで動かすプログラムです。Jark は、このプログラムを自分でコンパイルする忍耐力がありませんでした。
彼は、ただインタープリタでこれをテストして、機能を加え続けました。

プログラムは、3つのファイルで構成されています:
TcRay21C.bas - メイン・ファイル。
TcLib17L.bas - SVGA 描画ライブラリ。
Tclib17.bi - ライブラリのためのインクルードファイル。

TCLib17.bas を移植

TCLib17.bas で
これは「純粋なQB」SVGAライブラリです。
関数の大部分は、QB スタイルのキーワードで実装されていますが、FB では廃止されています。
私は、このライブラリの開発に携わりましたので、この部分について、私を信頼して下さい。 ;)

ClearScreen Sub の内容をコメント・アウト(無効化)して、CLS を加えてください。
CLS

Point24 sub の内容をコメント・アウト(無効化)して、以下を加えてください:
a& = Point(x%,y%)
red% = a& Shr 16
green% = (a& Shr 8) And 255
blue% = a& And 255


Pset24 sub の内容をコメント・アウト(無効化)して、以下を加えてください:
PSet (x%,y%), red% Shl 16 Or green Shl 8 Or blue

Screenshot sub の内容をコメント・アウト(無効化)して、以下を加えてください:
BSave Name$+".bmp"

SelectVga sub の内容をコメント・アウト(無効化)して下さい。 私たちは、ほとんどの pc がサポートする、固定サイズを使います。
SetText sub の内容をコメント・アウト(無効化)して下さい。私たちは、HiRes 描画に文字を表示できるので、モード切替は必要ありません。

最後の 2乗の計算を除いて、SetVGA Sub の内容をコメント・アウト(無効化)して下さい。そして、下の 4行を加えてください:
Screen 20,32 '1024x768, 32 bits
scrheight=768
scrwidth=1024
Fullscreen



TCRay17.bas で
Menu sub の最初の行として SetSVGA を加えてください。
(私たちは、モードを切り換えていないので、文字を表示する前に、モードを設定しなければなりません。)

コンパイルする
OK、私を信じるのを止めて、今、あなたは、コンパイルを開始できます。
あなたは、いくつかのエラーを受け取るでしょう。

下のように、コンパイルしてください。
fbc -s gui -w 1 -lang qb TcRay21C.bas TcLib17L.bas

私はあなたに警告します。2つを除いて、必要なすべての変更は、FB 構文のいくつかの(賢明な)制限から来ています:

TCLib17.bi で
ERROR: Duplicated definition, found 'RGB' (RGB は、FB のキーワードです)
追加:
#undefine RGB
エラーを表示した行の前に。

ERROR: Duplicated definition, found 'ScreenRes' (ScreenRes は、FB のキーワードです)
追加:
#undefine ScreenRes
エラーを表示した行の前に。

ERROR: Duplicated definition, found 'Name' (Name は、QB のキーワードです)
追加:
#undefine Name
エラーを表示した行の前に。


TCRay17.bas で
ERROR: Duplicated definition, found 'Acos' (Acos は、QB のキーワードです)
追加:
#undefine Acos
エラーを表示した行の前に。

ERROR: Argument count mismatch Clear (CLEAR は、FB では必要ありません。このキーワードは、再利用されました。(賢明な決定でない?))
CLEAR を、'コメント・アウトしてください。

ERROR: Illegal specification, at parameter 2 (Type) of Init.Cubic() (Type は、QB のキーワードです)
私たちは、これを非定義にします。このため、type$ を検索して、_type$ に置換してください。

ERROR: Expected 'END IF', found 'END' END FUNCTION
これは、FB に導入された気まぐれによって引き起こされた、エラーです。
THEN の後ろの、コロンを持っている一行の IF は、ENDIF を必要とます。これは、マクロと関係がある...
What reason had Jark to put colons past his THEN's escapes me.
どんな理由で、Jark が、THEN にコロンを置いたか、過去のことで、私は分かりません。
QB は、これを全く必要としません。そして、FB は、これがないことを想定して振る舞います。
THEN キーワードの後の、すべてのコロンを取り除いてください。
THEN : を検索して、THEN に置換して下さい。

ERROR: Array access, index expected, before '=' xn = x * x - y * y + zx0
xn という名前の配列と、xn という名前の変数があります。
コンパイルしたとき、エラーの行で、xn を _xn で置き換えてください。

同じエラーが、x0 であります。x0 という名前の配列があります。
コンパイルしたとき、エラーの行で、xo を _xo で置き換えて下さい。

ERROR: Array access, index expected, before '*' dadY = Amplitude * dAdR * drdY. Amplitude と同じ問題。
コンパイルしたとき、エラーの行で、Amplitude を _Amplitude で置き換えて下さい。

Ok。 これで、すべてのモジュールがコンパイルされます。
私たちは、続いて、いくつかのリンカ・エラーを修正します。


リンカ エラー
コンパイルした後、リンカは、すべてのモジュールをランタイム・ライブラリに結びつけて、あらゆる sub/function の最終アドレスを見つけて、これらのアドレスで呼び出しでラベルを置換します。
sub/function がコードで呼ばれますが、sub/function を探してどこにも無ければ、リンカは、文句を言って、問題となっている sub/function の名前を、私たちに与えます。
これは、行番号を、私たちに与えることができません。リンカは、ソースで動作しないからです。このため、私たちは、問題がどこで起っているかを見つけるために、テキスト検索をしなければなりません、
リンカは、"押しつぶされた"関数名を返すことに、注意して下さい。渡されたパラメタのアンパーサンド(&)とサイズは、最後に加えられます。このアンパーサンドと、その後ろを、無視してください。

TcRay21C.o:fake:(.text+0x174d): undefined reference to `LINE24@20'

プログラムで、未定義の Line24 sub への呼び出しが起きます。あなたは、Draw.Axis の中で、この呼び出しを見つけることができます。TCRay21.bas で、sub を一度も呼んだことがありません。
(あなたは、これを検索して確認できます)

また、たぶん、QB4.5 コンパイラも、これに関して文句を言うでしょう。
(思い出して下さい: このプログラムは、QB4.5 で決してコンパイルされませんでした。)
sub Draw.Axis の内容を、コメント・アウトして下さい。

TcRay21C.o:fake:(.text+0x181b3): undefined reference to `FFIX@0'

Ffix は、QB4.5 のための、v1ctor の、役に立つ浮動小数点パッチでした。
これは FreeBASIC で必要ありません。
tcray21c.bas の、宣言のすぐ後で、これを呼ぶ行を、コメント・アウトして下さい。

そして、これですべてです。プログラムは、コンパイルして、動作します。
4000 + 行にしては、それほど多くの変更ではなかったですよね...

楽しんでください!
いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2018-02-11 11:49:58
日本語翻訳:WATANABE Makoto、原文著作者:AntoniGual

ホームページのトップに戻る

表示-非営利-継承