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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
朝顔

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

#1 投稿記事 by 朝顔 »

昔のBASICやAB2まではサポートされていた
READ文 DATA文 RESTORE文は
AB4~では、どのように移植すれば良いのでしょうか?
DATA文が数百行ほどあります。
昔のBASICから頭が切り換えられないので、
どこから手をつけていいのかさっぱりです。
よろしくお願いします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

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

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

#3 投稿記事 by 朝顔 »

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

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

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

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

よろしくお願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#4 投稿記事 by hira »

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

#5 投稿記事 by 秋風 »

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

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

Data1$="FFFEFD"
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#6 投稿記事 by konisi »

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

コード: 全て選択

Dim prime[9]=[2,3,5,7,11,13,17,19,23,29] As Long
つまり、最初に代入しておきましょう という考えです。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
朝顔

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

#7 投稿記事 by 朝顔 »

皆さん、お返事ありがとうございます。
これがプログラムの一部を抜粋したモノです。
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 
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

移植案。

#8 投稿記事 by hira »


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

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

#9 投稿記事 by 朝顔 »

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

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

特に①のデバッグ件については、教えてもらったコードを元に、
算数プログラムを開発していくのに重要なので、解決方法をよろしくお願いします。
②については(もうすぐ40才なので)ごく簡単に説明していただけると、
助かります。よろしくお願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#10 投稿記事 by hira »

①作ってもらったコードをデバッグしたら
    スレッド(&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個を作った方が管理がしやすくなるかと思います(少しややこしいので理解していただけるか微妙なところ…)。
朝顔

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

#11 投稿記事 by 朝顔 »

画面下の「プロシージャ」を「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
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#12 投稿記事 by hira »

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

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

やっぱり同じです。

#13 投稿記事 by 朝顔 »

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

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

Re: やっぱり同じです。

#14 投稿記事 by hira »

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

#15 投稿記事 by OverTaker »

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