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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0926
きしみ1つの変数に複数の情報を入れる19解決


きしみ

リンク

2017/9/26(Tue) 21:10:09|NO.81470

例えば120と50という数値を一つの変数に纏める方法が分かりません
二つ以上数値を格納するために変数を配列化するのももったいない感じがします。

自分には文字列化して結合させるという方法しか浮かばず、
これも元に戻す際が面倒になりそうでスマートではないと思ってます。

2進数やビットシフトなどの方式もあるそうですが複雑で理解できませんでした。
おとなしく配列変数を作っちゃった方がいいのでしょうか



この記事に返信する


kanahiron

リンク

2017/9/26(Tue) 21:38:02|NO.81472

結論は「配列を作ってしまったほうが良い」です。
下に長ったらしく書いたのは読まなくても問題ないです。

一つの変数で保持できる数は±21億くらいあるのでたった数百という数しか入れないのは勿体無いということですよね。
HSPでは整数型の大きさは4Byte、文字列型は最小で64Byteです。
「文字列化して結合させる」という方法では二つの数で整数型2つ、8Byteで済むところに64Byteを確保しているのでひっっじょうに無駄ですね(´・ω・`)

さて整数型は4Byteと書きましたが、1Byteは8Bitなので32Bitです。
32Bitの整数型で2つの値を保持しようとすると、1つあたり16Bit、4つの値では8Bitです。
HSPの負の数の表現方法は2の補数表現ですが、この方法だと扱える値の最大/最小は「+2^(bit数-1)-1〜^2(bit数-1)」です。
つまり16Bitでは+32767〜-32768、4Bitで7〜-8しか表現できません。

実際は整数型を二つに分けて扱うというのは良く行われています。
例えばマウスカーソルの位置で、数万なんて値は扱わないので横位置と縦位置の1つの整数型にまとめて扱うことがあります。(ウィンドウメッセージなどを扱うようになると出てきます)


値1 = 3939 値2 = 707 変数 = 0 変数 = (値2<<16) | 値1 // 「|」はパイプという記号で論理演算子のorを意味します // 「<<」は左ビットシフトで右側の数字はずらす(シフトする)数(ビット数)です mes 変数 & 0xFFFF //値1を取り出す mes (変数>>16) & 0xFFFF //値1を取り出す
このような感じです。
プログラミングでは論理演算(ビット列同士の計算)をよく使うので、勉強してみて下さい。

あ、でちなみにこのような方法があるのに最初に配列変数を作ったほうが良いと言ったのはちゃんと意味があります。
・ 遅い
・ 面倒
HSPは演算が非常に遅いので、メモリのたった4Byteを節約するのにビットシフトや論理和をするのはCPU時間のほうが勿体無いです。
また、式などに使う場合は大変読みづらく、面倒なスクリプトになってしまいます。
変数名に意味を持たせるのも難しくなりますしね。

長文失礼しました。



通りすがり

リンク

2017/9/26(Tue) 21:43:06|NO.81473

両方の数値が3桁なら120050 後は 割り算+整数と引き算でいけるはず
a=int(120050/1000)
b=120050-(int(120050/1000)*1000)
これなら簡単では?



通りすがり

リンク

2017/9/26(Tue) 21:58:32|NO.81474

bの方 計算コストのこと忘れてたよ
b=120050-a
だけで良かったよ



きしみ

リンク

2017/9/26(Tue) 22:08:21|NO.81475

>>kanahironさん

ご回答ありがとうございます。

しかし配列で済ますのはなんかなあって感じです。
そもそもゴリ押しで色々と書いてきたので理想を何とか現実にさせたいものです。
サイズや演算速度は多分気にするレベルのものを作らないと思うので大丈夫だと思います。
ちなみにサンプルの論理演算を拝見しましたが、何桁でも大丈夫なんですね。
(ぶっちゃけ論理演算は処理が想像ができないのですらすら書けない…)
何はともあれ勉強になりました。



きしみ

リンク

2017/9/26(Tue) 22:13:01|NO.81476

>>通りすがりさん

ご回答ありがとうございます。

どちらかというと理想に近いですね。
ただ今後個数は増やしたりしてしまうのでそうしてしまうと限界がありますね。
今のところは問題ないので参考にさせていただきます。

論理演算を理解できるようになりたいなあ……。



kanahiron

リンク

2017/9/26(Tue) 22:39:11|NO.81477

私の例では2つに分けていますので32767〜-32767の値を入れられます。
ちなみに「サイズや演算速度は多分気にするレベルのものではない」ということですが、メモリの節約が主目的では無いのでしょうか?
勝手にそう解釈していました。
単純に、変数の数を減らす(意味はない)なら次のような方法もあります。

// 11, 22, 33, 44, 55, 66, 77, 88, 99 , -11, -99の11個の値を1つの変数に入れる sdim 変数, 4 * 11 lpoke 変数, 0, 11 lpoke 変数, 4, 22 lpoke 変数, 8, 33 lpoke 変数, 12, 44 lpoke 変数, 16, 55 lpoke 変数, 20, 66 lpoke 変数, 24, 77 lpoke 変数, 28, 88 lpoke 変数, 32, 99 lpoke 変数, 36, -11 lpoke 変数, 40, -99 mes lpeek(変数, 2*4) //3番目の要素を取り出す mes lpeek(変数, 10*4) //11番目の要素を取り出す
繰り返しますが、この方法に意味はありません。配列変数と全く同じことをしています。
変数の数を減らしたい理由はなんでしょうか。



ソラ

リンク

2017/9/26(Tue) 23:11:29|NO.81478

(やり方は他の人が書いているので「やる意味」について書きます。)
重要なのは可読性と可用性です。
配列を使わない理由は恐らくメモリ消費量が理由だと思いますが、
今時メモリなんて最低でも4GBはあります。
同じソフト内の他の処理で大量にメモリを使うためできるだけ節約したいならともかく、
通常は配列を使ったほうがバグが発生しにくく可用性が高くなります。

他の方が書いている方法は自分では思いつけないような方法で凄いと思いますが、
可読性で言えばお世辞にも良いとは言えません。
(もちろん私自身は皆さんより可読性の高い書き方は思いつきません。飽くまで率直な感想です)



Y_repeat

リンク

2017/9/26(Tue) 23:26:46|NO.81479

自分の書いてる中間言語では変数を名前とナンバーで管理してるのですが 
1つに纏めたいってのはありますね
文字列配列に纏めたら 変数管理なんで遅いのはいかがなものかと
他では 名前と実数を文字列配列化とかだと実数の文字列化長いっすね
マジで構造体あったらいいなーだなんて 
思いながら変数の名前とナンバーで二つで1つと思い込んでやってます
でもdeffunc命令の引数にする時とか 即値だけ(一つ)変数とナンバー(二つ)とか
ごちゃごちゃしてきますw



きしみ

リンク

2017/9/26(Tue) 23:34:40|NO.81480

他の方にやんや言われてもう配列にします……



Ve

リンク

2017/9/27(Wed) 09:13:56|NO.81481

>きしみさん
配列は便利ですし、活かして下さい。
配列込みで、設計できれば質問自体なくなります。



きしみ

リンク

2017/9/27(Wed) 16:16:02|NO.81482

ちなみに目的は単なる好奇心ですよ、実用性とかそういうためではなく違う方法を試したかっただけです。



Y_repeat

リンク

2017/9/27(Wed) 18:06:43|NO.81483

と言うわけで
HSPの配列も違う型一緒に使えないかなーって

dim hoge,16,4
とかしてkanahironさん方式で
64文字以下の文字列と数値と実数 配列に入れれそうですね
大分、富豪的にメモリ使ってますが
sdimでないのは論理的に違和感があってですね
気が向いたら書いてみようかしら
この方法は全般的に違和感があり
やっぱり変数何個か分けて管理したほうが
しっくりくるかもですが



ソラ

リンク

2017/9/27(Wed) 18:08:46|NO.81484

「二つ以上数値を格納するために変数を配列化するのももったいない」
「他の方にやんや言われてもう配列にします」
と言っていますよね。
これを見ると実用性とかを重視した質問にしか聞こえないのですが・・・
最初から「単なる好奇心」書いておけば皆さんの回答もまた違ったのでは。



Y_repeat

リンク

2017/9/28(Thu) 05:51:54|NO.81488

文字列型が64文字までならint配列でもいいんでしょうけど
自分たまに変数名64文字越えそうになるから
最大256文字までにしたいのですが
さすがにそれだとメモリもったいない

配列で管理は諦めて
関数で管理できないかなー
モジュール変数はメモ見ながらじゃなきゃ使えないのでめんどくさいです
せめて関数で型の異なる複数の変数を配列的に管理出来ないものかと



KA

リンク

2017/9/28(Thu) 06:09:51|NO.81489

>>皆さんの回答もまた違ったのでは

質問はどう読んでも
「配列は知っているが、それを使わない方法を知りたい」
なのに
「配列の方が便利だから使え」
という回答がくれば、へこんじゃうでしょう。

さて質問自体は数値の場合でしたが、数値と文字列を1つの
変数で扱いたい場合(1つのファイルとして保存したい等)
は興味深い質問内容で、実際にそうした場合もあるでしょう。



KA

リンク

2017/9/28(Thu) 06:23:39|NO.81490

書き忘れたので追加

上の方で出ているsdimを使う方法なら、フォーマットをきちんと
決めていれば、数値だろうと文字列だろうとバイナリレベルで自在に
混在させられます。



 

リンク

2017/9/28(Thu) 13:44:29|NO.81492

>>NO.81489
NO.81470を見る限り
「おとなしく配列変数を作っちゃった方がいいのでしょうか」
が質問であり決して
「配列は知っているが、それを使わない方法を知りたい」
ではないかと思います。上記質問である以上「配列変数を使ったほうがいい」
という回答が来ても可笑しくないです。さらにこの質問文に
「二つ以上数値を格納するために変数を配列化するのももったいない感じがします。」

「これも元に戻す際が面倒になりそうでスマートではないと思ってます。」
と記載されている以上効率・実用性を十分に考慮した意見を聞きたいのだと思うのも理解できます。

質問にあった回答をしたにもかかわらずへこむなんて問題外ですし、
質問者がどうするかはともかく「他の方にやんや言われて」と言う
如何にも回答した方が悪いといわんばかりの言葉で返答するのは可笑しいでしょう。



きしみ

リンク

2017/9/28(Thu) 18:56:32|NO.81496

ふとした興味が深く質問文を推敲しなかったり
苛立ったりした自分の落ち度がここまで引き起こしてしまうとは、自業自得ですね。
(NO.81480を書き込んだ当時はなんでこうなるんだろうと内心思っていました、
可笑しいと思われるのも当然でしょうね)

意図しない返信が来ただけで一時でも周囲の責任にしたことは事実ですし申し訳ないと思ってます。
ただ既に解決済みになってる以上、もうこの件は終わりにしてください……



Y_repeat

リンク

2017/9/28(Thu) 19:31:53|NO.81499

スレ主さんが締めようとしてるところ誠にすいません
あさっての方向向いてた自分の書き込みですが

・プログラ広場
http://prograpark.ninja-web.net/index.html
→ソフト・モジュールのたまり場 に
→“配列型” 拡張プラグイン 「vector」
としてありました
利用スクリプト書いた時に
同梱出来る著作権なのかREADMEを読んでもイマイチはっきりしなくて
同梱していいか当サイトの掲示板に質問しようと思っていますが
最近の書き込みがなくて
連絡つかなかった場合 質問させてください

という訳で この先 書き込みたいなら 新しくスレッドを立てますという
連絡でした



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