• ベストアンサー

十進BASICについて

!**************** メインルーチン **************** 110 call format  !formatを呼び出し 210 do until right=1 220  mouse poll mx,my,left,right !マウス位置を取得 230  if left=1 then 240   print mx,my !クリックされた座標を表示 289  end if 299 loop 999 end 220  mouse poll mx,my,left,right でsyntax errorがでます原因が分かる方よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

当方環境では、リンク先コードはもちろん、補足されたコードでもエラーは全然再現いたしません。

yamada11
質問者

お礼

ありがとうございます。こちらのOSはubuntu LINUXのなのですが、それが関係してるのでしょうか?

その他の回答 (2)

回答No.2

#1です。 あ、念のために聞いておくけど、 全角空白入れたの、質問者様だよね?

yamada11
質問者

お礼

私はこちらのサイトを参考にしてこのソースを入手しました。 こちらからコピぺしただけですが、なぜか全角空白がありますね。 http://contest2.thinkquest.jp/tqj2003/60573/ocello/example04.bas

yamada11
質問者

補足

解答ありがとうございます。返事が遅れて申し訳ないです。 10 declare external sub main.format 20 declare external sub main.post !**************** メインルーチン **************** 110 call format !formatを呼び出し 160 let w=40 !格子の幅 165 let left=0 !初期化 210 do until right=1 215 let left_=left !直前のマウスの左ボタンの状態 220 mouse poll mx,my,left,right !マウス位置を取得 230 if left=1 and left_=0 then 250 let x=int(mx/w) 260 let y=7-int(my/w) 270 print x,y !クリックされたマスの番地を表示 289 end if 299 loop 999 end !**************** サブルーチン **************** 1000 module main !モジュール定義 1010 public sub format 1020 public sub post 1100 share numeric w,r,pieces(0 to 7,0 to 7) 1200 !定数を定義 1210 let w=40 !格子の幅 1220 let r=13 !駒の半径 !---------------- ▽初期化 ---------------- 1500 external sub format 1600 !盤面の配列の初期化 1601 data 0, 0, 0, 0, 0, 0, 0, 0 1602 data 0, 0, 0, 0, 0, 0, 0, 0 1603 data 0, 0, 0, 0, 0, 0, 0, 0 1604 data 0, 0, 0, 1,-1, 0, 0, 0 1605 data 0, 0, 0,-1, 1, 0, 0, 0 1606 data 0, 0, 0, 0, 0, 0, 0, 0 1607 data 0, 0, 0, 0, 0, 0, 0, 0 1608 data 0, 0, 0, 0, 0, 0, 0, 0 1610 mat read pieces(0 to 7,0 to 7) 1700 !画面の初期化 1710 set bitmap size w*8+1,w*8+1 1720 set window 0,w*8,0,w*8 1810 call post !postを呼び出し 1999 end sub !---------------- △初期化 ---------------- !---------------- ▽盤面を描画 ---------------- 2000 external sub post 2100 !背景を描画 2110 set area color 10 2120 plot area: 0,0; 0,w*8; w*8,w*8; w*8,0 2200 !格子の描画 2210 for i=0 to 8 2220 plot lines : 0,w*i;w*8,w*i !横線を描画 2230 plot lines : w*i, 0;w*i,w*8 !縦線を描画 2299 next i 2300 !駒の描画 2310 for j=0 to 7 2311 for i=0 to 7 2320 select case pieces(j,i) 2330 case 1 !白駒の場合 2331 set area color 0 !色を指定:白 2332 draw disk with scale(r)*shift(w*(0.5+i),w*(0.5+(7-j))) !円を描く 2340 case -1 !黒駒の場合 2341 set area color 1 !色を指定:黒 2342 draw disk with scale(r)*shift(w*(0.5+i),w*(0.5+(7-j))) !円を描く 2350 case else 2351 !何もしない 2369 end select 2398 next i 2399 next j 2999 end sub !---------------- △盤面を描画 ---------------- 9999 end module これが上下なのですが、再現可能でしょうか?

回答No.1

そのままコピー貼り付けしてみたが、再現しない。 (FORMATが定義されていないらしいのでコメントアウトした) 『メインルーチン』ってことはこの上下にも色々あるんだよね・・・ 俺が考えるとしたら『変数宣言』かなぁとは思うけど。 [オプション]-[文法]で 標準(JIS Full BASIC)を選択している時 「変数宣言を強制する」というチェックボックスがある まとはずれかもしれないが、自分の環境で再現できない以上 こういうのしか思いつかない (その場合 『文法の誤り』というダイアログに『RIGHTは宣言されていない』等と表示される)

関連するQ&A

  • N88-日本語 BASIC ASCII ファイル

    N88-日本語 BASIC ASCII ファイルにするのにはどうしたら、宜しいのでしょうか。 ・MS-DOS 6.20 に付属されている、「Fileconv」を使ってみました。 MS-DOS → N88BASIC ドライブ名は、「C」ですが、Cと打つと、弾かれてしまって、入力が不可能です。 ・因みに、MS-DOSのファイル形式になっている、現在は、以下の記述名です。 ----- 10 width 80,20                         '10~96行まで初期設定 20 cls:beep 30 print "KEY操作 1 左 2 右 3 ミサイル発射" 40 print "自機 <T> を操り 敵 = を撃つゲーム" 50 for i=0 to 40 60 locate i,5:print "-" 70 next 80 locate 19,5:print "-<T>-" 90 x=19: m=0:mx=0:my=0              'x、y 自機の座標  mx、my ミサイル座標 95 randomize(val(right$(time$,2)))         'ex,ey 敵座標  96 ey=int(rnd(1)*10)+6:ex=5 100 gosub 200                    '100~130 メインルーチン 110 if m=1 then gosub 300  'm=0 ミサイル未発射。この時は300行(ミサイル移動ルーチン                     'にはいかない m=1 ミサイル発射中は300行へ   120 gosub 400 130 goto 100 200 b$=""                       '自機の移動、ミサイル発射 202 a$=inkey$ 205 if a$<>"" then b$=a$:goto 202 210 if b$="1" and x>1 then x=x-1 215 if b$="2" and x<37 then x=x+1 220 if b$="3" and m=0 then mx=x+2:my=5:m=1:beep 230 locate x,5 :print"-<T>-" 240 return 300 locate mx,my:print " "              'ミサイル移動ルーチン 310 my=my+1 320 if mx=ex and my=ey then gosub 600: end   '当たり判定  330 if my>15 then mx=0:my=0:m=0:return     '下までいったらミサイル終了。m=0に戻す 340 locate mx,my:print "V":return 400 locate ex,ey:print " "               '敵移動ルーチン           410 ex=ex+1 420 if ex=mx and ey=my then gosub 600 :end   '当たり判定 430 if ex>39 then ex=0: ey=int(rnd(1)*10)+6    '端までいったら新座標 440 locate ex,ey:print"=" 450 return 600 beep                          '当たりの時の処理 610 locate mx,my:color 4:print "*" 620 print "大当たり THE END": color 7 630 print "HIT ANY KEY" 640 a$=input$(1):return

  • ループ処理の繰り返しについて

    お世話になっております。 単純なことで悩んでおります、どなたかわかるかたお願いいたします。 <% DO UNTIL SQLrs.EOF IF a=0 THEN %> 処理1 <% END IF SQLrs.MOVENEXT LOOP %> <% SQLrs.MOVEFIRST DO UNTIL SQLrs.EOF IF b=0 THEN %> 処理2 <% END IF SQLrs.MOVENEXT LOOP %> 上記のような処理順なのですが、問題は MoveFirstで先頭のレコードにもどらないのか、2回目のループ処理がうまく抽出できません。 原因はわかりますでしょうか?

  • エクセルのVBAで、エラーになった場合の回避

    excel2000 VBA エラーが発生した場合の処理の方法についてアドバイスをお願いいたします。 データベースのレコードを操作する、4つのプロシージャが下記の通りあります。 (1)最初(saisyo) (2)最後(saigo) (3)前(mae) (4)次(tugi) いきなり、(3)前、(4)次の処理を実行すると、エラーになってしまうのですが、これをなくしたい。(on error gotoステートメントを使えばいいのかなと考えていますが) ワークブックオープン時のイベントで(2)最後(saigo)を呼び出しているので、基本的にエラーは出ないのですが、いろいろレコードを触っている時に、(3)、(4)を実行するとエラーになるのがわずらわしいです。 どういう修正をコードに加えればいいか、アドバイスいただけるとありがたいです。 Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("A1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If End Sub Sub Tsugi() If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If End Sub Sub Tenki() 'レコードのtrgの値を入力シート(input)のBC1セルに表示させる Worksheets("input").Range("BC1").Value = trg End Sub

  • Exit Doで二つのloopを抜けるには?

    Do Do For Each If 値 = "" Then Exit Do End If Next Loop Until 条件1 Loop Until 条件2 のようなネストをした場合、Exit Doでloopを抜ける時、条件1と条件2のどちらに移動するのですか? もし条件1に移動する場合、条件2を抜けたいのならどうすればいいのでしょうか? Exit Do Do みたいな事がしたいです。

  • 【VBA】DoUntil Loopを1度のみ実行

    いつもお世話になっております。 Excel2003を使用しております。 「この条件になるまで続行」というのは Do Until Loop だと思うのですが、 ループをしたくないけれど Do Until Loop を利用したい場合(条件になったら即終了したい) Do Until Flag=True 実行したいこと 実行したいこと2 実行したいこと3 Exit do Loop また、やりたいこととしては、 FlagがTrue になったら、プロシージャから抜けたいと思っています。 その場合は、 Do Until Flag=True  実行したいこと  実行したいこと2  実行したいこと3  Exit do Loop If Flag=True Then   Exit sub End if このように、別々?に書く以外に方法はないでしょうか? 出来れば、簡単なIF文で実行できないかと思ったのですが… 話がごちゃごちゃしていて分かりにくいので、質問事項のみまとめますと、 ● 条件になったら終了させる。 これは、Do~Loop 、For Next のみの動作でしょうか? ● ループから抜けると同時にSubを終了させるには、ループの外にIF文を書くしかない? 以上、よろしくお願い致します。

  • ExcelのVBAでエラーになるのですが

     最近、VBAを始めたので、よくわかっていないのですが、以下のようなマクロを書いています。(長いので、かなり省略していますが)一応、動くようになったのですが、なぜか、一旦、最初(sheet 1)に戻ってしまうことがあります。(何度か繰り返して、進みますが) なぜなのかと考えると、該当シートが見つからないからのようなのですが、どのように対策したら良いのでしょうか? Dim s_A As String Sub Spec() s_A = "1" Call Spec3 Call Spec4 s_A = "2" Call Spec3 Call Spec4   'このあと s_A = "100" まで続く ActiveWorkbook.Close End Sub Sub Spec3() On Error Resume Next Do Until Selection.Value = ""   If ~ then Else ~ Else if ~ End If Loop 'ここで、動作を繰り返させている End Sub  そこで、エラー対策として、specの先頭にOn Error Resume Nextを入れるとエラーになりますよね?  該当シートがない場合は、次のシート(3行下)にジャンプさせたいのですが。  よろしくお願いします。

  • エクセルVBAで、文字列の検索方法について

    先日、こちらで教えていただいたVBAがあります。 E列のセルの文字列の末尾が「計」のものを検索し、その行に色をつけるものです。 Sub iroiro() Dim x, y x = 1 Do If Right(Cells(x, 5), 1) = "計" Then For i = 2 To 5 Cells(x, i).Interior.ColorIndex = 3 Next End If x = x + 1 Loop Until Right(Cells(x, 5), 1) = "" End Sub これはばっちりで、助かっているのですが、今度は末尾ではなく、文字列中に「営業」という文字があるのを検索し、色をつけたいのです。 If Right(Cells(x, 5), 1) = "計" Thenを どう変えればいいのでしょうか?

  • EXCEL フォルダだけを検索したい

    EXCEL2003を使っています。 開いているファイルと同じフォルダ内に「テストフォルダ」があるかどうかを調べ、存在した場合に削除したいのですが、以下のような書き方ではフォルダだけでなくファイルも検索してしまうようです。 フォルダだけを検索するにはどうしたらいいでしょうか? FSOでできることは分かっていますが、以下の方法で試してみたいのです。どうぞ宜しくお願い致します。 Sub test() my_path = ActiveWorkbook.Path & "\" f_name = Dir(my_path, 16) Do Until f_name = "" If f_name = "テストフォルダ" Then RmDir "テストフォルダ" End If f_name = Dir() Loop End Sub

  • エクセルvba 値渡しのsubプロシージャ

    お世話になります。 エクセルVBAにて、loop処理中にCALLかけている subが最初の一度だけしか呼べません。 なにか、特別にしなければならないことがあるのでしょうか。 こんな感じです。 dim i as integer sub main()   i = 1   max = 5   do     if day1 = day2 then 処理1 データ1, データ2     end if     i = i + 1 loop until i = max    end sub sub 処理1(Byval 引数1 as variant, 引数2 as variant)    msgbox("引数1" & 引数1)    msgbox("引数2" & 引数2) end sub データ1 及び データ2、 DAY1 DAY2は、必要に応じて 転送処理等やっています。

  • VBAのキー入力待ちでCPU負荷大

    VBAでキー入力待ちで動作をするプログラムを組んでいますが、 プログラムの組み方が悪くCPUの負荷が高くなり、CPUの温度が かなり上がってしまいます。 いろいろ調べたのですがわかりません。 負荷を下げるプログラムの書き方を教えていただけないでしょうか。 Excel2010です。 よろしくお願いします。 Sub ボタン1_Click() Dim i, j, k, Maxrow, Colst, colen, nCnt As Integer Do Until GetAsyncKeyState(27) If GetAsyncKeyState(75) <> 0 Then           ・           ・        「モジュールプログラム1」           ・           ・ Do Until GetAsyncKeyState(75) = 0 Loop ElseIf GetAsyncKeyState(77) <> 0 Then           ・           ・        「モジュールプログラム2」           ・           ・ Do Until GetAsyncKeyState(77) = 0 Loop ElseIf GetAsyncKeyState(37) <> 0 Then If ActiveCell.Column > 1 Then ActiveCell.Offset(0, -1).Activate End If ElseIf GetAsyncKeyState(38) <> 0 Then If ActiveCell.Row > 1 Then ActiveCell.Offset(-1, 0).Activate End If ElseIf GetAsyncKeyState(39) <> 0 Then ActiveCell.Offset(0, 1).Activate ElseIf GetAsyncKeyState(40) <> 0 Then ActiveCell.Offset(1, 0).Activate End If For k = 1 To 300: Next k Loop Sheets("Main").Activate End Sub

専門家に質問してみよう