HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0712
プログラミング初心者エラーを吐く理由がわかりません...3未解決


プログラミング初心者

リンク

2024/7/12(Fri) 02:08:07|NO.101889

はじめまして。
このようなところに書き込むのは初めてなので至らぬところが
あったとしても大目に見ていただけるとありがたいです。
また、プログラミングに関してもほとんど勉強中の身ですので
私の書いたプログラムは稚拙だとは思いますがご了承していただけると幸いです。

前置きが長くなってしまい申しわけありませんが本題のほうに入らせていただきます。
私は現在、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



この記事に返信する


 

リンク

2024/7/12(Fri) 19:27:21|NO.101890

①理由は仰る通りですね。
 結果表示時に毎回screen命令が入ってしまうため、内容がリセットされます。
 対応方法としては色々と考えれますが、ぱっと思いつくのは...
 1.計算結果を変数に記録しておく
 2.screen命令を最初の1回だけにして2回目以降はgsel命令を使用する
 3.そもそも起動時時点でscreen3を表示しておき、結果時は1回目からgselを使用する
 4.screen3を使用せず結果もすべて同じスクリーンに表示する
 とかこの辺でしょうか。妥当なのは2か3だと思います。
 毎度screenを入れる意味はないですし。下記は2.の場合ですが、
 「*toriaezu」にある
	screen 3,600,400,0,1300,0;計算結果を記録していく(未完成)

 上記一文を下記に変更してください。
	if screen3=1 : gsel 3 : else : screen 3,600,400,0,1300,0 : screen3=1
 「screen3」という変数が「1」の場合「gsel 3」でアクティブにしています。
 初期状態は「1」ではないため、「screen 3」の命令が実行され、
 その後「screen3」という変数に「1」が入れられます。
 これで最初だけscreenが実行され、2回目以降はgselが使用されます。

②問題が起きる時、どこで問題が起きるかを調べると解決の糸口が見つかりやすいです。
 ソースコードの所々に「title "1"」とかを仕込んで置き、
 問題が起きた時タイトルバーに表示されている数字を見ることで
 この周辺のコードが原因と分かる...とか。

 今回のエラーの場合、同じ内容のエラーが二つあったので、
 ダイアログのタイトル「エラー」を、それぞれ「エラー1」と「エラー2」にして確認しました。
 結果「*hennkann」の方にあるエラーが表示されていることがわかります。
 桁数入力でEnterを押したのに変換する数の入力でEnterを押したときの処理に飛んでるんですね。

 という所まで分かったのですが、ちょっと時間が無いのでこの辺で。
 「変換する数の入力」から戻った時に発生する事象なので、
 その画面を表示する所以降に原因があるのだと思います。その辺確認してみてください。



雪月夜

リンク

2024/7/13(Sat) 08:02:19|NO.101891

>>2,途中の戻る処理、もしくは一度計算が終わった後にもう一度計算をしようとすると
>>なぜか入力したのに入力してない判定になる

本来「桁数入力」画面でエンターを押すと*suutinyuuryokuラベルに進みますが、その後
onkey gosub *hennkann

という処理が実行されるため、 同画面で再度エンターを押すと*hennkannラベルに進むよう経路が切り替わってしまいます。 onkeyは移動先ラベルを変える度に設定する必要があるため *ketasuunyuuryokuラベル内に
onkey gosub *suutinyuuryoku
と記述すれば解決すると思います。



 

リンク

2024/7/13(Sat) 18:44:58|NO.101893

雪月夜さんの仰ってる通りですね。
「変換する数の入力」ではonkeyを使用してますが、
「桁数入力」ではgetkeyを使用し、onkeyを使用してないので、
「*ketasuunyuuryoku」の後に「onkey 0」を入れて解決する方法もありますね。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101889への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>~</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.