--.--.-- *--*
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

はじめてのAurigaスクリプト 基本編(21)

2011.12.20 *Tue*
数値の桁あふれ

Aurigaの所持ゼニーの上限は、設定を変更すれば
最大 2,147,483,647zenyまで有効にできます。


しかし、そこには罠が待ち受けています。



例えばこんな銀行NPCを設置したとします。


mes "[銀行員]";
mes "お引き落としですね?";
mes "それでは、引き落としたい";
mes "金額を入力して下さい。";
next;
input '@price;

//限界値をオーバーしないかチェック
if(Zeny + '@price > 2147483647) {
mes "[銀行員]";
mes "お客様はそれ以上の";
mes "Zenyをお持ちになれないようですね";
mes "またいらしてください。";
close;
}

~~~ 残高のチェックとか減算 ~~~

set Zeny, Zeny + '@price;

mes "[銀行員]";
mes "ありがとうございます。";
mes "またのご利用をお待ちしております。";
close;

これは私が鯖を立てて間もない時にやってしまった失敗スクリプトの一部です。

このスクリプトは一見すると正しいように見えますが
Zenyの上限を超える値が代入されると正しく動作しません。

ゼニーまいなす
チェックは抜けてしまい、所持金額もマイナス表示されたり……


直接的な原因はAurigaの変数の桁あふれにあります。
Aurigaスクリプトの数値変数は
符号付32ビット整数 : 2147483647(0x7FFFFFFF) ~ -2147483648(0x80000000)
となっています。

Zeny + '@price > 2147483647

つまり、この論理式の場合、左辺値の 「Zeny + '@price」が 2147483647 を超えた時
内部で数値は反転してしまい、値はマイナスになっており、

マイナスの値 > 符号付32ビット整数の最大値

なのでこの式は絶対に真になりません。


Aurigaを修正すればマイナスになる危険も無くなりはしますが、
最新版を使い続けたい方は、いちいち修正するのは億劫だと思いますし
なにより根本的な解決にはなりません。


そんなときは、スクリプトをもう一度良く見て
発想を転換して組み替えてみましょう。

//限界値をオーバーしないかチェック
if(2147483647 - Zeny < '@price) {

あふれさせないでも、意味が通るように左右の値を入れ替えてみました。

私は数学は苦手なほうですので、
思いついたときはすっごく嬉しかったのですが

でも不等式や方程式などの解き方と似てるので
数学好きの人なら苦もなく解決できるのかもしれませんね。。
関連記事

COMMENT

私も同じ箇所で延々と悩んだ記憶があるので、思わずコメントを(笑)

当時は変数の型なんて全く理解していなかったので、
なんで所持金がマイナスに反転したりするのかサッパリ理解できませんでした…。

残念ながら当時の私は諦めてしまいましたが(笑)、
今回の筋道立った説明を拝見し、何か胸につかえてたモノが取れた思いです。
2011/12/21(水) 06:19:55 | URL | muchey #hxuFh8vQ [Edit
>>mucheyさん
>私も同じ箇所で延々と悩んだ記憶があるので
やっぱりそうですかw
マニュアル読まないで突っ走る私は
こういう失敗を体験しないと覚えないのですが
私だけじゃ無かったんだと思うと安心しましたw

>変数の型なんて全く理解していなかったので
スクリプトって細かい事を意識しないで書ける半面、
こういう罠があったりしてハマることが多々ありますよね。
また他にこういうのを思い出したら、記事にしてみます。
2011/12/21(水) 17:51:38 | URL | みのり #- [Edit

Comment Form


秘密にする
 


TRACKBACK

TrackBack List



プロフィール

Author:みのり

すごく面倒臭がりで大雑把です。
なので、すぐ楽をしようとして
ツールを作り始めます。
ツールを作る時間と手作業で費やす時間
はたしてどちらが短いのか……


-構築環境-

Auriga0945 MySQL 5.5
with 2011-12-20bRagexeRE

3CeAM rev525
with 2010-07-30aRagexeRE



カテゴリ

未分類 (9)
RagexeRE (9)
eAthena (1)
Auriga (5)
ツール:eAthena用 (4)
ツール:Auriga用 (6)
ツール:その他 (14)
はじめてのAurigaスクリプト (8)
はじめてのAurigaスクリプト基本編 (21)
はじめてのAurigaスクリプト応用編 (7)
Aurigaスクリプト (3)
本鯖 (7)
Aurigaスクリプト:冒険者アカデミー (6)
ドラクエ10 (2)
新生FF14 (3)
EVE Online (2)



最新記事



最新コメント



月別アーカイブ



検索フォーム



リンク

このブログをリンクに追加する



ブロとも申請フォーム

この人とブロともになる



QRコード

QR



12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Copyright © Rocco di Forte All Rights Reserved.
テンプレート配布者: サリイ  ・・・  素材: HELIUM  ・・・ 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。