投稿者:Bsitumonn
投稿日:2020年 6月15日(月)17時51分15秒
|
|
|
C言語のように、十進BASICでソースファイルを分割し、ソースファイルAで用意した配列に対して、ソースファイルBでその要素を検査(行列の階数を調べる)ことはできないのでしょうか?
できるかできないかお返事お願いします。
下に自分の作ったhakidasi.BASからkaidan.BASが呼び出せるか試した、2つのソースファイルを掲載します。
!hakidasi.BAS
REM SET ZONEWIDTH 3
INPUT PROMPT "行の長さ":a
INPUT PROMPT "列の長さ":b
INPUT PROMPT "出力蘭の幅":c
SET ZONEWIDTH c
DIM hai(a,b)
DIM retubeku(a,1)
FOR i=LBOUND(retubeku,1) TO UBOUND(retubeku,1)
LET retubeku(i,1)=INT(10*RND)
PRINT retubeku(i,1),
PRINT
NEXT i
RANDOMIZE
FOR i=LBOUND(hai,1) TO UBOUND(hai,1)
FOR j=LBOUND(hai,2) TO UBOUND(hai,2)
LET hai(i,j)=INT(10*RND)
REM PRINT hai(i,j),
NEXT j
PRINT
NEXT i
DIM sagyouhai(a,b+1)
FOR i=LBOUND(sagyouhai,1) TO UBOUND(sagyouhai,1)
FOR j=LBOUND(sagyouhai,2) TO UBOUND(sagyouhai,2)
IF (j<=b) THEN
LET sagyouhai(i,j)=hai(i,j)
ELSE
LET sagyouhai(i,j)=retubeku(i,1)
END IF
PRINT sagyouhai(i,j),
NEXT j
PRINT
NEXT i
REM execute "BASIC.EXE" WITH("kaidan.BAS") !別の十進BASICファイルの呼び出し。
REM CALL kaidan.BAS !別の十進BASICファイルの呼び出し。
END
! kaidan.BAS
PRINT "階段.bas"
END
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 6月16日(火)16時57分9秒
|
|
|
投稿者:Bsitumonn
投稿日:2020年 6月16日(火)23時37分45秒
|
|
|
SHIRAISHI Kazuoさんへのお返事です。
MERGE文の紹介ありがとうございます。MERGE文をつかったところ、
MERGE文の使用法がわからないので質問します。
kaidan.BASに、retubeku(1,1)=0(retubekuはhakidasi.BASで宣言した配列)と書いて、hakidasi.BASのENDの後、最後尾にMERGE "kaidan.BAS"とかいて、実行すると、retubekuはここにかけません。というエラーがでました。
また、Libraryサブディレクトリの、APISUP1.LIBにある 関数が利用できれば、ソースファイルAの配列をソースファイルBに書いた関数にわたして、処理できると思ったので、
Libraryサブディレクトリの、APISUP1.LIBにある EXTERNAL FUNCTION DWORD$(n)のnに引数を与えて呼び出す方法と、hakidasi.BASの配列をkaidan.BASに渡して、配列の中身を表示する方法をおしえてください。よろしくおねがいします。
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 6月17日(水)07時48分26秒
|
|
|
MERGE文は,翻訳時にテキストを合体させるだけです。
ただし,プログラム単位あるいはモジュールの外に書かなければいけないという制約があるので,実質,プログラム単位あるいはモジュールごとの分割になります。
MERGEされる側の問題でエラーが出る場合,デバッグは容易ではありません。
その部分に読み込むべきテキストを合体させてテストしてください。
http://hp.vector.co.jp/authors/VA008683/
|
|
|
投稿者:しばっち
投稿日:2020年 6月17日(水)19時28分28秒
|
|
|
> No.4843[元記事へ]
Bsitumonnさんへのお返事です。
もしかして、下記のようなプログラムのことではないでしょうか?
--------------------------------------------------------------
example.bas
RANDOMIZE
LET N=100
DIM A(N)
FOR I=1 TO N
LET A(I)=INT(RND*1000)
NEXT I
CHAIN "test.bas" WITH (N,A)
END
--------------------------------------------------------------
test.bas
PROGRAM SAMPLE(N,A())
FOR I=1 TO N
PRINT A(I)
NEXT I
END
|
|
|
投稿者:Bsitumonn
投稿日:2020年 6月18日(木)04時13分37秒
|
|
|
> No.4847[元記事へ]
しばっちさんへのお返事です。
ソースファイルの紹介ありがとうございます。コピーしてファイル名を少し変更し実行したところ
test.BASのPROGRAM文でextype4301 引数の個数の過不足や型の不一致がおこりました。
(N=100とDebugウィンドウに表示はされた。)
PROGRAM文のあとを、test.BASにしてみたり、test.BAS側の変数名を変えてみたりしましたが、回避できません。
よろしければ回避方法を教えてください。
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 6月18日(木)07時42分36秒
|
|
|
投稿者:しばっち
投稿日:2020年 6月18日(木)19時44分38秒
|
|
|
> No.4848[元記事へ]
Bsitumonnさんへのお返事です。
> test.BASのPROGRAM文でextype4301 引数の個数の過不足や型の不一致がおこりました。
> (N=100とDebugウィンドウに表示はされた。)
> PROGRAM文のあとを、test.BASにしてみたり、test.BAS側の変数名を変えてみたりしましたが、回避できません。
> よろしければ回避方法を教えてください。
こちらでは問題なかったので試してみました。
2進モード、複素数モード以外ではおっしゃる通りのエラーが出るようですね。
逆に2進モード、複素数モードではN=100000でも問題なく動きました。
Lazarus版十進BASICでも同様な現象が見られましたので
十進BASIC側のバグにも思われますが、そういう仕様なのかもしれません。
いつもは2進モードで実行しているので気が付きませんでした。
P.S
初期起動モード設定をBASIC.INIに記述して起動モードを10進モードから他へ変更できるようにできませんか?
10進モードはほとんど使用していません。
P.S
DWORD$関数は既にシステムに組み込まれていますので最新版をご使用ならAPISUP1.LIBは必要はありません。
(※Windows版十進BASIC ver7.8.5.4を使用)
OPTION CHARACTER BYTE
LET A$=DWORD$(12345678)
DIM S(4)
FOR I=1 TO 4
LET S(I)=ORD(A$(I:I))
PRINT S(I);
NEXT I
PRINT
PRINT S(1)+S(2)*256+S(3)*256^2+S(4)*256^3
END
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 6月19日(金)07時24分2秒
|
|
|
> No.4850[元記事へ]
CHAIN文はバグのようです。
2進モード,複素数モードで正しく動くという情報でバグの所在が絞られました。
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2020年 6月19日(金)16時22分40秒
|
|
|
投稿者:Bsitumonn
投稿日:2020年 6月20日(土)20時18分0秒
|
|
|
> No.4852[元記事へ]
SHIRAISHI Kazuoさんへのお返事です。
いろいろ教えていただきありがとうございました。
|
|
|
戻る