N88互換BASIC for Windows95(手引き書) - フリーズ


◇ $の記述ミス (フリーズ)

10 E$=E$+EX$(C): PRINT " "; E$
20 E$=E$+EX$: PRINT " "; E$
60 E$="": E$=E$+EX$(C)$: PRINT " "; E$
70 E$=" ": E$=E$+EX$(C)$: PRINT " "; E$
80 E$="1": E$=E$+EX$(C)$: PRINT " "; E$

 Windows95で、以下のメモがあるが不確か。
   20行、80行は、OK。
   10行、60行、70行は、「実数(変数かも?)の型が一致しません」のエラー。
 Windows-XPで確かめたところ、
   10行、20行は、OK。
   60行、70行、80行は、そのままフリーズ。
◇解決策
 たぶん、10行でエラーが出たために、類似の行を作りエラーの原因探しをしたものと思う。
 結果的には60行、70行、80行では、「EX$(C)$」と書き間違えていたようだ。ダブらせた余分な$を取り除き、以下のように書き直したら、Windows-XPではOK。
60 E$="": E$=E$+EX$(C): PRINT " "; E$
70 E$=" ": E$=E$+EX$(C): PRINT " "; E$
80 E$="1": E$=E$+EX$(C): PRINT " "; E$

Top  88Menu

◇ _ (アンダーバー)はフリーズの原因

   アンダーバーは、キーボードでは「Shift」+「ろ」で入力できます。行のまん中にある「-(ハイフン)」とは別なので注意。

P_RIN$
P_RIN
*N_WXT などなど

 このように、変数内に_ (アンダーバー)を使うと、フリーズする。
◇解決策
 _を . (ピリオド)などに置き換えればOK。

Top  88Menu


~ はフリーズの原因

7550 DATA "C:" , TNO1~9 .PRO , 郵便番号で、県別をAutoで探す

◇解決策
7550 DATA "C:" , "TNO1~9 .PRO" , 郵便番号で、県別をAutoで探す
 上記のように " " で、データー文字列を囲む。

Top  88Menu


◇マイナス記号は要注意 (フリーズ)

100 A-1$="これはフリーズする"

 100行のように、誤って変数名に「 - 」(マイナス記号)を入れると、フリーズするので厳禁。DOS-BASICでもこれは「文法エラー」になり、使えないもの。
◇解決策
 -を . (ピリオド)などに置き換えればOK。
 ジャンプ先名に使った場合は、「文法エラー」になるので、変数名に「 - 」(マイナス記号)を使わないこと。

Top  88Menu


◇アポストロフィ(')とOPEN FILEは要注意 (フリーズ)


595 IF D.OUT$="y" THEN CLOSE #4: OPEN FILE$  FOR OUTPUT AS #4  ' FILE$は{ダイチョウ.BAS}から#360で引き継ぎ
  または
595 IF D.OUT$="y" THEN CLOSE #4: OPEN FILE$  FOR OUTPUT AS #4 : ' FILE$は{ダイチョウ.BAS}から#360で引き継ぎ

 595行のように行末に ' を付け、コメントを入れるとフリーズする。
 : '  というように直しても、同じくフリーズ。
◇解決策
595 IF D.OUT$="y" THEN CLOSE #4: OPEN FILE$ FOR OUTPUT AS #4 :
597 ' FILE$は{ダイチョウ.BAS}から#360で引き継ぎ
 上記のように、コメント部分を完全に分けて、別の行とすればOK。
 アポストロフィ記号では、フリーズにならないまでもエラーの原因に成りやすいので、要注意。

Top  88Menu


FILES (フリーズ)

40040 FILES "カイケイ.*"

 DOS-BASICでは、拡張子は何でも良いから、現ディレクトリー内にある"カイケイ."名のプログラムを全て表示せよ、という命令。
 Windows95ではフリーズ。XPでは「実行時エラー6 オーバーフローしました」でN88互換BASICプログラム終了。

Top  88Menu


◇ファイルをオープン時に、プログラムを修正してそのまま保存に入ると

 「すでにファイルが開かれています」で、フリーズ。

 私だけのケースの可能性もあるので、
 詳しくは、HP管理人では を参照
◇解決策
 オープンしたファイルは、不要になったら出来るだけその場で「CLOSE」するプログラムに直す。
 オープンしたままの状態は、他にもトラブルの原因になるので、プログラムの早い行で、
10 CLOSE
 というような設定をしておくと良い。

Top  88Menu


◇ →◇← ? (フリーズ)

(530 FOR G=1 TO 6: READ FJ.SUB$(G): NEXT G)
540 DATA →◇TAX決算.BAS◇ に移る, ←◇法人の事業概況説明書(B4) , , , ,

 Windows95ではフリーズ。XPではOK。
◇解決策
540 DATA "→◇TAX決算.BAS◇ に移る", "←◇法人の事業概況説明書(B4)" ,"" ,"" ,"" , ,
 通常は上記のように " " で、データー文字列を囲めばOKのハズが、このケースではフリーズ、とメモがある。
 次のようにプログラムを書き換えることでOK。
550 FJ.SUB$(1)="DATA →◇TAX決算.BAS◇ に移る": FJ.SUB$(2)="←◇法人の事業概況説明書(B4)"
透明スペーサー
 今になって思えば、プログラム全体の中でのバランスかも?、と想像する

Top  88Menu


◇ 全体の中でのバランス1.? (フリーズ)

330 INPUT " 仕 事は 何ですか ";Q$: JOB=VAL(Q$)

 下記の行を、上記のように書き換えたら、Windows95ではフリーズ。
330 INPUT " 仕 事は 何ですか ";JOB
 他の幾つものプログラム内では同様の内容がOKで、ある特定の1つのプログラムだけで発生。
 原因は全く不明だが、
 今になって思えば、プログラム全体の中でのバランスかも?、と想像する

Top  88Menu


◇ 全体の中でのバランス2.? (フリーズ)

◇ 全体の中でのバランス2.?
455 CONSOLE 0,24: PRINT "": PRINT
460 IF TTAL THEN PRINT "** TTAL ="; TTAL,"DMTTAL ="; DTTAL,"削除="; DEL; " **"

  Windows95のあるプログラムでは、完全なフリーズはしていないが、ENTERキーも利かなくなる。
460 IF TTAL<>0 THEN PRINT "** TTAL ="; TTAL,"DMTTAL ="; DTTAL,"削除="; DEL; " **"
 上記のように、省略形の TTAL<>0 も正しく直したが、やはり何故かリーズ。なお、この行だけの実行はOK。
455 CONSOLE 0,24: PRINT "": PRINT ""
460 IF TTAL<>0 THEN PRINT "** TTAL ="; TTAL,"DMTTAL ="; DTTAL,"削除="; DEL; " **"
 結果的に、455行末の「: PRINT」を「: PRINT ""」に直したらOK。
 原因は全く不明だが、
 今になって思えば、プログラム全体の中でのバランスかも?、と想像する

Top  88Menu


◇初めからフリーズするの場合での対処法1.

1.
 N88互換BASIC for Windows95を立ち上げておく。
2.
 そのフリーズするプログラムを別名で保存して、以下のように処理していく。
3.
 適当な目安で、後ろ半分を削除し、「プログラム画面」にドラッグし、「実行 → 開始」を押す。
 もしフリーズしなければ、削除した後ろ半分に問題がある。
 もしフリーズすれば、実行した前の半分に問題がある。
 このときエラーが出ても関係なく、フリースするかどうかだけをチェックすれば良い。
4.
 適当な目安で、フリーズしたほうの後ろ半分を削除し、「プログラム画面」にドラッグし、「実行 → 開始」を押す。
5.
 これを何度も繰り返し、範囲を狭め、原因になる行、部分を特定する。

Top  88Menu

◇初めからフリーズするの場合での対処法2.

4120 ' ------------ g.4170, 4230
4125 YY$=MID$(DATE$,1,2)+MID$(DATE$,4,2): YM=VAL(YY$)   ' YM=使い捨て
4130   IF YM<8000 THEN YM=200000!+YM ELSE YM=190000!+YM  '  西暦2000年以降の対応
4135   YM.B=600: PRINT "": COLOR 6
4140   PRINT "◆本日は" YM "。 " (YM-2500) "〜" (YM-600) " を入力してください。 ": PRINT "": COLOR 7
4145  PRINT " 最終入校年月は、いつにしますか?  (1997/01なら→ )199701(=6桁入力) "
4150   PRINT "    Ret の場合は= " YM.B/100 "年前の" (YM-YM.B);: INPUT " と判断します。 ";L.AST$
4155   IF L.AST$="" THEN L.AST$=MID$(STR$(YM-YM.B),2,6)
4160   IF LEN(L.AST$)<>6 OR VAL(L.AST$)<(YM-2500) OR VAL(L.AST$)>(YM-YM.B) THEN ELSE 4200
4165       PRINT "": COLOR 5: PRINT ,"入力が不適当です。再入力を": PRINT
4170       GOTO 4120
--------------------------------------------------
 約430行のサイズを持つ顧客管理プログラムの1つ。
 前記の方法で1/2分割を繰り返し、上記の4120行〜4170行にフリーズの原因があることが判明。
◇解決策
4140   PRINT "◆本日は" YM "。 " (YM-2500) "〜" (YM-600) " を入力してください。 ": PRINT "": COLOR 7
4150   PRINT "    Ret の場合は= " YM.B/100; "年前の" (YM-YM.B);: INPUT " と判断します。 ";L.AST$
 上記のように PRINT 文で文字列や変数の連続表示で、セミコロンが抜けていたので正しく修正したところOK。
 通常はエラーを出すところだが、この場合は何故かフリーズしてしまった。
 (注:本来は「半角のセミコロン」を挿入しなければいけないのだが、画面上では見えにくいので、ここでは全角のセミコロンを使っている。)

Top  88Menu


◇改良中にフリーズするの場合での対処法

1.
 プログラムの改良時やデバッグ時には、こまめに「実行 → 開始」をしてし、フリーズしないことを確認する。
 もし大幅にプログラムを直してから実行し、フリーズしたら、原因が何処にあるかのか探すのが大変である。
2.
 その都度、こまめにファイル名を変えて保存する。
 例えば、Abcd-1.BAS、Abcd-2.BAS、Abcd-3.BAS、Abcd-4.BAS、Abcd-5.BAS、という具合に。
3.
 フリーズが発生したら、その前に行った変更部分を元に戻す。
 あるいは直した行の直ぐ前、またはすぐ後ろに、改行のみを入れてみる。これでフリーズが無くなる場合もある。
4.
 覚えていないか、面倒な場合は、1つ前のプログラム名のものに戻り、やり直す。
5.
 動いたはずの1つ前のプログラム名のものでもフリーズする場合は、もう1つ前のものに戻す。また再起動をかければ、OKになる場合もある。
透明スペーサー
◇参考
330 INPUT " 仕 事は 何ですか ";JOB
 上の行を、以下に書き換えても、プログラムには誤りがないのだが、
330 INPUT " 仕 事は 何ですか ";Q$: JOB=VAL(Q$)
 他ではOKなのに、あるプログラムではフリーズすることがある。
 その場合は、2行に分割してみる。
 あるいは、その行の前か、後ろ、またはその両方に、「改行」だけを加えてみる。
 これでOKになるケースが、けっこう多くあった。
透明スペーサー
注:
 DOS-BASICでは、「改行」だけの行があると、プログラムの読み込み段階でエラーになってしまうが、N88互換BASICでは認められる。
 逆にこれを注釈行の代わりとして、所々に入れれば、複雑な部分を見やすく、分かりやすく出来る、という利用方法もある。

Top  88Menu