ab.com コミュニティ https://www.activebasic.com/forum/ |
|
N88BASICのプログラムはどうすれば動作できますか https://www.activebasic.com/forum/viewtopic.php?t=2399 |
ページ 1 / 2 |
作成者: | kikiriri [ 2008年6月02日(月) 20:11 ] |
記事の件名: | N88BASICのプログラムはどうすれば動作できますか |
すみません、 以下の、N88BASICのプログラムの動作を確認したいのですが、 デバッグとかできるとよりいいですが。 やさしいハウトゥお願いします。 100 ' -------------------------- 110 ' * ヒルベルト曲線 * 120 ' -------------------------- 130 ' 140 DIM STACK(1000) 150 SP=0 160 ' 170 SCREEN 3,0,0,1:CLS 3 180 POINT(240,280) 190 N=4:L=10:ANGLE=90:GOSUB *HILBERT 200 END 210 *HILBERT 220 IF N=0 THEN RETURN 230 ZDEG=ANGLE:GOSUB *TURN 240 GOSUB *PUSH 250 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 260 GOSUB *POP 270 ZLENG=L:GOSUB *MOVE 280 ZDEG=-ANGLE:GOSUB *TURN 290 GOSUB *PUSH 300 N=N-1:GOSUB *HILBERT 310 GOSUB *POP 320 ZLENG=L:GOSUB *MOVE 330 GOSUB *PUSH 340 N=N-1:GOSUB *HILBERT 350 GOSUB *POP 360 ZDEG=-ANGLE:GOSUB *TURN 370 ZLENG=L:GOSUB *MOVE 380 GOSUB *PUSH 390 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 400 GOSUB *POP 410 ZDEG=ANGLE:GOSUB *TURN 420 RETURN 430 *PUSH 440 STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 450 RETURN 460 *POP 470 ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 480 RETURN 490 *MOVE 500 ZX=ZLENG*COS(ZP*3.14159/180) 510 ZY=ZLENG*SIN(ZP*3.14159/180) 520 LINE -STEP(ZX,-ZY) 530 RETURN 540 *TURN 550 ZP=(ZP+ZDEG) MOD 360 560 RETURN |
作成者: | konisi [ 2008年6月02日(月) 20:35 ] |
記事の件名: | |
・先頭に#N88BASICの1文を入れましょう。グラフィック系統の命令語が使えるようになります。 ・Screen命令語は使えません。 ・起動時には画面が初期化されているので、この場合はCLS文は必要ではありません。 ・全ての変数は、Dimで宣言してあげる必要があります。 変数にはその型を明示的に指定する必要があります、 例 コード: Dim ZX As Double,ZY As Double'実数型 Dim SP As Long'整数型・行番号を書くことは必須ではありません。 ・SIN関数、COS関数はそれぞれSin、Cosと書かないと認識されません。 よく覚えてませんが、MODも同様かもしれません。 ・LINE関数には通常、色を指定する必要があります。詳しくはヘルプを見てください。 ・デバッグするためには、debug命令語を流れを見る場所の開始位置に書く必要があります。 F2でデバッグ実行開始です。F7で単体で実行可能なプログラムを作れます。 ・あまり高速に動作する必要がないなら、「N88互換BASIC」というソフトウェアも試してみてください。 互換性はそっちの方が高いですので。 他に何か質問はありますか? |
作成者: | kikiriri [ 2008年6月02日(月) 21:23 ] |
記事の件名: | ありがとうございました!! |
ありがとうございます。 コンパイルまで無事でした。 以下問題が発生 POINTが実行できません。 コマンドプロンプト画面が現れ、 一瞬で終わりました。 以下プログラムを、 POINT文は文法が違うと出るのですが、 コンパイルは無事終了です。POINTコマンドを、コメントにして、 更なるお教えを求む、宜しくお願いします。 #N88BASIC Dim STACK(1000) As Double Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double Dim SP As Long, POINT(240,280) As Double SP=0 'POINT(240,280) N=4:L=10:ANGLE=90:GOSUB *HILBERT END *HILBERT IF N=0 THEN RETURN ZDEG=ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE ZDEG=-ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZDEG=-ANGLE:GOSUB *TURN ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZDEG=ANGLE:GOSUB *TURN RETURN *PUSH STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 RETURN *POP ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 RETURN *MOVE ZX=ZLENG*Cos(ZP*3.14159/180) ZY=ZLENG*Sin(ZP*3.14159/180) LINE -STEP(ZX,-ZY) RETURN *TURN ZP=(ZP+ZDEG) Mod 360 RETURN |
作成者: | kikiriri [ 2008年6月02日(月) 21:35 ] |
記事の件名: | 以下追加のお願いです、すみませんが、 |
ヘルプよりPOINTを、POINTAPIにしたけれど、無効な識別子 LINE文を、 LINE -STEP(ZX,-ZY),123 で実行、 やはり一瞬だけ、コマンドプロンプトが表示され実行経過実行結果とも確認できず。 以上2点特にお願いします。 すみません |
作成者: | konisi [ 2008年6月02日(月) 21:48 ] |
記事の件名: | |
POINTAPIは構造体と言って、特殊な変数型のようなものです。 あなたが求めてるのはPSet関数かもしれません そのLineの123の部分に来る数字は、白なら7、緑なら4などとする必要があります。 勿論123が来た場合の動作は規定されていません。(多分黒になります) END命令語を実行すると、プログラムは終了します。 Sleep(-1)等に変更してみてください |
作成者: | kikiriri [ 2008年6月02日(月) 21:59 ] |
記事の件名: | 追加で質問させてください |
POINTは座標の初期値が欲しいのだと思うのですが、 一応PSETでも実行しました。 やはり一瞬で、経過、結果とも確認できず。 ただ実行までに時間がかかり手応えあり、 2回目以降は割りと速かったです。 理由が分からないのでなんともいえないのですが。 優しいハウトゥ、待ちます。 |
作成者: | kikiriri [ 2008年6月02日(月) 22:16 ] |
記事の件名: | ありがとうございます |
おかげで無事成功!?とまでは行かずとも、 線の一筆書きらしきもの現れました。 ただ一瞬で終わるのと、止める場所が分からない、 正方形のような形になる予定でしたが、 等脚台形らしくて、下が長くて上が短いので、 予定外というかはっきり見てみないと分かりませんが、 たぶん失敗のうち???すみません、ありがとうございました。 はっきり見たら成功だったらいいのですけど?? 以下、そのときのコードを示します。 #N88BASIC Dim STACK(1000) As Double Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double Dim SP As Long, POINT(240,280) As Double SP=0 Pset(240,280) N=4:L=10:ANGLE=90:GOSUB *HILBERT END *HILBERT IF N=0 THEN RETURN ZDEG=ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE ZDEG=-ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZDEG=-ANGLE:GOSUB *TURN ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZDEG=ANGLE:GOSUB *TURN RETURN *PUSH STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 RETURN *POP ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 RETURN *MOVE ZX=ZLENG*Cos(ZP*3.14159/180) ZY=ZLENG*Sin(ZP*3.14159/180) LINE -STEP(ZX,-ZY),6 RETURN *TURN ZP=(ZP+ZDEG) Mod 360 RETURN 僕はぁPOINTと、PSETが分かりません。 あとぅ、どこで止めたら実行結果が止められるか分かりません。 よければ途中の変数値の変化も分かればいいかなぁ? 以上2点、特に結果が見えてきたので止め方お教え願えませんか??? 優しいご助言ありがとうございます。 |
作成者: | イグトランス [ 2008年6月02日(月) 22:17 ] |
記事の件名: | |
AB2を使うというのはだめですか? SCREENステートメントを削除するだけで、問題なく動きました。 ここからダウンロードできます、と書こうとしたのですが、すみません。ダウンロードページが消滅していますね……。 |
作成者: | ゲスト [ 2008年6月02日(月) 22:40 ] |
記事の件名: | |
以下のプログラムで結果を見ることが出来ました、 誠にありがとうございました。 ただ本に出てた結果と違うのと、 プログラムコードが僕には強者で、 理解不能、 正方形の外観になる予定でしたが、 やはり等脚台形でした。惜しい ただこの短時間で移植らしきことが出来たことに感謝しています。 sleep(-1)感謝!!! #N88BASIC Dim STACK(1000) As Double Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double Dim SP As Long, POINT(240,280) As Double SP=0 PSET(240,280) N=4:L=10:ANGLE=90:GOSUB *HILBERT Sleep(-1)'END *HILBERT IF N=0 THEN RETURN ZDEG=ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE ZDEG=-ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZDEG=-ANGLE:GOSUB *TURN ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZDEG=ANGLE:GOSUB *TURN RETURN *PUSH STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 RETURN *POP ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 RETURN *MOVE ZX=ZLENG*Cos(ZP*3.14159/180) ZY=ZLENG*Sin(ZP*3.14159/180) LINE -STEP(ZX,-ZY),6 RETURN *TURN ZP=(ZP+ZDEG) Mod 360 RETURN |
作成者: | ゲスト [ 2008年12月06日(土) 16:12 ] |
記事の件名: | |
100 ' -------------------------- 110 ' * ヒルベルト曲線 * 120 ' -------------------------- 130 ' 140 DIM STACK(1000) 150 SP=0 160 ' 170 SCREEN 3,0,0,1:CLS 3 180 POINT(240,280) 190 N=4:L=10:ANGLE=90:GOSUB *HILBERT 200 END 210 *HILBERT 220 IF N=0 THEN RETURN 230 ZDEG=ANGLE:GOSUB *TURN 240 GOSUB *PUSH 250 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 260 GOSUB *POP 270 ZLENG=L:GOSUB *MOVE 280 ZDEG=-ANGLE:GOSUB *TURN 290 GOSUB *PUSH 300 N=N-1:GOSUB *HILBERT 310 GOSUB *POP 320 ZLENG=L:GOSUB *MOVE 330 GOSUB *PUSH 340 N=N-1:GOSUB *HILBERT 350 GOSUB *POP 360 ZDEG=-ANGLE:GOSUB *TURN 370 ZLENG=L:GOSUB *MOVE 380 GOSUB *PUSH 390 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 400 GOSUB *POP 410 ZDEG=ANGLE:GOSUB *TURN 420 RETURN 430 *PUSH 440 STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 450 RETURN 460 *POP 470 ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 480 RETURN 490 *MOVE 500 ZX=ZLENG*COS(ZP*3.14159/180) 510 ZY=ZLENG*SIN(ZP*3.14159/180) 520 LINE -STEP(ZX,-ZY) 530 RETURN 540 *TURN 550 ZP=(ZP+ZDEG) MOD 360 560 RETURN n88互換basic for windows95でも成功しました、 ご助言ありがとうございました。 |
作成者: | konisi [ 2008年12月06日(土) 18:11 ] |
記事の件名: | |
間違いなく動くコード作ったら こんな具合になりました。 [ここをクリックすると内容が表示されます]
コード: #N88BASIC Dim N As Double,L As Double,ANGLE As Double,ZP As Double Dim PosX=240 As Double,PosY=280 As Double N=4 L=10 ANGLE=90 ZP=0 Hilbert(N,ANGLE,L,ZP) Sleep(-1) Sub Hilbert(N As Long,ANGLE As Double,L As Double,ZP As Double) If N<>0 then Turn(ANGLE) Hilbert(N-1,-ANGLE,L,ZP) Move(L) Turn(-ANGLE) Hilbert(N-1,ANGLE,L,ZP) Move(L) Hilbert(N-1,ANGLE,L,ZP) Turn(-ANGLE) Move(L) Hilbert(N-1,-ANGLE,L,ZP) Turn(ANGLE) End If End Sub Sub Move(ZLENG As Double) Dim x As Double,y As Double x=ZLENG*Cos(ZP*_System_PI/180) y=ZLENG*Sin(ZP*_System_PI/180) LINE (PosX,PosY)-(PosX+x,PosY-y),6 PosX=PosX+x PosY=PosY-y End Sub Sub Turn(ZDEG As Double) ZP=ZP+ZDEG If ZP>360 then ZP=ZP-360 Turn(0) ElseIf ZP<0 then ZP=ZP+360 Turn(0) End If End Sub |
作成者: | kikiriri [ 2008年12月06日(土) 19:07 ] |
記事の件名: | ありがとうございました |
プログラム動作確認(走りました) 再帰の所が難しいと思うんですが、 移植の際どんな風に作業されたのですか、 あと、直線の描画方向の変更等も読みこなしていくには難しいと思うんですが。 再帰的定義について、ビジュアルベーシックで、以下のプロ グラムを実行しました。 ヒルベルト曲線を描くプログラムですが、変数ctが位数らし いのですが、ct=1(最初は、6でした)ctと、ct-1(ct)の所 で、ctの値が、1,0、-1の順で、変わっていくのです が、ctの値が、-1から0になるのが分かりません。 手間とは思いますが、もしよければ、ご意見いただけないで しょうか、再帰的定義や、ぷろぐらむのながれがわかってい ないなと、実感しました。 Public Class Form1 Dim g As Graphics Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Const GSIZE As Integer = 256 Dim ct, lenn, x, y As Integer Dim d As Integer g = PictureBox1.CreateGraphics() g.Clear(PictureBox1.BackColor) ct = 1 lenn = GSIZE / (2 ^ ct) x = GSIZE - GSIZE / (2 ^ (ct + 1)) y = GSIZE / (2 ^ (ct + 1)) d = 270 drawA(ct - 1, x, y, d, lenn) End Sub Private Sub drawA(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer) If ct < 0 Then Exit Sub d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn) drawB(ct - 1, x, y, d, lenn) : d = d - 90 End Sub Private Sub drawB(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer) If ct < 0 Then Exit Sub d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn) drawA(ct - 1, x, y, d, lenn) : d = d + 90 End Sub Private Sub myDrawLine(ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer) Dim oldx, oldy As Integer If d < 0 Then d = d + 360 If d >= 360 Then d = d - 360 oldx = x : oldy = y Select Case d Case 0 : x = x + lenn Case 90 : y = y - lenn Case 180 : x = x - lenn Case 270 : y = y + lenn End Select g.DrawLine(Pens.Black, oldx, oldy, x, y) End Sub End Class 確かにタイニーベーシックで、勉強したことは、多かれ少な かれ、生かされていると思いました。 また以下は、TB [875] Re[874]: 再帰的定義NO.47 投稿者:takeuchi 投稿日:2007/01/16(Tue) 19:30 > 再帰的定義について、ビジュアルベーシックで、以下のプロ > グラムを実行しました。 このプログラムをTBで書き直してみました。殆ど同じです。 Const GSIZE As real = 256 GScreen(GSIZE,GSIZE) input "1から8程度",ct lenn = GSIZE / (2 ^ ct) x = GSIZE - GSIZE / (2 ^ (ct + 1)) y = GSIZE / (2 ^ (ct + 1)) d = 270 drawA(ct - 1, x, y, d, lenn) End Sub drawA(ct , x , y , d , lenn) If ct < 0 Then Exit Sub d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn) drawB(ct - 1, x, y, d, lenn) : d = d - 90 End Sub Sub drawB(ct, x , y , d ,lenn) If ct < 0 Then Exit Sub d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn) drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn) drawA(ct - 1, x, y, d, lenn) : d = d + 90 End Sub Sub myDrawLine(x, y, d, lenn) If d < 0 Then d = d + 360 If d >= 360 Then d = d - 360 oldx = x : oldy = y Select Case d Case 0 : x = x + lenn Case 90 : y = y - lenn Case 180 : x = x - lenn Case 270 : y = y + lenn End Select Line(oldx, oldy)-(x, y) End Sub ご助言などありましたらお願いします。 参考にしてください。 |
作成者: | konisi [ 2008年12月06日(土) 20:27 ] |
記事の件名: | |
GosubやReturnを機械的に関数呼び出しに置き換えて、 PushとPopがいらなくなったので削りました。 他のユーザー定義関数を呼ばない関数から動作を確認して行き、あとは気合で(ry 再帰の捕らえ方は 私はまず、意味上は自分自身を呼び出さない場合(ここではN=1)にどのような動作になるかを確認し、 それから自分自身を呼び出す場合について考えます。 他に助言があるとすれば――hideやcodeのBBCodeを是非使ってください。 或いは、掲示板へのリンクがあれば十分なので、わざわざ全文貼らないでください。 掲示板を探して会話の流れを追うまで、質問の意味もよく分かりませんでした。 #ctの値が-1になることがあるのは、コードを目で追っていっても分かると思うのですが・・・。 |
作成者: | kikiriri [ 2008年12月06日(土) 20:52 ] |
記事の件名: | すみませんでした |
押し付けるような質問ですみませんでした。 ご助言ありがとうございました。 僕は変数の値を追っていくだけで精一杯なので、 ご助言より、 プログラムが動いている感じがします。 生もののようです。 正体はばれているようですんで、 もう少し言うと、いろいろなプログラム言語が読めるのですか? VBを買ってしまい。(エクスプレスバージョン)2005 TBから入ったおかげでついていけてる気もするんですが、 分かってないなという風にも分かり、微妙です。 今は、CやC++、JAVAの勉強をしたほうがいいかもと、 柴田望洋氏の、明解を読んだりしているんですが、 専門的に勉強したことはあるんですか(失礼) 僕には努力が足りないとも思います。 本当にありがたいのですが、 掲示板チャット状態になってしまいそうですが??? よろしければご助言等いただけませんか。 以上すみませんがお願いします。 |
作成者: | konisi [ 2008年12月06日(土) 21:39 ] |
記事の件名: | |
>いろいろなプログラム言語が読めるのですか? 一応、必要になったことのある言語の内大半は読める程度には理解しています。 >専門的に勉強したことはあるんですか 「専門的」の意味が掴めませんが、大学で講義を受けたことはありません。 殆ど独学のようなものですが、勉強する上で沢山の人にヒントを貰いました。 疑問文が質問形式になっているかどうか確認してから投稿したほうがいいよ。 #余分な改行が多い気が・・・ |
ページ 1 / 2 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |