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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0309
なるっちint命令で2進数を含む文字列の変換17解決


なるっち

リンク

2009/3/9(Mon) 21:53:36|NO.23778

はじめて書き込ませていただきます、なるっちと申します。

文字列内に含まれる数字を整数型変数に代入するスクリプトを組んでいて、
int命令のちょっと不思議な挙動に気づきました。


tmp= "11" : dialog "文字列 ["+tmp+"]を10進数にすると "+int(tmp)+" です" ;正しい結果 tmp="$11" : dialog "文字列 ["+tmp+"]を10進数にすると "+int(tmp)+" です" ;正しい結果 tmp="%11" : dialog "文字列 ["+tmp+"]を10進数にすると "+int(tmp)+" です" ;なぜか0になる

文字列に2進数や16進数のプレフィックスを含むと16進数の時はうまくいくのですが、
2進数のときはなぜか常に0が返ってきます。

おそらくHSPのバグか仕様だと思いますが、「int 2進数」などで過去ログ検索しても
見当たらなかったので、投稿させていただきました。

このような処理をしたい場合、今のところ手作業で変換するしかありませんでしょうか?



この記事に返信する


なるっち

リンク

2009/3/9(Mon) 22:22:54|NO.23779

ちなみに、自前の変換処理は下記のような感じです。

tmp="%0111" x=1 : y=0 : z=strlen(tmp)-1 repeat y+=int(strmid(tmp,z,1))*x x+=x : z-- : if z<1 : break loop dialog "文字列 ["+tmp+"] を10進数にすると "+y+" です"
int命令ひとつで変換できる16進数と比べると冗長ではありますが、
とりあえず実用的な速度で動いてくれています。



inovia

リンク

2009/3/9(Mon) 22:23:10|NO.23780

昔組んだスクリプトですがどうぞ。


#module //2進数から10進数変換 #defcfunc int2to10 var code sum=0 repeat strlen(code) sum+=int(strmid(code,cnt,1))<<strlen(code)-1*cnt-1 loop return sum #global //文字列変数で2進数を表記してください。 var2="11" mes int2to10(var2)



inovia

リンク

2009/3/9(Mon) 22:23:38|NO.23781

あっ!ダブってしまった(^_^;)



なるっち

リンク

2009/3/9(Mon) 23:45:45|NO.23782

inoviaさん>
ありがとうございます。
僕自身のスクリプトと比べても変数を極力使わないように組まれていて、
綺麗なスクリプトですね!

そして、質問の意図がわかりにくい文章になってしまってごめんなさい。
もしかしたら16進数におけるint命令のような自動変換命令が
2進数にもあるのかな?と思って質問させていただいた次第です。



GENKI

リンク

2009/3/10(Tue) 00:10:51|NO.23784

llmod3モジュールにstrtoint命令があるようです。

APIを使う方法もあります。
http://hspdev-wiki.net/?%BF%F4%C3%CD%BD%F1%BC%B0%CA%D1%B4%B9#lb75bd81



レノス

リンク

2009/3/10(Tue) 01:18:47|NO.23786

OpenHSP見てきましたが、そのようなモノはありませんでした。

ついでに:
$ が戦闘に付く str を int に変換すると16進数扱いになるのは、
int() 関数ではなく int 型自体の仕様のようです。
( 常識だったら申し訳ない )



SYAM

リンク

2009/3/10(Tue) 11:14:49|NO.23788

#メチャ余談になります。すいません。

>inovia さん
計算のとこ、

sum = (sum<<1)+int(strmid(code,cnt,1))
にすると、すこし速くできます。
元が一瞬なので、何十万回も実行して秒単位の差ですが。。



なるっち

リンク

2009/3/10(Tue) 22:55:21|NO.23802

皆様、ご返信ありがとうございます。

GENKIさん>
llmod3の中にもあったのですね! そして、リンク先もすごく勉強になります。
API(というかCランタイムライブラリですね)のstrtoulを使う手もあるとは目から鱗です。
柔軟な発想をご提示くださって本当にありがとうございます。

レノスさん>
OpenHSPでチェックしていただきまして恐縮です。お手数をお掛けしてしまってごめんなさい。
そして、もし僕がうっかり機能を見落としていたらと不安でしたが、存在しないとの事で安心いたしました。
さらにint型自体の変換の仕様として16進数文字列にのみ対応しているとは知りませんでしたので、為になります。
教えてくださって本当にありがとうございます。

SYAMさん>
極まった効率化に感服です。
演算の順序を工夫することによって乗算そのものを無くすことができるとは…感動しました。
現在のPC環境では僅かな速度差とはいえ、やはり無駄のないスクリプトを追求する精神って大切ですよね。
特にこのような美しいスクリプトを拝見すると心打たれるものがあります。
すばらしい効率化の手法を見せてくださって、本当にありがとうございます。

皆様、ありがとうございました。
とても勉強になりました!



faergare

リンク

2009/3/11(Wed) 04:23:17|NO.23809

>無駄のないスクリプトを追求する精神
私の目には追求した形跡が見当たりません。
うまくスレをまとめられたところで申し訳ありません。



faergare

リンク

2009/3/11(Wed) 12:47:01|NO.23816

こうしたらもっと速かった。

sum = (sum<<1) + peek(code,cnt) - '0'



faergare

リンク

2009/3/11(Wed) 14:57:22|NO.23820

なんか一人でキレてる人がいる・・・。



faergare

リンク

2009/3/11(Wed) 15:32:57|NO.23821

勘違い乙です。>SYAMs



check

リンク

2009/3/11(Wed) 19:25:11|NO.23822

これはまた痛いやつの登場か?
一人で切れているのはどちら様でしょうか。



faergare

リンク

2009/3/11(Wed) 20:08:27|NO.23823

これはまたスレとは関係ない話の始まりでしょうか?



なるっち

リンク

2009/3/13(Fri) 17:24:57|NO.23858

faergareさん>
静観しようとも思ったのですが…
「追求」という言葉は、その文字のごとく「追い求める」という意味を持ちます。
テストで「100点を追い求める」のと「100点を達成する」とは違うのです。

各人がベストを追い求めた結果となる青果物は、それが必ずしもベストを達成していなくとも
「その人にとって追求したベターな結果」であることに代わりはないのです。



なるっち

リンク

2009/3/13(Fri) 17:32:24|NO.23859

そして。僕はfaergareさんの追求した結果にも敬意を感じております。

ただ、他人を見下すような切り口でさえなければ、もっと純粋に
faergareさんのスクリプトに「そういう方法もあったのか!」と
感動してくれる人が多かったのではないでしょうか。

せっかく非常に素晴らしいスクリプトを組んでおられるのに、
その人間性のせいで不当に評価されていないように見受けられます。
(事実上スルーされてますよね?)
それはとても悲しいことです。本当に上質なスクリプトなのですから…。



faergare

リンク

2009/3/14(Sat) 03:38:00|NO.23871

>その人間性のせいで不当に評価されていないように見受けられます。
は?あんたにここで人間性がどうたらこうたらと言われる筋合いはないんだけど。
不当に評価されていない?
見下す?
スルーされてるだって?
だから何?
あんたらみたいに
自分の能力を誇示するような回答
スルーされまいと誰かに気に入られるような回答
なんかするつもりないし。

ただあっちよりこうしたら速かったっていうだけの回答を
深読みしすぎるあんたらのほうがどうかしてんじゃないの。

静観してりゃよかったのにね。



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