|
|
|
2006/6/13(Tue) 16:36:38|NO.1084
こんにちは
下のスクプリトのように外貨計算のプログラムを作ったのですが
計算結果がいつも0になってしまいます
ちゃんと計算結果が出るようにするにはどうしたらいいでしょう
*ForeignCurrencyCalculation
cls
QMoney=0
pos 150,150
input QMoney,100,20,13
QCurrency=0
objsize 70,24
pos 260,150
combox QCurrency,120,"通貨\n日本円\n米ドル"
pos 340,150
mes "⇒"
ACurrency=0
objsize 70,24
pos 360,150
combox ACurrency,120,"通貨\n日本円\n米ドル"
objsize 100,21
pos 440,150
button "Calculation",*CalculationStart
stop
*CalculationStart
cls
pos 150,150
input QMoney,100,20,13
objsize 70,24
pos 260,150
combox QCurrency,120,"通貨\n日本円\n米ドル"
pos 340,150
mes "⇒"
objsize 70,24
pos 360,150
combox ACurrency,120,"通貨\n日本円\n米ドル"
objsize 100,21
pos 440,150
button "Calculation",*CalculationStart
if QCurrency=2 and ACurrency=1: {
QManey*rate=Result
}
if QCurrency=1 and ACurrency=2: {
QManey/rate=Result
}
pos 200,180
mes "計算結果"+str(Result)
stop
※プログラムの組み方が根本的に違うかも知れません
レートの取得方法は
前回質問した
http://hsp.tv/play/pforum.php?mode=all&num=1033
のスクプリトを使用させていただいています
スクプリト内の
rate
という変数にレートの情報が入っています
よろしくお願いします
|
|
2006/6/13(Tue) 17:54:15|NO.1087
計算結果が正しいかどうかはよく分かりませんが少しおかしいところがあったのを修正して
あと、HSP3のバグらしき動作があったので簡単な対策をしてみました。
もう少しいい解決方法があるかもしれません。
*ForeignCurrencyCalculation
cls
QMoney = 0
pos 150, 150
input QMoney, 100, 20, 13
id = stat
QCurrency = 0
objsize 100, 24
pos 260, 150
combox QCurrency, 120, "通貨\n日本円->米ドル\n米ドル->日本円"
objsize 100, 21
pos 370, 150
button "Calculation", *CalculationStart
stop
*CalculationStart
sdim buf, 0xffff + 1
sendmsg objinfo(id, 2), 0x000D, 0xffff, varptr(buf)
QManey = double(buf)
if QCurrency = 2 {
Result = "\\" + QManey * rate
} else : if QCurrency = 1 {
Result = "$" + QManey / rate
} else {
stop
}
pos 200, 180
cx = ginfo(22)
cy = ginfo(23)
x = cx
y = cy
x2 = cx + mx
y2 = cy + my
color 255, 255, 255
boxf x, y, x2, y2
color 0, 0, 0
mes "計算結果: " + str(Result)
mx = ginfo(22)
my = ginfo(23)
x = cx
y = cy
x2 = cx + mx
y2 = cy + my
stop
|
|
2006/6/14(Wed) 03:37:06|NO.1096
> input QMoney, 100, 20, 13
> QManey = double(buf)
よく見てみるとQMoneyとQManeyで綴り間違っていますね。
これが原因で、綴りとしてはQMoneyの方が正しいです。
ただ、このままだと整数しか扱えず、小数点まで計算したい場合はそのままでは無理
だったりするので、WM_GETTEXTを使用する方法はかなり有効だと思います。
文字列など余計なものも含めることができてしまうのでどちらかというと整数部と少数部を
分けてES_NUMBER(0x2000)スタイルを設定した方がいいかもしれません。
> sdim buf, 0xffff + 1
> sendmsg objinfo(id, 2), 0x000D, 0xffff, varptr(buf)
ここは
sendmsg objinfo(id, 2), 0x000e, 0, 0
len = stat
sdim buf, len + 1
sendmsg objinfo(id, 2), 0x000d, len, varptr(buf)
こうした方がいいかも。
|
|
2006/6/14(Wed) 16:24:51|NO.1100
こんにちは
Irisawaさん回答ありがとうございます
実際にプログラム本体にIrisawaさんのスクプリトを組み込んだのですが
計算結果が$0.000000または\0.000000になってしまいます
レートはちゃんと取得できているのですが
(レートはプログラム起動時に取得してmes命令で描画しています)
計算だけがどうしてもできません
ほかに対処法がありましたら教えてください
今度はレート取得部分もあわせてスクプリトを公開します
#include "hspsock.as"
size=12000:sdim buf,size:ps=""
st="1</td><td>":en="</td>"
sockopen 0,"quote.yahoo.co.jp",80:if stat{goto *ErrorThree}
sockput "GET /m3?u HTTP/1.0\nHost:???\nUser-Agent:???\n\n":if stat{goto *ErrorOne}
repeat size/64-1:await 0
sockget ps,64:if stat{break}
b=peek(ps,0):if b=0{er=1:break}else{buf+=ps}
loop
if er{
pos_st=instr(buf,0,st)
pos_en=instr(buf,pos_st+strlen(st),en)
if (pos_st=-1)|(pos_en=-1){goto *ErrorThree}
rate=double(strmid(buf,pos_st+strlen(st),pos_en))
}else{mes "接続ミス":goto *ErrorTwo}
*ErrorOne
mes "接続失敗しました":sockclose:stop
*ErrorTwo
mes "404 Error":sockclose:stop
*ErrorThree
mes "取得失敗しました":sockclose:stop
screen 0,600,400,0,ginfo_dispx/2-300,ginfo_dispy/2-200
mes "現在のレート"
pos 220,80
mes "米ドル "+str(rate)+" 円"
*ForeignCurrencyCalculation
QMoney = 0
pos 150, 150
input QMoney, 100, 20, 13
id = stat
QCurrency = 0
objsize 100, 24
pos 260, 150
combox QCurrency, 120, "通貨\n日本円->米ドル\n米ドル->日本円"
objsize 100, 21
pos 370, 150
button "Calculation", *CalculationStart
stop
*CalculationStart
sdim buf, 0xffff + 1
sendmsg objinfo(id, 2), 0x000D, 0xffff, varptr(buf)
QManey = double(buf)
if QCurrency = 2 {
Result = "\\" + QManey * rate
} else : if QCurrency = 1 {
Result = "$" + QManey / rate
} else {
stop
}
pos 200, 180
cx = ginfo(22)
cy = ginfo(23)
x = cx
y = cy
x2 = cx + mx
y2 = cy + my
color 255, 255, 255
boxf x, y, x2, y2
color 0, 0, 0
mes "計算結果: " + str(Result)
mx = ginfo(22)
my = ginfo(23)
x = cx
y = cy
x2 = cx + mx
y2 = cy + my
stop
とりあえず前回質問の
なたでさんの回答を
そのまま使用させていただいています
よろしくお願いします
| |
|
2006/6/14(Wed) 17:31:21|NO.1101
注)スクリプトは字下げしないと、読みにくいものですよ。
レートをダウンロードする部分はなたでさんのコードのままのようですが、
なたでさんのコード(No.1035)では「ダウンロード完了」でレートが表示されるのですが、
NICEさんのコード(No.1100)は
> レートはちゃんと取得できているのですが
> (レートはプログラム起動時に取得してmes命令で描画しています)
と言っていますが「接続失敗しました」と表示されます。
コンボボックスなどオブジェクトは表示されませんよ。
自分の実行したスクリプトと載せるスクリプトが一致しないと話が通じません...
私のほうで最後までオブジェクトを表示されるように処理の流れを変えたところ、
ちゃんと計算できています。
字下げ・インデントなどがされていないので、
自分で自分のコードの流れが分からなくなっているだけではないでしょうか?
|
|