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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1009
名無し独り言15解決


名無し

リンク

2023/10/9(Mon) 21:44:50|NO.100171

#module
#defcfunc CommaSeparator var p1, local a, local b p1 = str(p1) notesel p1 : b.0 = notesize repeat a.0 = strmid(p1,-1,3) : b.0-=3 : p1=strmid(p1,0,b.0) if b.0<=0 : a.1=a.0+a.1 : break a.1=","+a.0+a.1 loop return a.1 #global a="987654320" mes CommaSeparator(a) a=2000000000 mes CommaSeparator(a)
変数に数値を入れるだけで3桁区切りでカンマが入る。
結局文字列型に変換されるので変数は文字列型でも数値型でも〇。
数値型の場合32bitの最大値を超えないように注意。

所で、これみたいに標準機能をうまく使えば可能な機能を最初からHSPの機能として実装するメリットって何だろう。
実装されたとして、機能(この場合はカンマ区切り)を実行する命令文が書かれていれば
カンマを3桁おきに付け加える処理を行って返してくるわけで、
HSP言語で処理するかC言語で処理するかの違いやそのやり方に違いはあれど、結局やってる事は同じな気がする。
(認識違ってるのか?)
ならメリットと言うと自分のソースコードに↑の#module〜#globalまでのコードがあるか無いかの違い位で、
他のメリットがいまいち思い浮かばない。

あればあったで使う時はあるにしても、無ければ無かったで別に困らない。そんな感じ。
「ウィンドウの中央に文字を表示したい!」→今ある標準機能で出来るやん、みたいな。
態々標準実装する必要があるのかと言われると微妙なような

だったらその機能実装する時間で不具合の修正みたいなユーザー側ではどうにもならないような所とか、
dllを使わないと出来ない機能を追加するとか、そっちの方にリソース割いてほしいと思う。
ただでさえ貴重で限りある時間が今の時期は特にコンテスト運営とかで更に使える時間が短くなってるだろうし。
(ただの推測だけども)

※要望出すのが良く無いとか、実装しないでと言ってる訳では無いので悪しからず。



この記事に返信する


窓月らら

リンク

2023/10/9(Mon) 23:53:45|NO.100174

簡単に言うと、標準で対応してくれていれば楽なのと、
HSPコードでやるよりは処理効率がいいだろうというくらいです。

例えば標準のスプライト機能とかもそうです、配列に情報入れておくやつ。
個人的にはほとんど使わず、gcopy gzoom 等だけでできると思うわけですが
あれば初心者等が便利に使えます。
(ランタイムがその分大きくなっちゃいますけど…)



zrs90(5さい)

リンク

2023/10/10(Tue) 01:30:47|NO.100175

>HSP言語で処理するかC言語で
>処理するかの違いやそのやり方
>に違いはあれど、結局やってる
>事は同じな気がする


私が貼ったリンク先のコードは
「hsp3dish」には使えませんが

名無しさん の提示されたコードは
標準命令で構成されているので
「hsp3dish」で使う事が出来ると思います
(※モジュール化までされていて驚いてますが...)



大富豪

リンク

2023/10/10(Tue) 02:55:44|NO.100176

(三桁区切り表示)
今回の場合は主に経理や商業事務の用途です。

例えば同時に三桁表示したい変数が数百個になる場合も・・・
その度に文字列分割処理が;

もし簡単なコマンドで処理できれば、仮に内部処理は同じでも
プログラムの記述量が大幅に減りますので便利だと思います。
(おっしゃる通り記述作業の量的問題くらいかもしれません)

私の感想ですと画像/映像などのビジュアル要素での用途が多いと思いますが、
商業用途や実務的な事でHSP利用の裾野が広がればと思っています。
(数値管理+ビジュアル要素などエクセルではやりにくい事がHSPで出来るとか)



usagi

リンク

2023/10/10(Tue) 15:36:30|NO.100183

こんにちわ、ここが3桁区切りコンテスト開催場所ですね。

私は結構、業務用途でHSPに長年お世話になってますよ。
簡単にウインドウが作れてdllやcomも使えるので、
Windowsで大よその事が出来てしまうので離れられません。
(Dishとかマルチプラットフォームになると難しいですが)

この手の物は正規表現で対応する事が多い様な気がします。
一例としてどうぞ。(Win10で動作確認)


;見た目だけシンプル3桁区切り(整数のみ) #include "mod_regexp.as" #define ctype comma(%1) replace(str(int(%1)),"\\B(?=(\\d{3})+(?!\\d))",",") a=10000000000 mes comma(a)



猪野

リンク

2023/10/10(Tue) 23:08:33|NO.100188

興味深かったので便乗してみます。
実数に対応した3桁区切りです。

#ifndef formatNumber #module /* 3桁ごとにカンマで区切る */ #defcfunc local _formatNumber count = len / 3 - ( len \ 3 == 0 ) offset = len + count poke integer, offset, 0 offset -= 3 repeat count, 1 memcpy integer, integer, 3, offset, len - 3 * cnt poke integer, offset - 1, ',' offset -= 4 loop return integer /* 整数用 */ #defcfunc formatNumber int _value if _value < 0 { integer = str( -_value ); 正の値にする len = strlen( integer ) return "-" + _formatNumber() } else { integer = str( _value ) len = strlen( integer ) return _formatNumber() } /* 実数用 */ #defcfunc formatNumberF double _value, int _min decimal = "" integer = strf( "%." + _min + "f", absf( _value ) ); 四捨五入する len = instr( integer, 0, "." ) if len == -1 { len = strlen( integer ) } else { memcpy decimal, integer, _min + 2, 0, len; 少数部(ドットからNULLまでコピーする) poke integer, len, 0; 整数部(ドットをNULLにする) } if _value < 0.0 && double( decimal ) != 0.0 { return "-" + _formatNumber() + decimal } else { return _formatNumber() + decimal; 四捨五入して0になる場合も符号なし } #global #endif #addition "mod_formatnumber.as"; 以上のモジュールを別ファイルに保存した場合 *sample i = 1234567890 j = 123456789.012345 mes formatNumber( i ); 整数(正) mes formatNumber( -i ); 〃(負) mes formatNumberF( j, 3 ); 実数(正) mes formatNumberF( -j, 5 ); 〃(負) mes formatNumberF( -0.1, 0 ); 0
>大富豪さん
>例えば同時に三桁表示したい変数が数百個になる場合も・・・
具体的にどの程度まで高速化したいという目標はあるのでしょうか?

ちなみに、こちらの環境でformatNumber( i )を10万回繰り返したところ、大体400msで完了しました。
仮に1000回繰り返すとなると4msくらいで済む計算ですね。
formatNumberF( -j, 5 )でも同様に繰り返してみましたが、大体1000msで完了しました。
1000回なら10msです。



名無し

リンク

2023/10/11(Wed) 00:59:35|NO.100189

一日放置しただけで思ったよりも多く反応あって驚き。
そもそも誰も何も反応せず文字通り独り言を言っただけになる予定だったのだけど。

>>プログラムの記述量が大幅に減りますので便利だと思います。
との事だけど、標準命令になって減るのは#moduleとか#includeとかの部分だけで、
自分のコードだと10行、no.100183のコードは2行、no.100188のコードは50行程度のみ。
変換したい数値が何百何千あっても違いは数十行程度の差ではある。
たかが数十行、されど数十行。小さな改良がどんどん良くして行くのは確かだし分かるのだけど。

独り言のつもりでスレ立てしたものの、同じ題材でいろんな手法が見れて良いですね。
割と分かりやすい部類の題材だったのが良かったのだろうか。
ま、中を見るまでは「独り言」という情報しか得られないから、
単純に独り言のスレが珍しく出来てて、更に珍しくコメントもついてる。見てみよ
・・・って感じなだけな気がする。



usagi

リンク

2023/10/11(Wed) 05:24:02|NO.100190

私は丁度いい感じの面白い題材かと思いましたね〜。

名無しさんのは、とても分かりやすく書いてあり、こうやって自分が必要なものを
モジュール化して関数作って効率化していくのかぁ。。と書き写して勉強になるし。
狩野さんのは、もう全部出来てるよ、使わせてもらいます!的な感じですし、
引数の書き方とかメモリ操作とか効率的でカッコいい真似してみようなどなど。

って、これβテストの流れだったんですね。失礼しました。
strfはCとほぼ同じだし、新規命令が増えるのも人によっては困るかもしれないし。。。
エクセルの表示書式みたいってことを考えると、
ただカンマ区切りするだけでなくPythonのformat的なものがあればいいのかなぁ?
(formatってのもよく変数名で使うので予約語となると微妙ですが。。。)

どんな言語にも追加議論はあるので必要な事かと思いますから、
多くの人が納得する形になると良いですね。



猪野/いの

リンク

2023/10/11(Wed) 12:44:34|NO.100191

勝手に実行速度の話だと思い込んでいましたが、プログラムの記述量の話でしたね。
勘違いしてしまってすみません。

確かに標準で実装されればそれが一番手っ取り早いですし、あれば便利であることも確かなので、要望を出してみること自体はいいことだと思います。
ただ、今回試しに書いてみた限りではそこまで複雑な処理でもなかったので、優先順位としてはやや低いように感じました。
HSPは学習用の需要も根強いですから、それこそ一つの課題として取り上げるのも面白そうですしね。

単に記述量を減らしたいだけなら、モジュール化してcommonフォルダに保存しておき、userdef.asからインクルードさせるという手もありますよ。
実行ファイルがモジュール分膨らんでしまうことは避けられませんが……。

>usagiさん
参考になったなら良かったです。
実数を文字列に変換するなら有効桁数も指定できた方がいいかな、と思ってああいう感じになりました。
単純に切り捨てるならstr関数で変換して0で埋めるだけなので、例として符号が消える可能性のある四捨五入を選びましたが、そこは用途に合わせて改変してもらえればなと。

よく考えたらformatNumberFの

poke integer, len, 0; 整数部(ドットをNULLにする)
の行は余計だったので、使用する際は削除しておいてください。

あと、紛らわしくて申し訳ないのですが猪野(いの)です……。
実は自分でもたまに見間違えるので振り仮名を振ろうか悩んでいました。
いい機会なので振ることにします。



名無し

リンク

2023/10/11(Wed) 23:51:17|NO.100202

流れ自体はβテストからではあるのですが、
色々と考えて意図してスレッドを立てた上で独立させ、このスレッドのみで成立するようにしたので、
特に気にする事は無いです。

モジュール化は複数回同じ処理をしたい場合に結構使ってます。
後から修正とか効率化とか、機能改善したい時に、モジュールの一か所のみ変更すれば
使用箇所全てに適用できるので便利ですし、
モジュールをまとめたコードを別の.hspファイルとして保存し、それを#includeで読み込むなら、
見た目もすっきりして良いです。

参考になるというのは本当にそう思って、元の目的とは違った方向で良い効果があって良かったと感じてます。
1つの何か簡単目な題材に対して色んな方が色んな提案したり話したりできる
会議と言うか、勉強会みたいなのがあれば普段使わない命令や手法等知れたりして面白そうだなと思いました。

折角なので、3桁区切りで無くなるけど日本人には4桁区切りの方が良い人も多いと思うので
3桁か4桁か選べるようにしてみた。
p1に数値を入れた変数、p2は3なら3桁、4なら4桁区切り。指定しなければ3桁。
#module
#defcfunc CommaSeparator var p1, int p2, local a, local b b.1 = p2 : b.1 = limit(b.1,3,4) p1 = str(p1) notesel p1 : b.0 = notesize repeat a.0 = strmid(p1,-1,b.1) : b.0-=b.1 : p1=strmid(p1,0,b.0) if b.0<=0 : a.1=a.0+a.1 : break a.1=","+a.0+a.1 loop return a.1 #global a="987654320" mes CommaSeparator(a) a=2000000000 mes CommaSeparator(a,4)



大富豪

リンク

2023/10/14(Sat) 09:52:15|NO.100224

色々おさわがせしております。

#module/#globalや%1などのC言語表記(?)のような
使い慣れていない構文を見たとたんに、
私もそうですが初心者は急に敬遠がちになると思います(たぶん)。

コピペだけで解決する事もあると思いますが、
コマンドの仕組みを理解して使わないと、
後で応用や修正が出来なくなる事を想定すると、
利用をためらってしまう事もあります。

なにか良い勉強資料があればいいのですが…、
残念ながら自己責任という事で解釈しております。

色々ご提示くださった皆様へ、
ご対応ありがとうございました。



usagi

リンク

2023/10/14(Sat) 19:08:31|NO.100229

>猪野/いの さん
お名前、大変失礼いたしました。

userdef.as便利ですよね。私も自分が良く使うものはよく登録してます。
(真偽値系とか、Line太くしたり、デバックの情報だったり)
都度インクルード書かなくて済むので楽だと思うのですが、どれくらいの人が使ってるんですかね?
効率かなり上がりますよね。


>大富豪さん
なんか理解できた気がします。
私も最初の頃、文字の変換など10行くらいのコードを
100か所くらい使う所にコピペしまくって管理が大変だった記憶が。。。うっ
記述量が半端なかったですね。。。

3桁区切りのお話とは離れてしまいますが、
#moduleは同じ処理をまとめられるので、少し規模が大きくなってきたら
良い機会ですから、使ってみるのが良いと思いました。
ヘルプから見れるプログラミングマニュアル4.1以降が小規模なので分かりやすいです。

”プログラムの記述量が大幅に減りますので便利だと”

これが正にモジュールなので、初心者から中上級者へのステップの部分に
丁度大富豪さんのプログラム記述量が差し掛かってるのかと思われ、
困っているのかと感じ取りました。

便利な道具なので怖くないですよ。


他の言語もそうですが、ライブラリ等で様々な関数が提供されてます。
(HSPではモジュールと呼びますが)
hspもcommonの中に80個近く提供されてますから最初は把握が大変ですよねぇ。
昔はwikiとかあったんですが今は無いのかな?



名無し

リンク

2023/10/15(Sun) 01:20:38|NO.100233

特にお騒がせとかは気にしなくて大丈夫ですよ。少なくとも自分は一切気にしてません。

普段使わない、見たことないような命令を見たとき、最初はそうなる事もあるのは普通だと思います。
>>コマンドの仕組みを理解して使わないと、
コピペで済ます事もでき、後で困ったら誰かに聞くとかその時考えよう
とすることもできると思いますが、しっかり理解しようとする姿勢は個人的に凄く好感持てます。

自分もそうなのですが、便利なDLLと見つけてサンプル見てみたら意外と複雑で難しく、
これは触るのやめよ、となる事も多々あったりするので分かります。が、
先のステップへ進みたいならそこで引き返さずに理解できるよう努めるべきなのだろうなとも思います。
難しくて理解できないから簡単に使えるよう要望を出せば通るかもしれない。
でも分からないことがあったら毎回そうするのは非現実的ですし、ただ楽をしているだけ。
ただ自分の実現したい内容を行えれば良いのであればそれでもいいのですが。
(そんな人ならそれこそ出されたサンプルを気にせずそのまま使うでしょうけど)

でです。
>>なにか良い勉強資料があればいいのですが
という事なので、恐らく理解したい意思はあるけど
分かりやすい解説サイトとかが見つからなくて学ぼうにも学べず困ってしまった・・・のかな?

HSP3は手軽に扱えるけど、マイナーな言語なのもあって関連サイトもあんまり多くなく、
比較的基本的な部分を解説しているサイトはあっても、難しくなってくると数が減ってくる印象。
現状は各個人のブログやサイトで各々思う内容を掲載しているような状況で、
情報がまとまったサイトというのは本当に少なく、このサイト見れば大体分かる!というのはあまり。
分かってる人に聞くのが一番。という意味ではここで質問するのが良いのかなとも思います。

HSPのwikiと言うと
https://wiki.hsp.moe/index2.html
これが思いつきますがこれかな?



zrs90(5さい)

リンク

2023/10/15(Sun) 03:06:07|NO.100234

wiki ? (元祖)HSP開発wiki の事でしょうか?
...(元祖)と付けているのは、最近別の方が
「同一の名前」で投稿用サイト?を作られたみたいなので...
それとも HSPWiki の方でしょうか?

(元祖)HSP開発wikiの方は、名無し さんがリンク先を
貼っておられますので、私はこちらを


⚫︎HSPWiki

https://quasiquote.org/hspwiki.cgi/



mack

リンク

2023/10/15(Sun) 06:51:40|NO.100235

こんにちは

scanf 的な処理であれば、ユーザフレンドリに尽きるかと。
RPAも一般化したことですので、ちょっとしたフィルターを作りたい
とかで、一般事務や学校の先生(STEM利用)にとても助かる機能だと思います。

フランス書式( , ではなく . なのですが)に対応されていると尚良いですね。



猪野/いの

リンク

2023/10/16(Mon) 15:31:54|NO.100264

>userdef.as
人によってかなり違いそうですよね。
私は内輪向けのツールを作っているのですが、Win32 APIを頻繁に呼び出すのでUMAGODiさんのconstant.asは外せません。
文字列操作が主となるため、joinやsliceなど他の言語で見掛けて便利そうに感じた機能を再現しては書き込んでもいます。
あとはカラーコードでしょうか。LEMON_YELLOWで$FFF450など、色名で定義してあります。

>勉強資料
基礎を身につけるなら公式の解説書がオススメですが、ステップアップという意味では他の人のスクリプトを見せてもらうのが一番上達すると思います。
ただ動かしてみるだけではなく、知らない命令はヘルプで確認する、logmesを挟んで変数の状態を追ってみる、他の書き方ができそうな箇所は差し替えてみる、一見不要そうな処理はコメントアウトしてどういう不具合が起きるのか試してみる、など。
何故これで期待通りの動作になるのだろう? という疑問が解消されるごとに出来ることが増えていきます。
参考にするという観点で言えば、小さな処理の集まりであるモジュールの方が解読しやすいことも多いですよ。
私が言うのもなんですが、処理をモジュール化しているということは初心者を脱しているという証明でもあるので、そこから学べることは多いはずです。

>フランス書式
軽く調べてみましたが、カンマとピリオドが逆転しているもの、更にスペースやアポストロフィで区切るものなど、いくつも組み合わせがあるようですね。
これは個別に対応するより使用時に指定してもらうのが無難でしょうか。
都度変更するものでもないと思うので設定用の命令を追加してみました。

#ifndef Mod_Format_Number #module Mod_Format_Number /* 書式を設定する */ #deffunc local _setFormat int _digit, int _separator, int _point digit = _digit separator = _separator point = _point return #define global setFormat( %1=3, %2=',', %3='.' ) _setFormat@Mod_Format_Number %1,%2,%3 /* 指定された桁数ごとに区切り記号を打つ */ #defcfunc local _formatNumber count = len / digit - ( len \ digit == 0 ) offset = len + count poke integer, offset, 0 offset -= digit repeat count, 1 memcpy integer, integer, digit, offset, len - digit * cnt poke integer, offset - 1, separator offset -= digit + 1 loop return integer /* 整数用 */ #defcfunc formatNumber int _value if _value < 0 { integer = str( -_value ); 正の値にする len = strlen( integer ) return "-" + _formatNumber() } else { integer = str( _value ) len = strlen( integer ) return _formatNumber() } /* 実数用 */ #defcfunc formatNumberF double _value, int _min decimal = "" integer = strf( "%." + _min + "f", absf( _value ) ); 四捨五入する len = instr( integer, 0, "." ) if len == -1 { len = strlen( integer ) } else { poke decimal, 0, point; 小数点を打つ memcpy decimal, integer, _min + 1, 1, len + 1; 少数部(ピリオドの直後からNULまでコピーする) } if _value < 0.0 && double( integer ) != 0.0 { return "-" + _formatNumber() + decimal } else { return _formatNumber() + decimal; 四捨五入して0になる場合も符号なし } #global setFormat; 初期設定は3桁/カンマ区切り/ピリオド小数点 #endif #addition "mod_format_number.as"; 以上のモジュールを別ファイルに保存する場合 *sample i = 123456789.876543 mes formatNumberF( i, 6 ) mes formatNumberF( -0.1, 0 ) mes formatNumberF( -0.9, 0 ) pos 0, ginfo_cy + ginfo_mesy setFormat 4; 4桁/カンマ区切り/ピリオド小数点 mes formatNumberF( -i, 7 ) pos 0, ginfo_cy + ginfo_mesy setFormat 3, '.', ','; 3桁/ピリオド区切り/カンマ小数点 mes formatNumberF( i, 5 ) pos 0, ginfo_cy + ginfo_mesy setFormat 3, ' '; 3桁/スペース区切り/ピリオド小数点 mes formatNumberF( i, 3 ) pos 0, ginfo_cy + ginfo_mesy setFormat 3, '\''; 3桁/アポストロフィ区切り/ピリオド小数点 mes formatNumberF( i, 1 )

>NO.100188
formatNumberFで小数点以下が0の場合に必ず正の値で出力されるようになっていたのも修正しました。

加えて、コピペミスがあったため何度か投稿し直しました。
修正前の書き込みを見てくださった方、混乱させてしまい申し訳ありません。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100171への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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