N88互換BASIC for Windows95(手引き書) - ERROR


◇使えない変数

5605 LSET DUMY$=RET$

DUMY$=RET$ は問題ありませんが、 LSET (ランダムファイルの出力用)と組み合わせた
 上記は「文法エラー」になります。
 DUMY$が原因で、次のDUMY$(VV)のように変更すればOKです。
5605 LSET DUMY$(VV)=RET$

Top  88Menu


エラー 変数の型が一致しない
3110 IF JOB=8 THEN EE$=EE$(1)+EC$+" Page."+STR$(EE+1) ' #5410 EE=EE+1
5095 IF LEFT$(EA$,LEN(EE$+" "))=EE$+" " OR LEFT$(E$,LEN(EE$)-1)+" "=EE$ THEN 5105

 上記の2行は、Windows-XPでは問題ないが、Windows95では「変数の型が一致しない」エラー。原因は不明だが、EE$(1)で引っかかった。
◇解決策
 EE$(1)をAEE$(1)、EE0$(1)などに変えればOK。その他の変数を変えてもダメ。
 ちなみに疑ったEE$=EE$(1)だけなら、OK。
 5095行を分解してテストしたところ、
 PRINT LEN(EE$)+1
 PRINT LEN(EE$+" ")
 はOK

Top  88Menu


#VV ( OPEN FIELD GET CLOSE PUT などで )
3520 OPEN D.BC$+NT$(VV)+".TXT" AS #VV
5610 PUT #VV,R

 など「型が一致しません」のエラー。
◇解決策
 上記では、3520行 AS #VV、3530行 FIELD #VV、3540行 GET #VV,I、
の、#VVを、「#1」「#2」「#3」のように実数を入ればOK。

Top  88Menu


◇マイナス記号は要注意
100 A-1$="これはフリーズする"
500 GOTO *N-WXT
800 *N-WXT

 100行のように、変数名に「 - 」(マイナス記号)を入れると、フリーズするので厳禁。
 ジャンプ先名に使った場合、
500 GOTO *N-WXT
 はOKだが、
800 *N-WXT
 で、「文法エラー」。
◇解決策
 -を . (ピリオド)などに置き換えればOK。

Top  88Menu


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

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

220 FOR J=1 TO 100: READ FJ$(J): IF FJ$(J)<>"**" THEN NEXT
260 DATA TAX_Menu.bas
透明スペーサー
5200 IF F=20 THEN GOSUB 5550: GOTO *NE5200XT_F
5210 '
5270 *NE5200XT_F
5278 NEXT F

 上記の _ (アンダーバー)が原因でフリーズする。
◇解決策
260 DATA "TAX_MENU.bas"
 上記のように " " で、データー文字列を囲む。
5270 *NE5200XT.F
 上記のように _を . などに置き換えればOK。

アンダーバーはフリーズの原因 例2.
350 CLOSE #4: OPEN "0ダイチョ振.WF" FOR INPUT AS #4
355 INPUT #4, Q_GEN$, M_LEN: CLOSE #4

 上記の _ (アンダーバー)が原因でフリーズする。
◇解決策
355 INPUT #4, Q.GEN$, M.LEN: CLOSE #4
 上記のように _を . (ピリオド)などに置き換えればOK。
355 INPUT #4, "Q_GEN$", "M_LEN": CLOSE #4
 このように" "で挟むことでも、355行のフリーズは防ぐことは出来る。しかしその後で、これらの変数を実際に使う場所でフリーズするので、この" "で挟むことの意味はなくなる。

Top  88Menu


注釈文の REMまたは、アポストロフィ(')

100 '
120 REM
150 IF P$="y" THEN GOSUB 4300 ' LPRINT
170 IF D.OUT$="y" THEN GOSUB 4600 ' ディスク出力
200 PRINT     '  コメント****
300 PRINT      REM  コメント****
400 LPRINT    '  コメント****

 初めの4行はOK。
 後ろの3行はエラー。PRINT      REMLPRINT    'で、実行命令が完結していない状態で「注釈」に入っているのが原因。
◇解決策
 以下のように PRINTや LPRINTの実行命令を完結させた上で、注釈を付けておけばOK。
200 PRINT    : '  コメント****
300 PRINT    :  REM  コメント****
400 LPRINT   : '  コメント****
 または、
200 PRINT    "" '  コメント****
300 PRINT    ""  REM  コメント****
400 LPRINT   "" '  コメント****
 すぐ後ろに同じテーマが続くので、参照のこと。

Top  88Menu

注釈文の REMまたは、アポストロフィ(') 2.

100 CLOSE ' ** ランダム #2 / シーケンシャル #1 **
110 G.YACHIN=50: G.KIFU=54 ' '89/夏より 92/8
120 CLOSE #1: OPEN "ケイリカモク.DAT" FOR INPUT AS #1 ' 科目DATAの読み込み
300 GOSUB 40000 ' YY$ 年度調べ
400 IF A=9999 THEN RETURN ' PRINT,A,GB1,GC2,D
730 IF JOB=1 OR JOB=7 THEN GOSUB 300: GOTO 750 '' OPEN DR$+"カイケイ."+YY$ #2
900 width 80,20: IF Q$="y" THEN CLS 2 ' 全体の訂正の場合

 上記のようなケースではエラーにならずOK。
 注釈記号の REMまたは、アポストロフィ(')の前で、命令が完結しているからだろうか。

Top  88Menu

注釈文の REMまたは、アポストロフィ(') 3.

100' PRINT G3
100PRINT G3

 行番号にいきなり続けてはエラー。間に1つ以上の半角スペースが必要。DOS-BASICでは、これを自動的に書き換えてくれるのでOK。
 N88互換BASICでは手抜きはダメで、礼儀正しくプログラムを書くこと=これは、他にも共通する大切なこと。

Top  88Menu

注釈文の REMまたは、アポストロフィ(') 4.  (2003/ 7/22新規)

5280 IF JOB=11 THEN EN$=MID$(W$,24,M.LEN) ' ELSE EN$=MID$(W$,20,4)

 上記のようなケースではエラーは出さないが、 ELSE の後ろも実行されてしまうので、実質エラーである。
 注釈記号の REMまたは、アポストロフィ(')の前で、命令が完結していないからだろう。
 少し後ろで紹介する「エラーを出さない実質エラー」の中で、詳しく分析・解説してある。

Top  88Menu


RUN

880 RUN

 DOS-BASICでは、現在読み込まれているプログラムの実行。
 ところがN88互換BASICでは、「文法エラー」が出て、「ファイルが見つかりません」
880 RUN "A.BAS"
 というように、実行させるプログラム名も記述しておく必要がある。
透明スペーサー
 また以下のように、プログラム名を変数に受け渡しての実行もOK。
190 FOR J=1 TO 9: READ PRG$(J): NEXT J
200 DATA ケイリ17 .bas, ケイリ28.bas, ケイリ3 .bas, ケイリ45 .bas, ケイリ45 .bas
210 DATA ケイリ6 .bas, ケイリ17 .bas, ケイリ28 .bas, ケイリ9
220 INPUT " 仕事は何番ですか? 1〜9を ";J : RUN PRG$(2)

Top  88Menu


◇「ファィルが見つかりません」のエラー.1

880 RUN "ABCD.BAS"

 "ABCD.BAS"が存在するのに、「ファィルが見つかりません」のエラーが出る場合。
 ファィルをOPENのまま、 RUN を実行しているのが原因の1つ。
 詳しくは、次の CLOSE を参照。
◇解決策
880 CLOSE : RUN "ABCD.BAS"
 RUN の前に、 CLOSE : を入れておけば良い。

Top  88Menu

◇「ファィルが見つかりません」のエラー.2

880 RUN "ABCD   .BAS"

 "ABCD.BAS"が存在するのに、「ファィルが見つかりません」のエラーが出る場合。
 DOS-BASICでは、ファイル名"ABCD   .BAS"の間の半角スペースは無視されますが、
 厳格なN88互換BASICでは無視されず、エラーの原因。
◇解決策
880 RUN "ABCD.BAS"
 ファイル名の間にある余分な半角スペースを取り除き、正しいファイル名"ABCD.BAS"に直しておけば良い。

Top  88Menu


CLOSE

エラー「ファィルが既に開かれています」
エラー「ファィルが見つかりません」

 DOS-BASICでは、ENDやRUNを実行すると、連動して自動的にCLOSEが行われる。しかしより厳格なN88互換BASICでは、プログラムの中に記述しておく必要がある。
透明スペーサー
 プログラムの実行時の最初に、「ファィルが既に開かれています」のエラーが出る場合は、前のプログラムがファイルOPENのまま終了したことによる。
◇解決策
10 CLOSE
 このように各プログラムの初めの部分に、CLOSEを記述しておく。
  ---------------------------------------------
 RUN "????.BAS"を実行しようとした時、「ファィルが見つかりません」のエラーが出る場合も、ファイルOPENのまま実行しようとしているのが原因。
◇解決策
 RUNの前に、CLOSEを記述しておきます。
500 CLOSE : RUN "????.BAS"
 このようにRUNの前に、CLOSEを記述しておく。

Top  88Menu


MID$(W$,24,28)=E$

2500 W$=SPACE$(51)
2550 MID$(W$,24,28)=E$

 DOS-BASICではE$の長さに関係なくLEN(W$)=51で一定。
 しかしN88互換BASICでは、
  もしE$=""の場合は、W$の長さLEN(W$)=24に変化して、
  もしE$の長さが10の場合は、W$の長さLEN(W$)=34に変化して、
  もしE$の長さが20の場合は、W$の長さLEN(W$)=44と変化してしまう。
◇解決策
2560 W$=W$+SPACE$(28): W$=MID$(W$,1,51)
 この1行の追加で、ダミーの+SPACE$(28)を足しておき、その後W$=MID$(W$,1,51)で本来の51の長さにする。
 または、
2560 IF LEN(W$)>51 TEHN W$=W$+ SPACE$(51-LEN(W$))
 この1行の追加で、W$の長さが51より短ければ、不足分の SPACE$(51-LEN(W$))を追加し、本来の51の長さにする。

Top  88Menu


MID$(W$,147,18)=NFAM$

5000 W$=SPACE$(250)
5570 MID$(W$,147,18)=NFAM$ : MID$(W$,165,16)=MFAM$:

 仮にLEN(NFAM$)>18 の場合、前記のように +SPACE$(?)を足して長さ合わせをしても、以降のMFAM$などの位置がずれてしまう。
 仮にLEN(MFAM$)>16 の場合も、以降のデーター位置がずれてしまう。
◇解決策
5562 IF LEN(NFAM$)<18 TEHN NFAM$=NFAM$+ SPACE$(18-LEN(NFAM$))
5565 IF LEN(MFAM$)<16 TEHN MFAM$=MFAM$+ SPACE$(16-LEN(MFAM$))
 この2行の追加で、MID$(W$, ??, ??)で置き換える変数を、本来の正しい長さにしておけば良い。

Top  88Menu


FILES

FILES <ディレクトリ名>,<列数>
機能:サブディレクトリ及びファイル名の一覧を表示します。
文例:FILES "A:\Program Files",3
解説:<列数>は最大が5で、省略も可能です。省略した場合は1列で表示します。

10 FILES  → Windows95では「定義されていない」エラー。XPではOK。
 詳しくは、HP管理人では を参照
10 FILES :  → OK
10 FILES ,5:  → OK  横5列の表示
10 FILES :  → ダメ  定義されていないエラー
40040 FILES DR$+"カイケイ.*"  → Windows95ではフリーズ。
                  XPでは「実行時エラー6 オーバーフローしました」でN88互換BASICプログラム終了
40040 FILES "カイケイ.*"  → 同上
 DOS-BASICでは、拡張子は何でも良いから、現ディレクトリー内にある"カイケイ."名のプログラムを全て表示せよ、という命令。

Top  88Menu


エラーを出さない実質エラー KINPUT Q$

KINPUT Q$

 KINPUT は、元々サポートしていません。
 うっかり見落として使っていると、エラーも出さず、しかも入力を要求せずに、次へ移動するので注意です。
  --------------------------------------------
 「サポートしていない命令や関数は、プログラム中にあってもエラーにはならず、読み飛ばされます。」と、N88互換BASICの「ヘルプ」の中にも書かれています。
◇サポートしていない命令の一覧
  CALL  CLEAR  COLOR@  COMMON  DEF SEG  DEF USR  DRAW  ERASE  ERROR
  INPUT WAIT  KEY LIST  KINPUT  KPLOAD  LINE INPUT WAIT  MOUSE  ON PEN GOSUB
  ON STOP GOSUB  ON TIME$ GOSUB  OPTION BASE  OUT  PEN ON/OFF/STOP  PLAY
  POKE  SET  STOP ON/OFF/STOP  TERM  TIME$ ON/OFF/STOP  TRON/TROFF  VIEW
  WAIT  width LPRINT  WINDOW
  --------------------------------------------

Top  88Menu


エラーを出さない実質エラー  注釈文の REMまたは、アポストロフィ(')

5280 IF JOB=11 THEN EN$=MID$(W$,24,M.LEN) rem ELSE EN$=MID$(W$,20,4)

 上記のようなケースで JOB=11 の場合は、 rem 以降が意味を持たないので、正しい結果を得られる。
 もし JOB=11 では無い場合には、エラーは出さないが、 rem の後ろにある ELSE 以降も実行されてしまうので、実質エラーである。
 N88互換BASICでは、注釈記号の REMまたは、アポストロフィ(')の前で命令が完結していない場合、以降も実行されるようだ。
 だから、 REMまたは、アポストロフィ(')以降が文法的に誤っていれば、エラーを出す。
 文法的に誤っていなければ、エラーを出さずに、しかもそれが意味を持っている時は実行をしてしまう傾向がある。(必ずいつもとは断定出来ないが、そのように覚悟しておいたほうが、プログラム上では安全である。)
透明スペーサー
 ちなみに、以下のように@ABを追加して、この行を分析してみよう。
5280 IF @ JOB=11 THEN AEN$=MID$(W$,24,M.LEN) rem ELSE BEN$=MID$(W$,20,4)
  rem が入っていない場合は、DOS-BASICでもN88互換BASICでも、「もし@なら、 THEN A」とせよ。「そうでない場合は、 ELSE B」とせよ、という命令である。この場合は、N88互換BASICも正しい結果に至る。
 しかし、このケースのように rem が入っている場合は、
◇DOS-BASICでは、
 プログラムの全文を読み、 rem を発見した段階で、以降は「注釈」と判断しているようだ。
◇N88互換BASICでは、
 アタマからプログラムを読み始め、 IF @ でなければ、 THEN Aは読まずに(だから rem が無効になり)、 ELSE Bに入ってしまう。あるいは、DOSと同じく全文を読んではいるが「REMまたは、アポストロフィ(')」を無視して、このケースでは実行をしているのかも知れない。

◇解決策 1.
5280 IF JOB=11 THEN EN$=MID$(W$,24,M.LEN)
 このように、「 rem ELSE EN$=MID$(W$,20,4) 」以降を完全に削除すれば、当たり前だが問題はない。
◇解決策 2.
5280 IF JOB=11 THEN EN$=MID$(W$,24,M.LEN) rem ELSE rem EN$=MID$(W$,20,4)
 このように、 ELSE のすぐ後ろにも「 rem 」を挿入しておけばOK。エラーになりそうな気もしたが、問題は無かった。

Top  88Menu


バグ?=エラーを出さないエラー2. (原因は重文)

2720  IF TSUKI<>A.TSUKI THEN FOR T.EN=0 TO 1: FOR TS=1 TO TSUKI(TSUKI, T.EN) :
        EN.TSUKI$(TS, T.EN)="":  NEXT TS: NEXT T.EN
2730 '

   (注:ここでの赤青の色分けは、正誤ではなく、単なる見や易さのためのもの。)
 2720行は、「IF TSUKI<>A.TSUKI」なら全てが実行されなければいけない。また少なくとも、次の2730行に移動しなければいけないもの。それが2720行の途中から抜け出し、2730行に移動せず、まったく別の行に移動してしまう。
2720  PRINT "@";: IF TSUKI<>A.TSUKI THEN FOR T.EN=0 TO 1: FOR TS=1 TO TSUKI(TSUKI, T.EN) :
     PRINT "A";:  EN.TSUKI$(TS, T.EN)="":  NEXT TS:     PRINT "B";: NEXT T.EN:  PRINT "C";
2730 PRINT "D"
 デバッグのために上記のように直せば、「@ABCD」または「@D」と画面表示されるハズのものが、毎回「@AB」となってしまう。
◇解決策 1.
 以下のように2行以上に分割してテストした結果はOK。結論としては、重文構造が好ましくないようだ。他でも重文によるエラーのケースがあった。
2720 IF TSUKI=A.TSUKI THEN 2730
2722 FOR T.EN=0 TO 1: FOR TS=1 TO TSUKI(TSUKI, T.EN)
2724 EN.TSUKI$(TS, T.EN)="": NEXT TS
2726 NEXT T.EN
2730 '
◇解決策 2.
2720 IF TSUKI=A.TSUKI THEN 2730
2725 FOR T.EN=0 TO 1: FOR TS=1 TO TSUKI(TSUKI, T.EN): EN.TSUKI$(TS, T.EN)="": NEXT TS: NEXT T.EN
2730 '

Top  88Menu


バグ?=エラーを出さないエラー3. (原因は重文)

5830 FOR I.11=1 TO SP-1
5840 IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN RETURN *NEX ELSE NEXT I.11
5850 '

   (注:ここでの赤青の色分けは、正誤ではなく、単なる見や易さのためのもの。)
 5840行では、「 RETURN *NE 」をしなければ、5850行に入らなければいけない。
 それが5840行の途中から抜け出し、5850行に移動せず、まったく別の行に移動してしまう。
透明スペーサー
5830 PRINT "@";: FOR I.11=1 TO SP-1
5840 PRINT "A";: IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN PRINT "B";: RETURN *NEX ELSE NEXT I.11
5850 PRINT "C";'
 デバッグのために上記のように直せば、「@AC」または「@AB」と画面表示されるハズのものが、毎回「@」だけを表示し、呼び出し元の GOUSUB に戻ってしまう。
◇解決策
 以下のように2行以上に分割してテストした結果はOK。結論としては、重文構造が好ましくないようだ。他でも重文によるエラーのケースがあった。
5830 FOR I.11=1 TO SP-1
5840 IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN RETURN *NEX
5850 NEXT I.11 '
透明スペーサー
 以下は、最後ではエラーを出すが、原因はやはり重文なので参照を( 2003/ 7/21 )。

Top  88Menu


省略はダメ =エラーを出さないエラー4.

3150 FOR D=1 TO UMAX: NSA$(D)="": IF EOF(9) THEN INPUT #9,NSA$(D): NEXT D
3150 FOR D=1 TO UMAX: NSA$(D)="": IF EOF(9)=0 THEN INPUT #9,NSA$(D): NEXT D
5238 IF INSTR(W$,"コースL .") THEN URI=1 ELSE IF INSTR(W$,"Pベート.") THEN URI=2
5238 IF INSTR(W$,"コースL .")>0 THEN URI=1 ELSE IF INSTR(W$,"Pベート.")>0 THEN URI=2
8815 IF H#(2, G.KIFU) THEN A$=F$(G.KIFU) : A#=H#(2, G.KIFU)
8815 IF H#(2, G.KIFU)>0 THEN A$=F$(G.KIFU) : A#=H#(2, G.KIFU)

 などなどは、
 DOS-BASICでは、上記の赤文字が、1以上(=または存在する)なら、THEN を実行せよという命令として、機能する。
 しかしN88互換BASICでは、エラーは出さないが、 THEN 以降は無視されて実行されない。
◇解決策
 青文字のように、省略した部分も正式に記述する。
 詳しくは、以降を参照。

Top  88Menu


省略はダメ =エラーを出さないエラー4−2.

◇INSTR

5238 IF INSTR(W$,"コースL .") THEN URI=1 ELSE IF INSTR(W$,"Pベート.") THEN URI=2
 DOS-BASICでは、上記の赤文字が、1以上(=存在する)なら、THEN を実行せよという意味で、機能する。
 しかしN88互換BASICでは、エラーには成ならないが、 THEN 以降は機能しない。
◇解決策
 以下のように、省略した部分も正式に記述する。
5238 IF INSTR(W$,"コースL .") > 0 THEN URI=1 ELSE IF INSTR(W$,"Pベート.") > 0 THEN URI=2
 または
5238 IF INSTR(W$,"コースL .")<>0 THEN URI=1 ELSE IF INSTR(W$,"Pベート.")<>0 THEN URI=2
  --------------------------------------------
6710 PRINT INSTR(STF$(MI.ST),EN$(M))=0 ; INSTR(STF$(MI.ST),EN$(M+1))
 DOS-BASICでは、上記の赤文字が、真か偽かを、-1か0で表示する。
 しかしN88互換BASICでは、「変数の型が一致しません」のエラー
◇解決策
6710 IF INSTR(STF$(MI.ST),EN$(M))=0 THEN PRINT "1 0" ELSE PRINT "0 1"
 というような別のプログラムに書き直す。

Top  88Menu


省略はダメ =エラーを出さないエラー4−3.

◇IF

8815 IF H#(2, G.KIFU) THEN A$=F$(G.KIFU) : A#=H#(2, G.KIFU)
 DOS-BASICでは、上記の赤文字が、1以上(=存在する)なら、THEN を実行せよという意味で、機能する。
 しかしN88互換BASICでは、エラーには成ならないが、 THEN 以降は機能しない。
◇解決策
 以下のように、省略した部分も正式に記述する。
8815 IF H#(2, G.KIFU) > 0 THEN A$=F$(G.KIFU) : A#=H#(2, G.KIFU)
 または
8815 IF H#(2, G.KIFU)<>0 THEN A$=F$(G.KIFU) : A#=H#(2, G.KIFU)

Top  88Menu


LPRINT "": LPRINT "":

53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "": LPRINT "": NEXT X

51200 FOR M=1 TO MX
51290    PN=PN+1: DD#=DD#+EN#(M)  ' #51180  #53090   : PN=0 リセット
51365    IF PN<7 THEN *NE.XT5
51370    GOSUB 53000         '  小計表示
51395 *NE.XT5
51400 NEXT M: PRINT

53000 ' -------- 小計表示 -------- 51370,51420
53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "": LPRINT "": NEXT X
53040                 PRINT TAB(TB);: PRINT USING PU11$; DD#; DD#
53100 RETURN
 上記は関連部分だけを表示の簡略化したもの。
 53010行では、本来はもし P$="y" なら、「2行の改行」を、「FOR  NEXT X」回行いなさい、という命令。
 ところが、ここに入った1回目はある変数 M の値を変えてしまう。そして2回目には、ここの辺りでプログラムを勝手に終了させてしまう。(フリーズではない)
 プログラムによっては、単純なエラーか、問題ない場合もあるが、このケースでは重大なパグである。プログラム全体とのバランスの問題かも知れない。
 ちなみに、確か LPRINT : LPRINT :
 と、した場合は必ずエラーになるハズ。  「 LPRINT : LPRINT : 」も、「 LPRINT "": LPRINT "": 」も、何もないものを2回印刷せよ!という命令。すなわち、2行改行せよ!である。
透明スペーサー
 ちなみに、NECのプリンターでは完全対応、キャノンではエラーは出さないが無視(=改行無し)という結果になる。要は、略式だからである。
 N88互換BASICでは、何もないものを印刷せよというおかしな命令であるため、こういう結果になっているのかも知れない。
◇解決策
53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "": LPRINT "": NEXT X
 または、
53010 IF P$="y" THEN FOR X=PN+1 TO 7: LPRINT "1": LPRINT "2": NEXT X
 上記のように""の間に、実体のあるものを入れることで、解決出来た。印刷してもほとんど目立たない、のようなものが良いだろう。

Top  88Menu


----- 以上で、「エラーを出さない実質エラー」のシリーズは終わりです。 -----



◇INPUT

10 INPUT A

 DOS-BASICでは、リターン(Enter)キーのみ押しても、A=ゼロと見なされる。
 N88互換BASICの場合、「入力が不適当」となる。
◇解決策
10 INPUT A$: A=VAL(A$)
 このように変えれば、リターンのみを受け付けるようにる。  A=ゼロが意味を持つ場合、0とリターンの2回キー操作が必要だったのが、1手間だけ済む。
 または、単なる確認用の一時停止の場合も、使い勝手が向上する。
透明スペーサー

Top  88Menu


◇CLS 2

CLS <消去方法>
機能:実行画面をクリアします。
文例:CLS
   CLS 3
解説:現在アクティブな実行画面(アクティブページ)をクリアします。
   <消去方法>は、1〜3の値が指定できますが、省略した場合も含め、すべて
   CLS 3 として扱われます。CLS 3 では、表示されている文字はすべて消去さ
   れ、画面はCOLOR命令で指定した<背景色>でクリアされます。

 DOS-BASICでは、CLS がテキスト画面のみ消去、CLS 2はグラフィック画面のみ消去のハズ。
 N88互換BASICでは、テキスト画面は持たず、文字はすべてグラフィク画面に書き込まれる。
透明スペーサー
 CLS 2は、そのままでOKの場合と、「定義のないエラー」に成る場合がある。
 しかし、そのプログラム実行の初回は、必ずエラー無しで済んでいるが、何かのエラー発生後は、再スタート時に毎回このCLS 2エラーに引っかかってしまう傾向がある。
 その場合も、3回ほど「実行 → 開始」を繰り返せば解消されたハズ?
 根本的な対策としては、CLS 2 を使わずにCLSに直せば良いと思うが、テストはしていない。
 というのは、2002/11現在は大半のプログラムが、ほとんどエラーを出さなくなったので、CLS 2 → CLS への書き換えを行っていない。
 但し、Windows95時代だけでの問題だったのか、WindowsXPへの変更後の初期段階まであった問題なのかも、不明。
 詳しくは、HP管理人では を参照

Top  88Menu


行末の余分な : (コロン)

8225 IF X=19 THEN A$="資 本 金": A=0+10:
8229 IF SEISYO$<>"Yes" THEN A$=MAEBAR.MSG$: GOSUB *P.NOM.E:
6880 LOCATE TT,LC :
 上記の3行は、すべて「文法エラー」。
 そもそも行末の : (コロン) は不要なもので、文法には厳密なN88互換BASICではエラーとなる。
◇解決策
8225 IF X=19 THEN A$="資 本 金": A=0+10
8229 IF SEISYO$<>"Yes" THEN A$=MAEBAR.MSG$: GOSUB *P.NOM.E
6880 LOCATE TT,LC
 上記のように、行末の余分な:(コロン)を削除すればOK。

Top  88Menu


FOR  NEXT

4340      FOR H=1 TO MX: IF EN$<>EN$(H) THEN NEXT H:
                                        M=M+1: EN$(M)=EN$: MX=M: EN.SW=1

 MX=0では、NEXT H: の後ろに入らずに次の行に移動してしまう。
◇解決策
4340      FOR H=0 TO MX: IF EN$<>EN$(H) THEN NEXT H:
                                        M=M+1: EN$(M)=EN$: MX=M: EN.SW=1
 というメモがあったが、MX=0ではDOS-BASICでもWindowsXPでも、NEXT H: の後ろに入らずに次の行に移動することは同じだった。従って、管理人の勘違いの可能性が大である。( 2002/11/30 )
透明スペーサー
 勘違いかと思っていたが、「FOR NEXT」で似たようなケースで新たなエラーを見つけたので、以下を参照( 2003/ 7/21 )。

Top  88Menu


FOR  NEXT 例2.

5000 FOR N=0 TO A
  (実際には、この間に数行のプログラムの記述がある。)
5100 NEXT

 管理人は、数グループ、数十のBASIC プログラムを組んで長年使い続けてきたが、その中の3つか4つのプログラムが、N88互換BASICでは明らかに違う場所に戻るケースがあった。
 「RETURN に対する GOSUBが無い」というようなエラーで、1つは、絶対にGOSUBから入っているRETURNで発生。
 もう1つは、その時点では、絶対にそこのRETURNに移動しているハズが無い場所で発生。
 いろいろなテストをした結果、いずれも、上記のような「 FOR  NEXT 」と、それをサブルーチンとして呼び出すGOSUBに関係しているようと想像した。
◇解決策
5100 NEXT N
 そこで、プログラム内の全てのNEXTに、上記のようにFOR で使っている変数名をつけてみたところ、解決。正しいかどうかは不明だが、対処療法としては成功。
 実際のプログラムには、複雑な場合は FOR NEXT の中からGOSUBでサブルーチンを呼び出し、そこから更に子・孫のサブルーチンを呼び出し、その中で別の FOR NEXT を行う場合もある。
 DOS-BASICでは日常的に長期にエラー無しに使ってきているので、N88互換BASICのバグの可能性もある。
 反対に、文法的に寛容なDOS-BASICでは黙認されてきた省略形が、N88互換BASICでは許されないためにDOSとは異なる処理がされ、エラーになった可能性もある。

Top  88Menu


FOR  NEXT 例3.

4050 IF taishyou$="全員" THEN FOR W=1 TO 10 ELSE COLOR 6
  (実際には、この間に数行のプログラムの記述がある。)
4100 IF taishyou$="全員" THEN NEXT W
4200 END
 これは、 W が1 2 3 というように、1つずつ数値を上げながら 10 になるまで繰り返すハズのプログラム。
*1つめのエラー
 ところが、実際には W は変化せずに W=1 のままである。
*2つめのエラー
 次に、 10 回の繰り返しではなく、何故か 12 回繰り返される。
*3つめのエラー
 さらに、「4200 END」に移る前の「4100 行の行末 NEXT W」の W のすぐ後ろにカーソルを置いた状態でエラー。
 以上の3つのエラーが生まれてしまった。
透明スペーサー
 前後のプログラムの関係かとも予想して、このサブルーチンだけを独立プログラムとしてテストしてみたが、結果は全く同じ。
 また、 taishyou$ という変数の文字列に問題があるのではとも考え、 t$ に変えてみたが、結果は全く同じ。
4050 IF taishyou$="個人" THEN else FOR W=1 TO IL0F  と変えてみたが、結果は全く同じ。
 残念ながらプログラムのバグである。
◇解決策
4050 IF taishyou$<>"全員" THEN COLOR 7: GOTO 4070
4060 FOR W=1 TO 10
  (実際には、この間に数行のプログラムの記述がある。)
4100 IF taishyou$="全員" THEN NEXT W
透明スペーサー
 本来の4050行を、上記のように4050行と4060行に分割をしたらOK。
 どうも、この「N88互換BASIC for Windows95」プログラムの重文を苦手としているようなので、

Top  88Menu


FOR  NEXT 例4.

5830 FOR I.11=1 TO SP-1
5840 IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN RETURN *NEX ELSE NEXT I.11

 ある経理プログラムの中で、絶対にそこからはジャンプしない場所からジャンプし、エンドレスのルーチンに入ってしまった。いろいろテストした結果、上記のような記述に対してバグがあり、誤作動することが分かった。
 もし I.11=1 のときに、たまたまた SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) であれば、初めから RETURN *NEX をするため、続く ELSE NEXT I.11を認識しないのである。?
 その結果、次に出てきたどこかの NEXT を、
5830 FOR I.11=1 TO SP-1
 の受けの NEXT と判断したための誤動作である。
透明スペーサー
 この推定を基に、次のテスト・プログラムを組んでみた。
5000 cls: W$="ABCDEFG": STF$(1)="BCD"
5010 FOR N=1 TO 2: IF INSTR(W$,STF$(N))<>0 THEN STF=1: ELSE print n; "//////////": NEXT N
5020 print n
5030 FOR A=1 TO 2
5040 print A*10; "-------------"
5050 NEXT
5060 NEXT
( 5070 NEXT )
5100 end
 結果は、もし私が推測したようなN88互換BASIC のバグが原因なら、
 5010行の NEXT Nが認識されないため、5010行 FOR N=の受けとして、5060 NEXTが働き、
1
10-------------
20-------------
 本来ならこのように表示後、5060行でエラーになるハズ。5060 NEXTに対応する FORが無かったため(DOSなら NEXT  With out FORというメッセージ)。
 しかし、( 5070 NEXT )を記述しなければ、
1
10-------------
20-------------
2
10-------------
20-------------
 このように表示後、正常に終了してしまう。
 5070 NEXT も記述すれば、上記と同じ表示後に 5070行で FORが無かったためのエラーになる。
 残念ながら互換BASICのバグである。
透明スペーサー
◇解決策

5830 FOR I.11=1 TO SP-1
5840 IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN RETURN *NEX ELSE NEXT I.11
 や、
5765 FOR N=1 TO ST.ED: IF INSTR(W$,STF$(N))<>0 THEN STF=1: ELSE NEXT N
 のように THEN   ELSE NEXTのように1行の中にまとめずに、次のように分けること。
5830 FOR I.11=1 TO SP-1
5840 IF SP$(I.11)<>"" AND LEFT$(EN$,LEN(SP$(I.11)))=SP$(I.11) THEN RETURN *NEX
5850 NEXT I.11
透明スペーサー
5765 FOR N=1 TO ST.ED: IF INSTR(W$,STF$(N))<>0 THEN STF=1
7670 ELSE NEXT N
◇欠点としては、かすかに、または少し遅くなるが、仕方ない!
 仮に上の例でST.ED=1,000とすれば、 N=1 で終わる場合でも、改善後のプログラムでは必ず N=1,000 まで繰り返されるという差が生まれる。もしこのサブルーチンに何回も入るとすれば、その差は大になるが、正しい結果を得られるためには仕方のないことである。

 また、さらにこの誤動作を減らすためには、FOR N=などに対して、受けのNEXTも NEXT Nなどのように変数を付けておくことが大切。変数を省略すれば、誤動作の確率が高まってしまう。

Top  88Menu


◇GOSUB  RETURN

「RETURN に対する GOSUBが無い」のエラー

 もし、間違いな<GOSUBから入ってるのなら、別記の>「◇ FOR NEXT」を参照。

◇GOSUB 例2.
サブルーチン内でエラーが発生すると、GOSUBを終了して、戻ってしまう

 というメモが残っていたが、本人にも意味不明。
 エラーで表示するカーソル位置が、サブルーチン内での本当のエラー発生場所ではなく、呼び出したGOSUBの場所になる?という意味だろうか。

Top  88Menu


◇WHILE  WEND

「WEND文に対応するWHILE文がありません」のエラー
620 WHILE NA$<>"999"
630 GOSUB *SCREN: TT$="": GOSUB *INP.1 ' カナ氏名
640 IF NA$<>"999" THEN GOSUB 675
650 WEND
660 RETURN

 もし、間違いなくWHILEから入っているのに、複数のプログラムでエラーが出てしまった。
◇解決策
620 '
630 GOSUB *SCREN: TT$="": GOSUB *INP.1 ' カナ氏名
640 GOSUB 675
660 IF NA$="999" THEN RETURN ELSE GOTO 630
 上記のように、「WHILE WEND」を他の方法に置き換えてOK。

◇WHILE  WEND例2.
470 WHILE NA$<>"999" OR TT$="本人"
  (この間に多数の行や、 GOSUB 行がある)
575 WEND ' g.575


 同じく、「WEND文に対応するWHILE文がありません」のエラー
◇解決策
470 FOR N=1 TO 1000
  (この間に多数の行や、 GOSUB 行がある)
575 IF NA$<>"999" OR TT$="本人" THEN NEXT N ' g.575
 上記のように、「WHILE WEND」を「FOR NEXT」に置き換える。

Top  88Menu





▼以下は作業中▼
 管理人自身が、何のエラーだったのか忘れてしまったため、後日調べて整理します。


width=80,25

 フル画面にしていると「定義されていないエラー」などで、停止し、runの状態に入ってしまいます。ノーマル画面にしておけば大丈夫です。
 または、「width=80,25」などを削除しておいても、良い?のでは

Top  88Menu



画面コピー(=画面印刷)ボタンの利用
COLOR <文字色>,<背景色>,<境界色>,<描画色>,<パレットモード>

 通常の画面が黒で、文字白抜きの場合、画面コピーボタンで印刷するとほとんど真っ黒につぶれた状態で印刷されます。使いものになりません。
1=COLOR 0,7,0,7などのように書き換えます。
 最初の変数は<文字色>なので0=黒に、2番目の変数は<背景色>なので7=白。これに連動してプログラム中の「COLOR 7」を、「COLOR 0」に全て置換します。
透明スペーサー
 これで見た目は利用できそうな画面に変わります。しかし画面コピーでは、INPUT文の入力枠のようなものだけしか印刷されません。
 原因、対策は、今のところ不明です。

Top  88Menu