READ文 DATA文 RESTORE文はどのように

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: READ文 DATA文 RESTORE文はどのように

こうなりました。

by 朝顔 » 2006年11月01日(水) 18:14

試しにリリースコンパイルして実行してみるのはどうでしょうか?デバッグ実行のときのみアクセス違反になることがあるようなので...
↑デバッグコンパイルやリリースコンパイルはできましたが、なぜかデバッグ実行は・・・。
詳細はINPUT命令(N88BASICモード)にてSTRING型強制終了のトピックをご覧下さい。
↑つまり  「パソコン環境によっては、ごく希に動作しない場合がある」  という事例の紹介として受け取りました。
そこで別のパソコン(WindowsXP sp2というところは同じです。)で
hiraさんが作ってくださったコードをデバッグした所、どちらも、あっけなく動きました。
もちろんどちらでもデバッグコンパイル、リリースコンパイルもできました。

皆さんに大変な迷惑をかけましたが、今回の件はべつのパソコンで
プログラミングを続けることで、終わりにしたいと思います。
みなさんありがとうございました。
特にhiraさんには感謝の気持ちでいっぱいです。ありがとうございました。

プログラミングは職場では自分しかやっていないので、
この掲示板で教えていただけるのはとても助かります。
また何かあったら聴きにきますので・・・。

by OverTaker » 2006年10月31日(火) 21:30

試しにリリースコンパイルして実行してみるのはどうでしょうか?デバッグ実行のときのみアクセス違反になることがあるようなので...
詳細はINPUT命令(N88BASICモード)にてSTRING型強制終了のトピックをご覧下さい。

Re: やっぱり同じです。

by hira » 2006年10月31日(火) 21:27

私のやり方がおかしいのでしょうか?
①作ってもらったコードをすべてドラッグして反転しておき、右クリックでコピー
②ProjectEditerを起動し「ファイル」→「新規作成」→「Basicプログラム(*.abp *.bas)」→「OK」
③出てきた白いところに貼り付け
④F2キー(デバッグ実行)を押し
⑤「保存先のファイルを指定してください」で適当な名前を入れて→「保存」
ここまでを行うと「prompt.sbp」の154行目の「End Sub」が黒く反転している状態に行き着きます。
いいえ、それで正しいです。
となると、他に原因があるということでしょうが、現状では思い当たるところがありません…。ご迷惑をおかけします。

やっぱり同じです。

by 朝顔 » 2006年10月31日(火) 21:21

新しいコードで試したのですが、結果は同じようです。
青三角も同じところについています。
デバッグコンパイルやリリースコンパイルはできましたが、デバッグ実行は・・・。
しかも154行目といえばPRINT_ToPrompt(Print命令)の部分です。
という部分ですが、最初のコードでも今回のコードでも
「prompt.sbp」の154行目の「End Sub」が黒く反転しています。
154行目が違う行を指しているのが気になります。

私のやり方がおかしいのでしょうか?
①作ってもらったコードをすべてドラッグして反転しておき、右クリックでコピー
②ProjectEditerを起動し「ファイル」→「新規作成」→「Basicプログラム(*.abp *.bas)」→「OK」
③出てきた白いところに貼り付け
④F2キー(デバッグ実行)を押し
⑤「保存先のファイルを指定してください」で適当な名前を入れて→「保存」
ここまでを行うと「prompt.sbp」の154行目の「End Sub」が黒く反転している状態に行き着きます。

by hira » 2006年10月31日(火) 20:38

変数のアドレスが&H0ということは、ただのアクセス違反ではない気がします。
しかも154行目といえばPRINT_ToPrompt(Print命令)の部分です。プログラムからPrint命令は呼び出していないので奇妙な話。
当方XP SP2 Home・AB 4.24.00ということで朝顔さんと環境は同じはずなのに。
N88BASIC特有のGosub→Returnの流れが関係あるのかどうかはわかりませんが、一応現在のActiveBasicの文法に近い形(といってもGosubとReturnをなくした形にしただけ)にしてみましたので、これで一度確認してみてください。
しつこいですが、行番号などはノータッチです。

※他の皆さんもうまく動くか報告していただけるとありがたいです。

昨日とは少し違います・・・

by 朝顔 » 2006年10月31日(火) 00:42

画面下の「プロシージャ」を「Global」に変更するとどこの行が反転されるかお調べいただけると助かります。
プロシージャはGlobalしか選べない状態ですが、そのときは、いつも
「prompt.sbp」の154行目の「End Sub」が黒く反転しています。
(常にそうなるのか何回かやってみましたが、「prompt.sbp」が
表示されないこともあり、自分のしていることが正しいのかさえ、不安なります。)


グローバルタブの中で青い三角印がついているのは
   n1$(&H0)アクセスできません
   DTDT$(&H0)アクセスできません
   NUMn1$配列(&H421A74)   の下にある16個
      [0](&H0)アクセスできません
      [1](&H0)アクセスできません
       :
       :
      [16](&H0)アクセスできません
   DT$(&H0)アクセスできません
   DATFROM$(&H0)アクセスできません
1番について自分がわかるお返事は、これだけです。
2番についてはなんとなく理解できましたということにしておきます。
縁の下の力持ちが働いてるっていうことかなと思いました。

現在の私の環境は  WindowsXP sp2
               AB 4.24.00

by hira » 2006年10月30日(月) 20:40

①作ってもらったコードをデバッグしたら
    スレッド(&HA14)でアクセス違反がありました(EPI=&H7C958FEA)。
と一番下の方に表示されてプログラムが止まりました。そのすぐ上の「グローバル」タブには、青い右向き三角とともに
    n1$(&h0)アクセスできません。
    (↑他にもいくつか・・・)
と書かれています。
②さらにファイル名は「prompt.sbp」とかかれています。
このようなモノが自動で作られるということは、
プログラム1個につきフォルダ1個を作って管理していく必要がある
ということなんでしょうか?
1番に関しては、2番の「ファイル名が『prompt.sbp』」ということから考えて、おそらくCIRCLE命令の中でのアクセス違反でしょう。
プログラムの問題かどうかもはっきりしないので、prompt.sbpでのエラー箇所の内容と、画面下の「プロシージャ」を「Global」に変更するとどこの行が反転されるかお調べいただけると助かります。当方(XP SP2 Home、AB 4.24.00)ではエラーを再現することができませんので。
2番ですが、「prompt.sbp」はActiveBasic本体のフォルダにある「Include」というフォルダの中にあるファイルの1つで、今回のようにN88BASIC互換(実際は本件のように完全互換とはいきませんが)のプログラムを作成するときに呼び出されるファイルです。
そのため、このファイルは複数のプログラムから呼び出され、各プログラムそのものと直接の関係はありません。無理にプログラム1個につきフォルダ1個を作る必要はありませんが、実際にはデバッグ用のファイルなどが生成されてややこしくなるため、フォルダ1個を作った方が管理がしやすくなるかと思います(少しややこしいので理解していただけるか微妙なところ…)。

できました!。すごいです。

by 朝顔 » 2006年10月30日(月) 01:28

できました。すごいです。ありがとうございました。一気にやる気になりました。
AB4を早速ダウンロードしてコンパイルしたら、動いちゃいました。

でも、
①作ってもらったコードをデバッグしたら
    スレッド(&HA14)でアクセス違反がありました(EPI=&H7C958FEA)。
と一番下の方に表示されてプログラムが止まりました。そのすぐ上の「グローバル」タブには、青い右向き三角とともに
    n1$(&h0)アクセスできません。
    (↑他にもいくつか・・・)
と書かれています。
②さらにファイル名は「prompt.sbp」とかかれています。
このようなモノが自動で作られるということは、
プログラム1個につきフォルダ1個を作って管理していく必要がある
ということなんでしょうか?

特に①のデバッグ件については、教えてもらったコードを元に、
算数プログラムを開発していくのに重要なので、解決方法をよろしくお願いします。
②については(もうすぐ40才なので)ごく簡単に説明していただけると、
助かります。よろしくお願いします。

移植案。

by hira » 2006年10月29日(日) 20:54


一応移植案です。
DATA文にあたるところはPutDataという専用の関数を作成して対応しています。
PutData(数字,パターン,カラー,x,y)
といった感じで(引数が1個増えています)。
行番号などは面倒なのでそのままです(並びが無茶苦茶です^^;;)
極力N88BASICスタイルを保ってみました(変数の宣言が必須になっているとか、命令語がなくなっているなど、どうしても変更しなければいけないところは変更しています)。
N88BASICにはあまり詳しくないので、間違っているところがあるかもしれません。そのときはどなたかご指摘お願いします。

これがプログラムの一部です。

by 朝顔 » 2006年10月29日(日) 19:33

皆さん、お返事ありがとうございます。
これがプログラムの一部を抜粋したモノです。
ABの2.56で動作しています。
実行すると、画面に赤い色で「1」が大きく表示されます。
3000行にRESTORE文があります。
3100行にREAD文があります。
4500行以降がDATA文です。(←こんなのが10パターンあります。)

大文字のところは、昔から全くいじっていないところです。
とってもわかりづらいですが、よろしくお願いします。

コード: 全て選択


1000 '初期設定値
1010 CCC1=2
1020 n1=1
1030 n1$=Str$(n1) 
1040 TASUHIKU=0  :dxi=1.5:dx=50  :dxmoji=80  :xp0=1 :dyi=1.5:dy=100 :dymoji=0
1050 GOSUB *HYOUJI1
1820 END

2180 *HYOUJI1'------------------------------------------------------入力された文字を分析します。
2190 DTDT$=""
2200 CCC0=CCC1
2210 NUMn1=LEN(n1$)-1    'n1の桁数
2220 FOR I=1 TO NUMn1
2230     NUMn1$(I)="S"+Mid$(n1$,I+1,1)
2240     DTDT$=DTDT$+NUMn1$(I)
2250 NEXT
2260 GOSUB *MOJIWOKAKU
2270 RETURN
2280 '
2650 *MOJIWOKAKU'-----------------------------------------------------文字を書きます
2660 NDTDT=LEN(DTDT$)
2670 DTN=5000
2700 DTN=NUM-1
2770 '////////////////////////////////////////////////////////
2850 FOR ii=1 TO NDTDT STEP 2
2860     XX=ii :DT$=Mid$(DTDT$,ii,2) :GOSUB *DATINP :GOSUB *W
2880 NEXT
2890 '////////////////////////////////////////////////////////
2900 RETURN
2910 '
2920 '
3050 *DATINP'---------------------------------------------DATA行の読み込み
2950 DTN=0
2960 DATFROM$=DT$
3000 if DATFROM$="S1" then Restore *s1     '数字の「1」を読み込む
'        if DATFROM$="S2" then Restore *s2     '数字の「2」を読み込む
'        if DATFROM$="S3" then Restore *s3     '数字の「3」を読み込む
'        if DATFROM$="S4" then Restore *s4     '数字の「4」を読み込む
'        if DATFROM$="S5" then Restore *s5     '数字の「5」を読み込む
'        if DATFROM$="S6" then Restore *s6     '数字の「6」を読み込む
'        if DATFROM$="S7" then Restore *s7     '数字の「7」を読み込む
'        if DATFROM$="S8" then Restore *s8     '数字の「8」を読み込む
'        if DATFROM$="S9" then Restore *s9     '数字の「9」を読み込む
'        if DATFROM$="S0" then Restore *s0     '数字の「0」を読み込む
3070 *kokoko
3080      for JUJU=1 to 500
3090          DTN=DTN+1
3100          Read nPEN(DTN),ccc(DTN),xp(DTN),yp(DTN)
3180       if xp(DTN)=0 and yp(DTN)=0 then *edatinp
3190          xp(DTN)=xp(DTN)*dxi+dx+(ii-1)*dxmoji
3200          yp(DTN)=yp(DTN)*dyi+dy+(ii-1)*dymoji
3210          CCC(DTN)=CCC0
3230      next  
3240 *edatinp
3250 return
3230 '
3240 '
3250 *W'////////////////////////////////////////////////////
3260 FOR I=1 TO DTN-1
3270     GOSUB *PENPEN
3290 NEXT
3300 RETURN
3310 '
3320 '
3330 *PENPEN'///////////////////////////////////////////////////
3340 On nPEN(I) GOTO *P0,*P1,*P2,*P3,*P4,*P5,*P6,*P7,*P8,*P9
3350     *P0 :CIRCLE(xp(I),yp(I)), 1*xp0,CCC(I),,,,F :GOTO *EPEN
3360     *P1 :CIRCLE(xp(I),yp(I)), 2*xp0,CCC(I),,,,F :GOTO *EPEN
3370     *P2 :CIRCLE(xp(I),yp(I)), 4*xp0,CCC(I),,,,F :GOTO *EPEN
3380     *P3 :CIRCLE(xp(I),yp(I)), 6*xp0,CCC(I),,,,F :GOTO *EPEN
3390     *P4 :CIRCLE(xp(I),yp(I)), 8*xp0,CCC(I),,,,F :GOTO *EPEN
3400     *P5 :CIRCLE(xp(I),yp(I)),10*xp0,CCC(I),,,,F :GOTO *EPEN
3410     *P6 :CIRCLE(xp(I),yp(I)), 2*xp0,CCC(I)      :GOTO *EPEN
3420     *P7 :CIRCLE(xp(I),yp(I)), 4*xp0,CCC(I)      :GOTO *EPEN
3430     *P8 :CIRCLE(xp(I),yp(I)), 6*xp0,CCC(I)      :GOTO *EPEN
3440     *P9 :CIRCLE(xp(I),yp(I)), 8*xp0,CCC(I)      :GOTO *EPEN
3450 *EPEN
3460 RETURN
3470 '
3480 '
4480 *s1
4490 color 5
4500 Data 6,1,64,39
4510 Data 6,1,64,38
4520 Data 6,1,68,37
4530 Data 6,1,69,36
4540 Data 6,1,71,34
4550 Data 6,1,73,32
4560 Data 6,1,75,31
4570 Data 6,1,77,29
4580 Data 6,1,77,28
4590 Data 6,1,80,27
4600 Data 6,1,81,26
4610 Data 6,1,81,27
4620 Data 6,1,81,36
4630 Data 6,1,81,38
4640 Data 6,1,80,40
4650 Data 6,1,79,48
4660 Data 6,1,80,50
4670 Data 6,1,80,52
4680 Data 6,1,79,53
4690 Data 6,1,79,61
4700 Data 6,1,79,63
4710 Data 6,1,80,65
4720 Data 6,1,79,66
4730 Data 6,1,78,74
4740 Data 6,1,79,76
4750 Data 6,1,79,78
4760 Data 6,1,78,81
4770 Data 6,1,77,84
4780 Data 6,1,77,87
4790 Data 6,1,77,89
4800 Data 6,1,77,91
4810 Data 6,1,77,93
4820 Data 6,1,77,97
4830 Data 6,1,77,99
4840 Data 6,1,77,101
4850 Data 6,1,77,104
4860 Data 6,1,77,106
4870 Data 6,1,76,108
4880 Data 6,1,76,111
4890 Data 6,1,77,114
4900 Data 6,1,77,116
4910 Data 6,1,77,118
4920 Data 6,1,77,119
4930 Data 6,1,77,120
4940 Data 6,1,77,123
4950 Data 6,1,77,126
4960 Data 6,1,77,127
4970 Data 6,1,77,129
4980 Data 0,0,0,0
4990 goto *kokoko
5000 

by konisi » 2006年10月29日(日) 12:34

配列の初期化と言うのは、例えば次のようなコードです。

コード: 全て選択

Dim prime[9]=[2,3,5,7,11,13,17,19,23,29] As Long
つまり、最初に代入しておきましょう という考えです。

by 秋風 » 2006年10月29日(日) 10:34

私は配列の初期化とかよくわからないのですがだめなんですか?。

素人的な考えでお恥ずかしいのですが文字列変数を宣言して
16進数にでも変換して格納するというのはどうでしょう。

Data1$="FFFEFD"

by hira » 2006年10月28日(土) 21:45

具体的にはどのようにこれらの命令を使っていらっしゃるのでしょうか。
各命令の使用部分をそれぞれ一部だけでも抜粋していただけたら移植案が出せるかと思いますので。

お返事ありがとうございます。

by 朝顔 » 2006年10月28日(土) 20:38

 実は、今回の質問の書き込みをした後、思い出したのですが、ずいぶん昔に同じようなことを質問したことがありました。でも何人かの方が教えてくださったことは、遙かに自分の知識とやる気を超えたモノだったので、ついて行けず、あえなく断念しました。そのとき教えてくださった方には、ごめんなさい。

 そもそも、今作っているプログラムは、一年生の算数の足し算や引き算のソフトで、どの先生でも、どの児童でも、どの家庭でも簡単に使えるようにしたいという超基本コンセプトがあります(←生意気ですが)。

 この超基本コンセプトが自分になかった時代=今ほどパソコンが学校現場や家庭の中に入ってなかった時代には、そのDATA文のデータをシーケンシャルファイルとして、別においてあったのです。まだMS-DOSのN88-BASICのころです。
 つまり、自分しかパソコンをもっていなくて、自分しかそのソフトを使えない環境だったので、そのようなプログラムで良かったのです。ところがそのままのプログラムでは、ドライブ番号やフォルダの変更に対応できなかったので(←これも私の未熟なところ)、他人への配布はあきらめていました。そのうちWindowsで動くBASICの存在(←ABのこと)を知りました。
 しかし、あるとき、データを本体プログラムに内蔵したら、「~~.EXE」のみになって配布が可能になると、ひらめいたのです(←プログラミングの醍醐味です)。もちろん動作速度も改善されるし・・・。それがREAD文DATA文RESTORE文の組み合わせでした。

 と、かなり長くなってしまいましたが、数百行のデータは何とかプログラム本体に起きたいのです。AB2でプログラミングを続けるなら、問題ないといえば問題ないのですが・・・。
ちなみにそのDATA文は、10パターンあり、1パターンが数十行あるで、全部で数百行となります。各DATA文1行は4次元配列となっています。

よろしくお願いします。

by イグトランス » 2006年10月26日(木) 23:11

完全に代わりとなるものはないのですが,配列の初期化を活用してみたり,
ファイルから読み込むようにするのはどうでしょうか?
Restore相当のことを考えなければならない場合はさらに面倒かもしれません。

ページトップ