このようなところに書き込むのは初めてなので至らぬところが
あったとしても大目に見ていただけるとありがたいです。
また、プログラミングに関してもほとんど勉強中の身ですので
私の書いたプログラムは稚拙だとは思いますがご了承していただけると幸いです。
前置きが長くなってしまい申しわけありませんが本題のほうに入らせていただきます。
私は現在、hspで2~9進数を10進数へと変換するプログラムを書こうとしています。
(それを計算するための関数(?)の存在があるというのは調べた時にすこし
目に入ってきましたが今回はそれは使わない方法でやろうと思っています。)
こちらのプログラムで私のやりたいこと(現状未解決な部分)は、
1,screen3にきちんと計算結果がプログラム開始から記録される
(これはおそらくサブルーチンジャンプした後にウィンドウを設定しているからだと
思われるのですが、どこを直せばうまくいくのかがわかりません...)
2,途中の戻る処理、もしくは一度計算が終わった後にもう一度計算をしようとすると
なぜか入力したのに入力してない判定になる
(例)ウィンドウ:変換する数の入力 の際に戻るを押して
ウィンドウ:桁数入力 でもう一度入力しなおすと入力したはずなのに
ダイアログ:何も入力されていません と表示されてしまう)
どなたか詳しい方いましたら上記の問題が起こっている部分とその理由、
そして解決方法(もしくは解決するコード)をお教えしていただけないでしょうか...
だいぶ無茶なお願いであることは100も承知ですが何卒よろしくお願いします。
出来ればプログラムの基盤は今書いている通りでお願いしたいです。
以下プログラム記述
*hajimari screen 0,400,170,0,200,200 title "基数選択 font "明朝",20,1 mes "変換したい数の基数を選択してください b=2 objsize 70,30 repeat 2 x=cnt repeat 4 pos cnt*80+50,x*50+50 button gosub ""+b+"",*kisuutosaidai p=int(stat)+2 objprm stat,"("+p+")" b+=1 loop loop button gosub "end",*fin stop *kisuutosaidai;ボタンによって変数を変える z=int(stat)+2;zは基数 if stat=0{ d=31;dは32bitを超えない最大桁数 }else:if stat=1{ d=19 }else:if stat=2{ d=15 }else:if stat=3{ d=13 }else:if stat=4{ d=11 }else:if stat=5{ d=11 }else:if stat=6{ d=10 }else:if stat=7{ d=9 } *ketasuunyuuryoku wait 10;エンターキーの巻き込み防止 gsel 0,-1 screen 1,350,120,0,210,210 title "桁数入力 font "明朝",18,1 mes "変換する数の桁数を入力してください" mes "入力し終えたらEnterキーを押してください" #uselib "user32.dll" #cfunc GetWindowLong "GetWindowLongA" sptr, sptr #func SetWindowLong "SetWindowLongA" sptr, sptr, sptr k="";桁数を入力してもらう objmode 2:input k,300 hInput = objinfo(stat, 2) SetWindowLong hInput, -16, $50010080 | $2;inputの右詰め SetWindowLong hInput, $FFFFFFF0, GetWindowLong(hInput, $FFFFFFF0)|$00002000;1~9以外のキーボードの入力禁止 k=int(k) mes "基数("+z+") 計算可能な桁数("+d+"桁) button goto "戻る",*hajimari;基数の選択に戻る *nyuuryokukakuninn tp="" getkey tp,13;エンターキーが押されたら数値入力に飛ぶ if tp:goto *suutinyuuryoku wait 1 goto *nyuuryokukakuninn *suutinyuuryoku k=int(k) if k>d{;dを超える数が入力されたらエラーを吐く wait 50 dialog"桁が大きすぎます",1,"エラー" gosub *ketasuunyuuryoku } if k=0{;kに何も入力されていなかった場合エラーを吐く wait 50 dialog"何も入力されていません",1,"エラー" gosub *ketasuunyuuryoku } wait 50;エンターキーの巻き込み防止 gsel 1,-1 screen 2,600,300,0,190,190 title "変換する数の入力" onkey gosub *hennkann font "明朝",20,1 mes ""+k+"桁の"+z+"進数を10進数に変換します" mes "下の入力欄に"+z+"進数を入力してください" n="":objmode 2:input n,300,,k;変換する数を入力してもらう hInput = objinfo(stat, 2) SetWindowLong hInput, -16, $50010080 | $2;上と同じ(LINE53,54) SetWindowLong hInput, $FFFFFFF0, GetWindowLong(hInput, $FFFFFFF0)|$00002000 button gosub "戻る",*syoukyo;桁数の入力へ戻る objmode 0:objsize 60,25:pos 540,275:button gosub "閉じる",*fin stop *hennkann if wparam=13{;エンターキーが押されたらこの処理を行う wait 20 if n=""{;nに何も入っていない場合エラーを吐く dialog"何も入力されていません",1,"エラー" gosub *suutinyuuryoku } objsel -1 dim a,k;上の桁から10進数へ変換し、足し合わせる m=0 s=0 repeat int(k) a(m)=int(strmid(n,m,1)) if a(m)>=z:dialog"変換できない数字が入力されました。",1,"エラー":break s+=a(m)*powf(z,k-1-m) m+=1 loop if stat=0:gosub *toriaezu return }return stop *toriaezu screen 3,600,400,0,1300,0;計算結果を記録していく(未完成) title "結果表示" font "明朝",20,1:mes " 変換履歴 mes "" pos 0,y:mes ""+z+"進数の"+n+"を10進数に変換すると"+s+"になります。" y+=25 n=0 s=0 objsize 60,25:pos 540,375:button gosub "終わる",*fin gosub *suutinyuuryoku *syoukyo gsel 2,-1 goto *ketasuunyuuryoku *fin end