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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0613
NICE外貨計算4未解決


NICE

リンク

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
という変数にレートの情報が入っています
よろしくお願いします



この記事に返信する


Irisawa

リンク

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



Irisawa

リンク

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)
こうした方がいいかも。



NICE

リンク

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
とりあえず前回質問の
なたでさんの回答を
そのまま使用させていただいています
よろしくお願いします



kz3

リンク

2006/6/14(Wed) 17:31:21|NO.1101

注)スクリプトは字下げしないと、読みにくいものですよ。

レートをダウンロードする部分はなたでさんのコードのままのようですが、
なたでさんのコード(No.1035)では「ダウンロード完了」でレートが表示されるのですが、
NICEさんのコード(No.1100)は

> レートはちゃんと取得できているのですが
> (レートはプログラム起動時に取得してmes命令で描画しています)

と言っていますが「接続失敗しました」と表示されます。
コンボボックスなどオブジェクトは表示されませんよ。

自分の実行したスクリプトと載せるスクリプトが一致しないと話が通じません...

私のほうで最後までオブジェクトを表示されるように処理の流れを変えたところ、
ちゃんと計算できています。

字下げ・インデントなどがされていないので、
自分で自分のコードの流れが分からなくなっているだけではないでしょうか?



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