◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ ◆      BASICでプログラムを組むとき注意してほしいこと      ◆ ◇                     1月16日(月)  by 渡辺 良一 ◇ ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆   この文章は、J−TYPEの目次表示を意識して作られています。 ▽まえがき   この文章は、フリコレのBASICで作られたプログラムを見ていて、気づいた  ことを書いてあります。ここに書いてあることはどれも初心者向の基本的なことけ  ですので(自分も一応初心者ですが………)、上級者にとっては当たり前の事を書  いています。(一部、自分のおすすめを書いてあるものもあります。)   この文章は、転載・配付などを自由に行ってくれて結構です。ただし、著者はこ  こに書いてあることについて一切責任を負いませんし、著作権は放棄いたしません。 ▽プログラムは見やすく   プログラムは見やすくしましょう。処理の様子を秘密に(分かりにくく)したい  場合以外は、段下げなどを行って見やすくしましょう。   そうすれば、自分で手を加えたい(改版)したい場合や、他人がプログラムを解  読してプログラミングの勉強をしたい場合に処理のまとまりが分かりやすくなりま  す。   また、分かりづらいところは注釈を入れましょう。注釈を入れる場合  「cls :'画面クリア」とする人がいますが、「:」は不要で、「cls '画面クリア」  とすることが出来ます。  ★ラベル    プログラムで分岐するとき、分岐先を行番号で指定するプログラムがあります   が、はっきり言います。いますぐやめましょう。    ショートプログラムならまだしも、ある程度大きなプログラムになってくると、   行番号では、分岐先の役割が分かりにくくなりますし、もしかしたら今後のF−   BASIC386のバージョンアップで実現するかもしれない、行番号なしのプ   ログラム編集に対応できません。    処理のまとまりごとに、コメント文をおいて隙間を開けるのもプログラムを見   やすくするひけつです。    また、F−BASIC独自の機能として日本語ラベルが可能です。日本語ラベ   ルを使えば、ラベルの後にサブルーチンの説明をコメントとして書くという必要   がなくなり、分岐元でもどんな処理のために分岐しているのかが分かるので日本   語ラベルを積極的に使用しましょう。   (ラベル名が長くなるという欠点もありますが。)  ★変数    プログラム全体で使用する変数に、1文字の変数は出来るだけ避けた方がいい   でしょう。(プログラム全体で使用しているからこそ、逆に短い名前の変数を付   ける場合がありますが………。例えば X,Y)また、変数名は変数の役割の略称や   頭文字にするのがいいでしょう。例えば色を指定する変数は「col」にするなど。    また変数表を付けておくと、プログラムを解析を能率良く行ったり、手直しを   容易に行うことが出来るでしょう。 ▽初期化   プログラムを書くとき、一番最初に初期化という作業をします。初期化とは、そ  のプログラムを動作するための環境をしっかりと整えておくことです。具体的には、  メモリ初期化、画面初期化、変数初期化(宣言)、音色初期化……………などなど  プログラムをスタートさせる前に様々なことを初期化しなくてはなりません。フリ  コレの中のプログラムを見ていると、これがしっかり出来ていないものがあります。   コンパイルしたものなら大抵はコンパイラが初期化の部分を付け足してくれます  が、インタプリタではそうはいきません。   前のプログラムを実行した環境が残っていることがあるので、うまく動作しない  場合があります。また、プログラムを終了するときには画面を初期化をするように  心がけましょう。  ★メモリ初期化   ・使用命令     clear,,スタック,配列変数,プロシジャ,DLL    メモリをしっかり初期化しないと、メモリ不足でプログラムが動作しなかった   り、予定したととおりに動作しなかったりします。    よく「clear」だけや「clear,,,200000」とか「clear,,,,1024」となっていた   りしますが、値を省略すると前の設定と変わらないので、その前に実行したプロ   グラムが動画ファイル再生プログラムだったりすると、400KBぐらいのDLL   領域が、そのまま残ってしまいます。使わない領域はしっかりと0を指定するこ   とが大切です。     clear,,1024,,0,0    また配列変数領域はDIMで宣言する配列変数のための領域ですから、そのプ   ログラムで使用する大きさは大体わかります。その大体の領域を指定します。正   確に〜バイトまで調べてもいいのですが、そうすると計算ミスが起こったり予想   外の部分で足りなくなったりします。    配列変数領域で使われなかった領域は、単純変数領域に使われます。    領域の使用目的は次のとおりです。     単純変数領域 …………… 文字変数すべてと配列変数でない数値変数     配列変数領域 …………… 配列文字変数の管理用と配列数値変数とその管理  ★変数型宣言    変数型宣言を説明する前に数値変数の型について説明しておきます。    変数には必要に応じていろいろな種類ものがあります。それを変数の型と言い   ます。    変数の型は始めは意味が分からず読み飛ばしてしまうのですが(自分がそうで   した)、実はとても重要な事なのです。変数には使用する目的によって、型が分   けられています。   ◇整数型     −32768〜32767の範囲の整数です。     変数をこの型にするには、変数名の後ろに「%」を付けます。     大抵の変数はこの型を使用します。これより大きな数を代入する場合はロン    グ整数系を用います。   ◇ロング整数型     −2147483648〜2147483647の範囲の整数です。     変数をこの型にするには、変数名の後ろに「&」を付けます。     整数型で間に合わない大きさの数値を代入するのに用いる。   ◇単精度実数型     少数を代入するときに使用します。有効桁数が7桁までです。     変数をこの型にするには、変数名の後ろに「!」を付けます。   ◇倍精度実数型     少数を代入するときに使用します。有効桁数が16桁までです。     変数をこの型にするには、変数名の後ろに「#」を付けます。     少数演算で精度を必要とするときはこの型がいいでしょう。    このように数値変数はいろいろな種類が別れています。では、なぜいろいろな   種類に別れているのでしょうか? なぜ必要に応じて使い分けなければならない   のでしょうか? みんな倍精度整数変数じゃいけないのでしょうか?    この答えには、それぞれの型に必要なメモリが係わってきます。 |               1つに必要なメモリ        整数型 ………………… 2バイト     ロング整数型 ………………… 4バイト     単精度実数型 ………………… 4バイト     倍精度実数型 ………………… 8バイト    たいして違わないと思わないでください。確かにただの変数ならたいした違い   にはなりませんが、配列変数を考えてみてください。せいぜい1000位までの   整数しか保存しない1000の要素を持った配列変数に、整数変数と倍精度実数   変数を使った場合どうなるのか?    整数変数を使った場合は使用するメモリは2バイト×1000=2000バイ   ト。倍精度実数変数を使用すると8バイト×1000=8000バイト。6000   バイトもの差がでます。    ついでに説明しておきますがプログラムには変数のほかに定数というものもあ   ります。定数とはプログラム中直接記述してある数値のことで「A=10*B」ならば   このときの「10」が定数です。定数も定数の後ろに「% & ! # $」を付けることで   変数の型を宣言することが出来ます。    ちなみに、BASICでは定数を宣言することは出来ないので「A=10」として   も、「A」は変数として扱われます。    さて、ここで出てくるのが変数型宣言です。変数型宣言とは何なのでしょうか?    変数には、型の指定されていない変数(変数名の後ろに何の記号もない変数)   があります。これは、標準では単精度実数型と見なされます。型の指定されてい   ない変数の型を決めるのが変数型宣言です。これを宣言する命令は次のようなも   のがあります。      defint ………………… 整数変数      deflng ………………… ロング整数      defsng ………………… 単精度実数変数      defdbl ………………… 倍精度実数変数     (defstr ………………… 文字変数)    使用例として、「defint a-z」とすると変数名の最初がA〜Zまでの文字で始   まる型の指定されていない変数が整数変数と見なされます。「時間」という日本   語変数も宣言したい場合は「defint a-z,時」とします。こうすれば、「時間」と   いう日本語変数も整数変数として見なされます。    以前、フリコレのプログラムを見ていて『要RAM4M』とあるプログラムを   実行してみました。自分のパソコンはRAM2Mなのでメモリが足りないとエラ   ーが出ました。次に行の最初の方に「defint a-z」を追加し、clearで変数   の領域の調整したらすんなり動いてしまいました。    こんなこともあるのです。しっかり変数の型は使い分けましょう。    ここで注意してほしいのですが、整数型で変数を宣言してしまい、ついうっか   り整数型の範囲を超えるような数値が代入されプログラムが中断することがある   ことです。    このようなことが起こらないように、その変数の最後に「&」を付けてロング整   数にします。TIME関数(0時0分0秒からのトータル秒数を返す関数)を代   入する変数や得点をカウントする変数などがそうです。特に得点などのように常   に増えていくようなものは、変数の範囲を超えてしまうとその場でエラーが出て   プログラムが止まってしまいます。また変数の範囲を超えなくても、表示の対応   していない範囲までに数値が大きくなると表示が変になってしまいます。例えば、   「print using"####";SS」としているのに、SSに9999より大きい数を与えるだけ   で表示がバグってしまいます(-999より小さな数を与えてもそうなります)。こ   の場合は「if SS>9999 then SS=9999」とするなどしましょう。これらをしっかり   しておかないと、思わぬところでエラーが出てプログラムが中断したり、予定ど   おり表示されなかったりします。ロング整数型でも「まず無いことだから」とか   言わないで、しっかり一定の範囲を超えないようにしましょう。    前にフリコレ7のBASICで作られた某大作RPGをやっていたら、最後の   面の1つ手前の面をやっていたときに突然エラーが出てプログラムが終了してし   まいました。エラー番号から原因を調べたところ、それまでの面を完璧にやって   いたために得点が増えすぎて、その結果エラーが出て終了したことが分かりまし   た。結局は、セーブデータに手を加えて得点を減らしてエンディングを見たわけ   ですが…………。(結構セーブデータの解析は好きで、ゲームいつ詰まるとすぐ   に解析するという力技で対処しています。もう、3つのフリーソフトのゲームの   セーブデータを解析しました。そのうち1つは、プロテクトが掛かっていたので   BASICでデータ作成ツールなるものを作ってしまいました。そう、セーブデ   ータが44バイトのあるゲームです。)このゲームはとてもBASICで作った   とは思えないほどすごいゲームなのですが、このようなミスがあるためにエンデ   ィングが見られなかった人がいるのではないでしょうか?    このように、せっかくのゲームがだいなしに近い状態になってしまうこともあ   ります。使用する変数の型には注意しましょう。 ▽ディレクトリについて    ファイルを指定するときに、『A:』や『\』 など固定で読み込んでいる場合が   あります。これをすると、フリコレに応募したときや、ハードディスクの任意の   ディレクトリにインストールした場合は(関係ないがバードディスクが欲しい)、   AドライブならAドライブに、ルートディレクトリならルートディレクトリにコ   ピーしないと動かず、「試しに起動してみよう」とかしてもらえなとなっちゃい   ますよ。(固定で読み込んでいる人に限って、「どこどこににコピーして使用し   てください」って書いてないんだよなー)    だからといって一つのディレクトリに全てのファイルを置くのは、ちょとどう   かなと思います。    では、ファイル指定の例をあげます。     ・ルートディレクトリの『game.cfg』           \game.cfg     ・現在のカレントディレクトリ中の『data』というディレクトリの下の      『name.txt』というファイル data\name.txt     ・『\demo\data』がカレントディレクトリのとき、      『\demo\graphics\river.tif』というファイル           ..\graphics\river.tif    現実にTownsMENUのマニュアルにはファイル・ディレクトリに関する   詳しい説明がない。(家はV2.1L20なので他は知りませんが、あったとし   てもたいしたことないと思う)    とくに、ディレクトリ構造は、難しいのに少しも触れていません。    ぼくは、これを買う前に使っていた学校のFMR50で、MS−DOS Ver3.1   を使用していて、DOSの基本的なことはマニュアルを読んでほぼ理解していた   のでTOWNSを買ったとき、たいした苦労をしなくてすみました。    でも、TownsMENUのマニュアルによは丁寧に書いてある、MS−DO   Sのマニュアルですら、ディレクトリ構造のところにきたらてんで分からなくな   った覚えがあります。結局、ファイル管理ツールなどをいじっているうちに、分   かりました。    だから、分からない人はファイル管理ツールでも手に入れて実際に使ってみる   といいでょしう。手に入らない人は、ディスクを送ってくれればぼくの持ってい   るフリーソフトのファイル管理ツールをコピーしてあげます。連絡先は最後にあ   ります。    アプリケーションや、GUIの説明もいいですが、基本的知識や、CUI(コ   マンドモード)がせっかくあるのに、説明がなくてはまさに宝の持ち腐れです。   バッチファイルを使えば、いろいろな事ができるのに、それについても全く説明   がありません。    始めて触れて買ったパソコンがTOWNSだという人はこのマニュアルを読ん   でどういう感想を持ったのでしょうか。    TownsMENUのマニュアルニ限らず、その他沢山のマニュアルは初心者   にはなかなかその意味を理解することが出来ない。やはり、分かっている人が書   いているから説明に落ちがあるのだと思う。上級者には当たり前のことでも、初   心者にとってはとっても難しい事である。    出来上がったマニュアルは、一度初心者に見せて意見を聞くというのはどうだ   ろうか?(ね、富士通サン) ▽セーブ形式について    セーブ形式はアスキー式にしましょう。バイナリファイルだと読み込み保存に   かかるがスピードが多少速くなるという利点がありますが、他に決定的な欠点が   いくつかあります。    先ず、そのままではコンパイルすることができません。バージョンが違うと読   み込めなくなります。テキスト形式(アスキー形式)ではないので、BASIC   でしか内容を見たり、編集したりできなくなります。その他、BASICのチェ   クサム、変数検索、ラベル検索プログラム等がそのままでは使用できません。ま   た、マニュアルによるとファイルサイズが小さくなるそうですが、バイナリ形式   で保存してファイルサイズが大きくなったことがあっても、小さくなったことは   ありません。    このような理由から、バイナリ形式での保存は控えた方がいいでょしう。どう   してもしたい場合でも、フリコレなどで発表するときはアスキー形式で保存した   ものを付属しておくべきでしょう。 ▽動作モードについて    最近のマシンはますます高速化が進み、スプライトを使用するゲームやごく簡   単なグラフィックをデモンストレーションするプログラムでは目にとまらぬ速さ   になってしまいます。そのため高速マシンには、互換モードと高速モードがある   ことはもちろん知っていますよね。(えっ知らない!? マニュアルを見てね) |   386機で開発している人は、普通に動作すると思って発表しているようです   が、上のようなプログラムの場合まず早すぎて使いものになりません。そのため   このようなプログラムでは、プログラム中でタイミングを取るか互換モードに切   り換えてから実行しなくてはなりません。タイミングを取る方が確実なのですが、   今のBASICではなかなか難しいことです。そこで、簡単にできる互換モード   に切り換える方を取りましょう。えっ、動作モードを切り換える命令なんかない   じゃないかって。そうです、動作モードを切り換える命令はありません。あった   としても公表されていません。しかし、OUT命令を使用することで簡単に動作   モードを切り換えることができます。     ノーマル(互換)モードに切り換える …………… out &h5ec,0    ファースト(高速)モードに切り換える …………… out &h5ec,1    この命令を使用して、動作モードを起動時に互換モードに切り換えましょう。   高速モードがない機種では実行しても何も意味はありません。害もありません。    しかし、これだけでは不親切なプログラムです。起動したら互換モードになっ   たのはいいけど、プログラムを終了しても互換モードのままだ。かといって、プ   ログラム終了時に必ず高速モードに切り換えると、互換モードをわけあって使用   していた人には迷惑です。(そんな人いないと思いますが……………)    やはり、プログラム終了時には起動時の動作モードに戻してやるべきです。そ   のためには次のようにプログラムを組みます。      mode=inp(&h5ec,1) 現在の動作モードを変数に記録する      out &h5ec,0    動作モードを互換モードに設定する         ・         ・         ・ プログラム本体         ・         ・      out &h5ec,mode  起動時の動作モードに戻す    OUT/INP関数の説明はここでは特にしませんが、このとおり使用すれば   まず問題はないと思います。ただし、out のところをむやみやたらにいじくると、   大変危険ですのでやめましょう。いじくって大切なデータが破壊されても責任は   とりませんからね。    どうしも知りたい人は、Oh!fmTOWNS95年1月号の166ページから   の記事を読みましょう。持ってない人は、手に入れましょう。手に入らない人は、   あきらめましょう。(なんと薄情な………………) ▽CDをBGMに    BASICプログラムに問わず、CD演奏をBGMに使用するプログラムが多   くあります。別にそれ事態は悪いことではないのですが、BASICで作られた   プログラムで音楽トラックのあるCDがないとプログラムが動作しないプログラ   ムがあります。そのようなプログラムはフリコレなどでCDから起動するとき大   変不便ですし、音楽CDを1枚も持っていない自分にとって大変不便です。    お願いです。音楽CDがなくても無事動作するプログラムを作ってください。    お願い致します。 ▽音色ファイル    これはフリコレに限定されるのですが、プログラムでシステムソフト付属の音   色ファイルを読み込むときに「Q:\FJ2\EUP\*.FMB」や「Q:\FJ2\EUP\*.PMB」とし   て読み込んでいるのがありますが、フリコレのCDには「\FJ2\EUP」というディ   レクトリは存在しません。でも、音色ファイルがないわけではありません。音色   ファイルは「Q:\FJ2\TONE」というディレクトリの中にあります。ですから音色の   読み込みの際はこのディレクトリから読み込むことにしましょう。    また、「Q:\FJ2\TONE」以下の音色はマニュアルにもあるとおりプログラムや音   楽演奏への使用が認められているので、フリコレ応募時に一緒にディスクに入れ   た方がいいでしょう。    また、TONE以下の音色ファイルを編集して出来た音色ファイルはミュージカル   プランの二次的な著作物となるそうです。でも、そのファイルは元のデータ同様   自由プログラムに組み込んだり配付していいそうです。 ▽プログラム終了手段    フリコレを見ていると、プログラムによっては終了手段がなくドキュメントに   「PAUSEキーを押してください」となっているものも見かけますが、PAU   SEはあくまで強制的にプログラムの実行を中断させる手段なので、これ終了方   法とするのは好ましいとは思えません。    だから、しっかり終了手段を用意するべきでしょう。分かりやすい方法、そし   て前にもあったようにプログラム終了前に画面を初期化した方がいいでしょう。 ▽STOP OFF    この命令はくせもので、かけるべきかどうか悩むとこでしょう。もし、完成し   たプログラムとして発表するならば掛けた方がいいのですが、まだ思わぬバグ(   はまり)があるかもしれないのならば掛けない方がいいでしょう。    フリコレのプログラムを実行していたら、エラーがメッセージが出て「Bドラ   イブにディスクを正しくセットしてください」みたいなことが表示されました。   そのときは、CDから起動していたので中断しようとしたらSTOP OFFが   掛けてあるのです。そのときはしょうがなくリセットしました。    このプログラムの作者は、エラー処理も出来ているしいいだろうと思ってST   OP OFFが掛けてあったのだと思いますが、必ずしも対処しえないような対   処方法を要求するプログラムはやめたほうがいいと思います。終了するか、もう   一度読み込むのかを選択するようになっていれば良かったと思います。 ▽コンパイルは行番号なしで    これはコンパイラを持っていない人には関係のない話なのですが、コンパイル   時に行番号ありでコンパイルするとファイルサイズが大きくなってしまうのは知   ってますよね。どうも、プログラム中で『GOTO 2000』とかしているから行番号な   しのコンパイルは出来ないと思っている人がいるようです。でも、実際はそんな   事はなくて、たとえプログラム中で『GOTO 2000』とか『GOSUB 5600』とか記述   していても行番号なしのコンパイルは出来ます。    コンパイラで行番号ありにする利点と言えば、デバッグ(バグなどがないか調   べること)用に利用するかエラー発生行を調べるぐらいです。エラー発生を行番   号で原因を調べるよりも、もうエラーが起こるような所はファイルアクセスなど   のいくつかに限られるわけですから、「ER=1:LOAD@"DATA.DAT",DAT:ER=0」みたい   にしておけば、わざわざ行番号を調べる必要もないと思います。    コンパイラで行番号ありを指定しても、ファイルサイズを大きくしてディスク   やメモリが圧迫されるぐらいです。すぐにでもやめた方がいいでしょう。 ▽ソースを公開して    これもコンパイラを持っていない人には関係のない話なのですが、お願いです   ソースファイル(コンパイルなどをしてできたファイルの元となっているファイ   ル。BASICの場合.EXPに対する.BASがソースファイルにあたる)を公開して   ください。    これは、どちらかと言えば上級者へのお願いないのですが、最近はコンパイラ   で作成されたプログラムはソースファイルを付けないのが常識みたいになってい   ますが、ソースファイルがないと、このプログラムはどのようにこの処理を実現   しているのだろうと思ってもそれを調べることができません。    確かに秘密の保持も分かりますが、コンパイルしたもの完全に秘密が守ってい   るかと言うとそうではありません。文字列はプログラム中に(この場合 *.EXPの   こと)文字列はまとまって文字列として存在しています。従ってJ−TYPEな   どのツールで *.EXPを直接見てしまえばゲームならばメッセージが分かってしま   います。たいした秘密の保持にはなっていません。あと、.BASファイルを公開す   るとプログラムの変数をいじくってRPGならばLVを20まで上げたり、出て   きた敵のHPを0にしたりとかいじられる危険性がありますが、それがどうして   もいやならば、『データSAVE』の部分を取った物を公開するとかすれば済む   ことだと思うのですが………。    ソースファイルを公開すれば、きっと皆さんがすばらいしプログラムで恩返し   をしてくれます。もしかしたら、プログラム中のミスを指摘してくれるかもしれ   ません。けちけちしてないで、ソースファイルを公開しようよ。 ▽あとがき    フリコレのBASICプログラムを見ていて気づいたことを書いてみました。   これらの多くは、BASICに限らずプログラミングするうえでどれも重要な事   です。ぜひ覚えておきましょう。(一部、お願いがありましたが……………)    付け足しなのですが、日本語ラベルや日本語変数は他機種への移植の際障害と   なるので使わない人もいます。でも、TOWNS専用命令(スプライトなど)を   プログラム中でふんだんに使ってしまえば、何をいまさらと思いますが………。    この中にもしかするとうそが書いてあるかもしれませんあ・し・か・ら・ず。   うそがあったとしても、前にあるとおり責任はとりませんので、謝って訂正する   程度しかできません。    苦情等はこちらへ、         〒370−12            群馬県高崎市根小屋町554−3                渡辺 良一    文句でも、何も反応がないよりはいいので気にせずに送ってください。    うその指摘は感謝し致します。固くならずに軽い気持ちでどうぞ。 ▽参考文献    F−BASIC386V2.1リファレンス    改訂第3版 fmTOWNSテクニカルデータブック  千葉憲昭 著