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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0903
りさプログラミング52解決


りさ

リンク

2006/9/3(Sun) 22:05:03|NO.2248

こんにちわ♪
この前、C言語の勉強してたら、こんなの見つけました。

// x と y を入れ替えるだけです // 一時変数を使います x=128 y=512 a=x x=y y=a
って書くところを、

// x と y を入れ替えるだけです // 一時変数を使いません x=128 y=512 x-=y y+=x x=y-x
とすれば、余分な変数を使わずに入れ替えられるよ、ということでした。

勿論、HSPでもできます。
これを百万回くらい繰り返してみたところ、後者の方が少し低速でした。
ので、あんまり意味ないです(笑

これって常識なのかも知れません・・・
でもあたし的には新鮮だったです☆
他にも、なにか面白いスクリプトがあったら、ぜひ教えてもらえませんか?( ̄▽ ̄¥

% 内容はwikiっぽいですけど、そこまでのモノじゃないので(^^;
% それに使い方分からないし(´д`



この記事に返信する


りさ

リンク

2006/9/3(Sun) 22:13:49|NO.2249

あと、HSP3.0って文字列の加算に時間が掛かるじゃないですか?

だから文字列へ型変換をするときは、

x=""+x
より

x=str(x)
のが高速でした。

そこまではいいんですが、あたしの環境では、
整数値へ型変換するときは、

x=int(x)
より

x=0+x
の方が高速になります。面白いですね☆

# Windows9X 4.90 256MB
# WindowsNT 5.10 224MB
# の両方で試しました



osakana

リンク

2006/9/4(Mon) 01:43:16|NO.2251

>これって常識なのかも知れません・・・
有名な方法みたいですね。
昔私もある日ふと思いついて一人で「スゲー自分もしかして天才」と、喜んでいたんですが、
しばらくして同じ物をネット上で見つけてガッカリしたことがあります。

x=128 y=512 x^=y y^=x x^=y
このようなさらに高度なやり方も載っていて、それを始めて見た時「ビットかぁ!」と感動しました。



りさ

リンク

2006/9/4(Mon) 10:16:50|NO.2257

osakanaさん、お返事ありがとぉございます☆
これってビット演算でこんなにシンプルにできるんですね(^w^ヾ

>昔私もある日ふと思いついて
これを自分で思いついただけでもスゴイかも・・・(笑

10,000,000回実行してみた結果を書いておきます。
(値は10,000,000で割ってありますので、1回の平均実行速度です)
変数3つ使用: 0.001016ms
変数2つだけ: 0.001082ms (ビット演算で)

#

それから、少し前に、repeat-loop と *label-goto を比べてましたよね。
でも比べ方がアンフェアな気がするんです。
repeat-loop はループ回数決められますしね☆

んで、こうやってみました。

// sample.1 [repeat-loop] x=0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat x++ if x=10000000 :break loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) mes time2-time1 stop
repeat 10000000 じゃないところがポイントです♪

// sample.2 [*-goto] x=0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) *label x++ if x=10000000 :goto *fin goto *label *fin time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) mes time2-time1 stop

この結果を見ると、
あたしの環境では、全く同じ(っていうのも変なんですが)でした。

どっちが?・・っていうのは、単純な無限ループ時のみ比べる価値があると思います☆
深いとこは、頭悪いんでよく分からないです〜(@ ̄□ ̄@

あと、プログラム制御マクロは、マクロなだけに低速でした。
なんで命令にならないんでしょうね??



ルーイヨッシー

リンク

2006/9/4(Mon) 13:01:39|NO.2261

ん、まぁ自分が思うにHSPはCみたいに最初に変数を宣言しなくても
よいのであまり気にしなくてもいいと思います。
実際、自分はいちいち自分で処理の方法を考えていて、
マクロになっているのに自分で関数を作っちゃったことが何回も・・・(^^;



りさ

リンク

2006/9/4(Mon) 14:29:40|NO.2262

>Cみたいに最初に変数を宣言しなくても

確かにそうなんですよね(^^
でも、あたしは宣言したい派です(笑

いきなり変数を使うってことが、なんか気持ち悪いんです(><;
昔、dim を使った宣言の話がありましたが、少し感動しちゃいました。

すごい無駄ですよ。他の人が読んだら。
for マクロの前に、カウンタ変数を初期化したり・・
スクリプトの最初に、変数全てを初期化してたり・・(^^¥

こだわりってありますよね??
あたしだけじゃないですよね?



osakana

リンク

2006/9/4(Mon) 19:44:18|NO.2267

>スクリプトの最初に、変数全てを初期化してたり・・(^^¥
わたしは結構面倒くさがりやなのでいきなり変数を使ってしまいます。
でも少し大き目のプログラムを書く時は、やはり簡単な変数の使用目的のコメントと一緒に上の方で宣言しています。
作ってる内に分からなくなって来るので・・・。

あと最近思いついたのが、

*main if 条件1 :処理1 :goto *aaa if 条件2 :処理2 :goto *aaa if 条件3 :処理3 :goto *aaa *aaa wait 1 goto *main
途中でラベルがあって気持ち悪いので

*main repeat 1 if 条件1 :処理1 :break if 条件2 :処理2 :break if 条件3 :処理3 :break loop wait 1 goto *main
で同じように出来る。
素直にswitchを使えばいいんですけど
何となくマクロは使いたくなんですよね。



りさ

リンク

2006/9/4(Mon) 23:47:13|NO.2270

>何となくマクロは使いたくなんですよね
間違いないですね♪
あたしもマクロは出来るだけ使わないようにしてます。

ただ個人的に switch 自体が好きなので、
(しかもfor,whileはrepeatで代用できますが、switchは出来ないですし)
switchマクロだけは利用しています。
理由があるのかは謎ですが、switchを命令として欲しいです☆

>(略)・・・で同じように出来る。
なるほどぉ。
処理量や分岐量によっては、

*main if 条件A :処理1 :else { if 条件B :処理2 :else { if 条件C :処理3 } } wait 1 goto *main
ってのもアリかもしれませんね(^^

ただ、分岐の割合とかが問題で、処理速度を比較するのは難しそうです・・・
osakanaさんの方が見た目がステキですけどね(笑

#

よく、

if x :y++
なんてスクリプト書きますが、書いてる時に
「あたしってスゴくない?」みたいな気持ちになれます(^Щ^/

でもHSPはビット比較らしく、

// x!=0 か Enter|Space stick ky if x&(ky&0b110000) :y++
みたいなことが出来ないのが残念です。

あと、左から順に評価してくれないので、

x&&(y=1)


if (++x)>y :処理
のような書き方ができないのも、つまらない気がします。

すいません、ワガママです(笑



osakana

リンク

2006/9/7(Thu) 03:05:14|NO.2306

>(しかもfor,whileはrepeatで代用できますが、switchは出来ないですし)
switchもhspdef.asを見てみたらgotoで跳ばしてるだけ見たいですね・・・。

>理由があるのかは謎ですが、switchを命令として欲しいです☆
同感です。命令になったらビシバシ使えますもんね(^^

Cなど他の言語を知っていると、HSPもこう出来たら良いいなあ
とか思ったりしますが、余り色々な書き方が出来てしまうと
初心者さんの混乱の元になりそう・・
でも前々から言われている構造体が使えたら・・とは思います。


最近偶然発見した直接プログラムとは関係ないネタ。
hsed3.exe限定。
コーディングしている時スクリプトをドラッグで
数行選択して[tab]を押すと一括でインデント出来る。
フリーのテキストエディタでも出来る物がある。
それだけ・・・。
もしかして有名?・・・



kz3

リンク

2006/9/7(Thu) 08:34:53|NO.2310

>数行選択して[tab]を押すと一括でインデント出来る。

[Shift+TAB]だとアンインデントです。



りさ

リンク

2006/9/7(Thu) 12:56:58|NO.2311

>初心者さんの混乱の元になりそう・・
そうですね。
これが一番の問題になっているのかも知れません(^^;

ですけど、一方で、HSPを学んだことで、
C言語の繰り返し命令だとか、関数だとかを、
スムーズに理解できるというメリットがあると思います( ̄w ̄/

あたしもそうでした。
少し苦手意識もってるCを、HSPで学べたらなぁ〜って思います☆
色々な意味で、構造体が使えたらと、同じく思いますww

>一括でインデント出来る

これって、知らない人もいると思いますよ(゜д゜」
あたしはVC++使ってるんで(使えてないですけど(笑、あれが同じ動作をします☆
HSPで出来んのかなぁ・・・くらいでやったら、出来たのを覚えてますw

>[Shift+TAB]だとアンインデントです。

知りませんでしたm(_ _)m
「なんで出来ないんだ?」と思いつつ、
↑ BackSpace ↑ BackSpace ・・・を何百回も押してました(笑
if文の挿入なんかで、インデント位置が変わりますからね。
実は意外と便利ですね、スクリプトエディタ(今更v

みんなの為にも有名にしたいですね〜
もしかして有名だったり・・・

#
最近知ったことなんですけど、
ウィンドウのタイトルに"HotSoupPro..."と表示されるので、
デフォルトでそうなのかと思ってたんですが、
実行可能ファイルにすると""に( ̄□ ̄;

過去ログ調べたら、ありました・・・けど、
初めから"HotSoupPro..."とあるのが初心者には分かり辛いんじゃないかな、と。



osakana

リンク

2006/9/7(Thu) 20:28:41|NO.2312

>[Shift+TAB]だとアンインデントです。
知ってはいたのですが、文脈考えるのに気を取られて忘れてました・・
kz3さんつっこみ有難うございます。
オブジェクトの選択でもtabで進み、shift+tabで戻るならおそらく
これも出来るはず、ムムム。とやってました。

>ですけど、一方で、HSPを学んだことで、
>C言語の繰り返し命令だとか、関数だとかを、
>スムーズに理解できるというメリットがあると思います( ̄w ̄/
そうですねー私もPerlに挫折してHSPを覚えて
Cに挑戦した口なので、よくわかります。

>初めから"HotSoupPro..."とあるのが初心者には分かり辛いんじゃないかな、と。
確かに。

HSPでリンクリストが作れたらカッコいいかも。



りさ

リンク

2006/9/7(Thu) 22:00:44|NO.2314

>私もPerlに挫折してHSPを覚えてCに挑戦した口なので、よくわかります。

そうなんですかぁ♪
そういう意味では、HSPってスゴイ(?)ですよね☆

>HSPでリンクリストが作れたらカッコいいかも。
っていうのは、どういう意味ですか(^^?

意味が違うかもなんですが、そーいえば、HSPはリンク作成が難しいですよね。
もちろん標準命令だけで、です( ̄ж ̄

repeat stick ky if ky { if (mousex>200)&(mousex<300)&(mousey>10)&(mousey<20) :処理A :continue if (mousex>200)&(mousex<300)&(mousey>20)&(mousey<30) :処理B :continue } await 1 loop
みたいに、条件を四方設定しないとリンク見たいのは作れないですし、
HSPの場合は処理がそこまで高速でないので、
リンク数が多いと動作が遅くなっちゃったりします・・・(><;

特にHTMLの link=#000000 alink=#606060 vlink=#A0A0A0>
みたいなものを実現しようとすると、尚更です。

文字ボタンのようなものに関して、コツとかあったりするのでしょうか?
もし知っていましたら、是非教えてくださいまし m(_ _)m



naznyark

リンク

2006/9/8(Fri) 02:50:38|NO.2316

> 文字ボタンのようなもの
mod_customizebutton.hsp
http://hspwiki.nm.land.to/?Module%2Fcustomizebutton

そのボタンを使ったリンクもどき。


#include "mod_customizebutton.hsp" font msgothic, 16 mes "リンクもどき" pos 0, 24 : mes "dialog 1 表示、dialog 2 表示、終了のリンク。" dim bi, 3 objmode 2 color 0,0,255 objsize 48,16 : pos 64, 24 : button "表示", *d1 : bi(0)=stat custombutton bi(0), -2, -1, 0, 48 objsize 64,16 : pos 120, 24 : button "dialog 2", *d2 : bi(1)=stat custombutton bi(1), -2, -1, 0, 48 objsize 16,16 : pos 336, 24 : button "。", *ed : bi(2)=stat custombutton bi(2), -2, -1, 0, 48 stop *d1 color 255, 0, 255 custombutton bi(0), -2, -1, 0, 48 dialog "dialog 1" stop *d2 color 255, 0, 255 custombutton bi(1), -2, -1, 0, 48 dialog "dialog 2" stop *ed end



りさ

リンク

2006/9/8(Fri) 12:58:45|NO.2319

naznyarkさん、お返事ありがとうございます(^^

間違いなく、 link , vlink が作成されていますね☆
こんなことも出来るんですねっ〜、ちょっと驚きです。

サンプルスクリプトどうもありがとうございますm(__)m

これをどうにかにて、alink を追加してみようとしたんですが、
あくまで「ボタン」として存在しているようで、
オブジェクトの上にカーソルがある状態での判断は難しそうです( ̄n ̄;

そこで、
1.オブジェクトにマウスフォーカスが移ったら
2.mousex,mouseyがリージョン上にいたら
のどちらかで、やってみることにしました。

MSDNに行ってみたんですが、なにぶん慣れていないもんで。
一時間探して見つけたのが、

/*指定された点が、指定されたリージョンの内側にあるかどうかを調べます。*/ BOOL PtInRegion( HRGN hrgn, // リージョンのハンドル int X, // 点の x 座標 int Y // 点の y 座標 );
これです(^^;
これがHSPの関数として使えるのかとか、
リージョンのハンドルは何かとかは、理解できませんが
なんとなく、これで判定を繰り返すことで、alink が作れるんじゃないかな・・・
と思いやってみました。(^^;

#uselib "gdi32.dll"
のところに、
#func PtInRegion "PtInRegion" int,int,int
と追加してみたものの、

repeat PtInRegion b(0),mousex,mousey if stat :dialog await 1 loop
頂いたスクリプトのstopのところを、↑に変えたのですが、
文法エラーが・・・(謎)
手探りなので当然なんですが(><;

ここから、少しヒントを頂けませんでしょうか?
よろしくお願いしますM(__)M



naznyark

リンク

2006/9/9(Sat) 01:18:59|NO.2328

> 文法エラーが・・・(謎)

3.0(a) , 3.1b5 ではモジュール内で #func , #cfunc で定義した命令(関数)は
ローカル扱いでそのモジュール内でしか使用できません。
モジュール外で使用したいときは定義時に global 指定をするか、
使用時に (命令)@(モジュール名) とモジュール名を明示します。
(あるいはモジュール外で定義を行います。)


> これをどうにかにて、alink を追加してみようとしたんですが、

実は私なりに作ってみたサンプルはありますが、とりあえずヒントのキーワード
WindowFromPoint
ginfo(0)
ginfo(1)

後で私のサンプルも書き込みます。



りさ

リンク

2006/9/9(Sat) 21:29:41|NO.2337

ご親切に、どうもありがとうございますm(_ _)m

>モジュール外で使用したいときは定義時に global 指定を
そうだったんですか☆ご指摘ありがとうございますっ!

>ヒントのキーワード
本当にすいませんっ!
頂いたヒントを駆使して、色々試したいと思います☆

あたしは、1・2日じゃ諦めない性格(?)なので、
もしかしたらスゴク時間がかかってしまうかもです(^^;
自分なりにメイッパイ頑張りますので、超考(笑)をお許しくださいませ(><;

もしその間に同じような方がいらっしゃって、解答を望んでおられるようでしたら
サンプルスクリプトを載せて貰えないでしょうか?
よろしくお願いしますm(__)m

それから、出来れば教えて頂きたいのですが、

欲しい命令・関数
  ↓
存在する命令・関数
  ↓
HSPで使用可能な命令・関数

という流れ、(今回でいう、alink → WindowFromPoint)
というのをどういう風に取得されたのでしょうか?
または、どうすれば取得できるのでしょうか?

これが、分かれば、HSP標準命令に捕らわれず、
より広い世界でプログラミングができるかも( ̄▽ ̄カモ?知れないと思います(^^v
なにより頼らずにプログラミングができますでしょうし・・・

#
ボタンを持つプログラムで、ボタンの見栄えや機能はとても重要だと思います。
このalink,vlinkのような機能は、必要なオブジェクトの一つのような気がしますww



naznyark

リンク

2006/9/10(Sun) 02:59:55|NO.2340

> あたしは、1・2日じゃ諦めない性格(?)なので、
> もしかしたらスゴク時間がかかってしまうかもです(^^;
> 自分なりにメイッパイ頑張りますので、超考(笑)をお許しくださいませ(><;

私のことは気にせずに納得いくまでやってください。

私のサンプルはあくまで参考にするための一例と考えていますから
必要がないならそれでかまいません。


> それから、出来れば教えて頂きたいのですが、

こちらの質問はうまく文章がまとまらないので答えられません。
文章にまとめられたなら後で書き込みます。



osakana

リンク

2006/9/10(Sun) 03:48:36|NO.2342

>HSPでリンクリストが作れたらカッコいいかも。
変数をポインタで繋いでニョキニョキ伸ばして行くヤツの
つもりでしたが、話が広がったので結果オーライ、万事OK。

>mod_customizebutton.hsp
HSP開発wikiを見て存在は知っていましたが、
あらためて見てみると色々出来そうですね。
というか、凄過ぎて使いこなせない・・・。

こういう雑談スレッドもいいですね。(今ごろ...)



くに

リンク

2006/9/11(Mon) 03:26:44|NO.2361

>>HSPでリンクリストが作れたらカッコいいかも。
>変数をポインタで繋いでニョキニョキ伸ばして行くヤツの
>つもりでしたが、話が広がったので結果オーライ、万事OK。

ラボ/片方向リンクリスト - HSP開発wiki
http://hspwiki.nm.land.to/?%A5%E9%A5%DC%2F%CA%D2%CA%FD%B8%FE%A5%EA%A5%F3%A5%AF%A5%EA%A5%B9%A5%C8

ラボ/双方向リンクリスト - HSP開発wiki
http://hspwiki.nm.land.to/?%A5%E9%A5%DC%2F%C1%D0%CA%FD%B8%FE%A5%EA%A5%F3%A5%AF%A5%EA%A5%B9%A5%C8

とかありますね。



kz3

リンク

2006/9/11(Mon) 09:38:36|NO.2364

げ...。
まぁあれはポインタを使わないで実装するHSP向けのサンプルという趣向で書きましたです。



りさ

リンク

2006/9/12(Tue) 10:21:05|NO.2379

遅くなってすいませんっ!

naznyarkさん、osakanaさん、くにさん、kz3さん、
どうもありがとうございます☆

>のことは気にせずに納得いくまでやってください。
分かりました(^^ ありがとうございます。

>文章にまとめられたなら後で書き込みます。
よろしくお願いしますm(_ _)m

>変数をポインタで繋いでニョキニョキ伸ばして行く
あっ、そうだったんですか!すいません(^^;

>ラボ/リンクリスト
リンクありがとうございます(^^/

#

MSDNで探したのですが、

< WindowFromPoint > 指定されたポイントを含むウィンドウを取得します。 point には、画面上にポイントの画像座標を指定する必要があります。 static CWnd* PASCAL WindowFromPoint( POINT point ); [ パラメータ ] point 調べる点を定義する CPoint オブジェクトまたは POINT データ構造体を指定します。 [ 戻り値 ] 指定された点を含むウィンドウ オブジェクトへのポインタ。 指定された点がいずれのウィンドウにも含まれない場合は、NULL を返します。 返されるポインタは、一時的なポインタです。後で使用するために保存しておくことはできません。

これでいいのでしょうか?
C++ の分類だったので、もしかしたら違うかもしれません(汗

それから、ヒントのキーワードなんですが、
mousex,mousey ではなくて、ginfo(0)とginfo(1)なのは、
WindowFromPointに渡す値に必要だからなのでしょうか?

あまりにも分からないことが多いので、
いきなり目隠し状態に突入してしまいました(><;
申し訳ありませんです(涙



osakana

リンク

2006/9/12(Tue) 15:40:49|NO.2383

色々調べて試してみたら、これで機能するみたいです。
深い意味は無いですが、確認用にhwndも表示しています。
	
#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int repeat cls mes WindowFromPoint(ginfo(0),ginfo(1)) mes hwnd wait 50 loop



りさ

リンク

2006/9/12(Tue) 23:02:16|NO.2389

なんとなく分かってきました☆

WindowFromPoint関数の引数が1つだったので、混乱していましたっ。
とりあえず、スクリプトを・・・


#include "mod_customizebutton.hsp" #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int color :boxf color 0xFF,0xFF,0xFF font msmincho,16 pos 0,32 mes "MessageButton with HSP\n" mes "<body bgcolor=#000000 text=#FFFFFF link=#B00000 alink=#FF0000 vlink=#800000>" pos 0,120 mes "Function [ WindowFromPoint ]" mes "HWND WindowFromPoint( POINT point );" mes "Return Value" dim bi,3 // Object ID dim bh,3 // Object pointer dim vlink,3 // vlink ON/OFF obj=0 objmode 2 color 0xB0 // Object 1 objsize 120,16 :pos 88,120 :button "WindowFromPoint",*vlink1 bi(0)=stat :custombutton bi(0),-2,-1,0,48 // Object 2 objsize 40,16 :pos 224,136 :button "point",*vlink2 bi(1)=stat :custombutton bi(1),-2,-1,0,48 // Object 3 objsize 96,16 :pos 0,152 :button "Return Value",*vlink3 bi(2)=stat :custombutton bi(2),-2,-1,0,48 repeat switch ( WindowFromPoint(ginfo(0),ginfo(1)) ) case bh(0) gosub *alink1 swbreak case bh(1) gosub *alink2 swbreak case bh(2) gosub *alink3 swbreak default gosub *clear swbreak swend await 10 loop /* 1st SubRoutine */ // vlink *vlink1 obj=0 gosub *click dialog "The WindowFromPoint function retrieves a handle to the window that contains the specified point." stop *vlink2 obj=1 gosub *click dialog "[in] Specifies a POINT structure that defines the point to be checked." stop *vlink3 obj=2 gosub *click dialog "The return value is a handle to the window that contains the point. \nIf no window exists at the given point, the return value is NULL. " stop // alink *alink1 obj=0 gosub *hover stop *alink2 obj=1 gosub *hover stop *alink3 obj=2 gosub *hover stop *clear repeat 3 if vlink(cnt) :color 0x80 :else :color 0xB0 custombutton bi(cnt),-2,-1,0,48 loop stop /* 2nd SubRoutine */ *click color 0x80 custombutton bi(obj),-2,-1,0,48 vlink(obj)=1 return *hover color 0xFF custombutton bi(obj),-2,-1,0,48 return

配列 bh は、WindowFromPoint関数の戻り値と比較するために用意しました。
ですが、それぞれのボタンのウィンドウへのハンドルの取得方法が分かりません(><;

一応、こんな流れでいいと思うのですが、どうでしょうか?



りさ

リンク

2006/9/12(Tue) 23:12:40|NO.2390

WindowFromPoint を使ったスクリプトがありましたね〜♪

【今どのウィンドウにマウスカーソルが乗っているか調べたい】
  (http://hsp.tv/play/pforum.php?mode=all&num=2382

Shinyaさんが回答されていますが、
それぞれ、hwndでウィンドウハンドルを取得して、
WindowFromPoint関数の戻り値と比較してるようです( ̄▽ ̄J|L

これなら理解できるようになりました☆

結構、色々な場所で使われている関数なんですね〜(^^関心



osakana

リンク

2006/9/13(Wed) 07:54:24|NO.2396

>ボタンのウィンドウへのハンドルの取得

#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int #define max 8 repeat max button "ボタン"+cnt,*main hbtn(cnt)=objinfo(stat,2) loop *main redraw 0 repeat max if hbtn(cnt)=WindowFromPoint(ginfo(0),ginfo(1)) { color 255,255,255 :boxf pos 100,0 color 0,0,0 :mes ""+cnt+" = "+hbtn(cnt) } loop wait 1 redraw 1 goto *main
・・・なんてのは、どうでしょう?



osakana

リンク

2006/9/13(Wed) 10:39:45|NO.2397

少しだけ修正。

#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int #define max 8 y=0,5,2,7,4,1,6,3 repeat max pos 0,y(cnt)*25 :button "ボタン"+cnt,*main hbtn(cnt)=stat loop *main redraw 0 repeat max if objinfo(hbtn(cnt),2)=WindowFromPoint(ginfo(0),ginfo(1)) { color 255,255,255 :boxf color 0,0,0 :pos 100,0 mes ""+hbtn(cnt)+" = "+objinfo(hbtn(cnt),2) break } loop wait 4 redraw 1 goto *main



りさ

リンク

2006/9/13(Wed) 14:02:36|NO.2398

osakanaさん、すいませんっ(^^;
ヒント沢山貰っちゃいましてww

1. #cfunc WindowFromPoint "WindowFromPoint" int,int
2. ウィンドウオブジェクトハンドルの取得 ( objinfo )

ということで、おかげさまで、完成しました(^^/

#include "mod_customizebutton.hsp" #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int color :boxf color 0xFF,0xFF,0xFF font msmincho,16 pos 0,32 mes "MessageButton with HSP\n" mes "<body bgcolor=#000000 text=#FFFFFF link=#B00000 alink=#FF0000 vlink=#800000>" pos 0,120 mes "Function [ WindowFromPoint ]" mes "HWND WindowFromPoint( POINT point );" mes "Return Value" dim id,3 // Object ID dim vlink,3 // vlink ON/OFF obj=0 objmode 2 color 0xB0 // Object 1 objsize 120,16 :pos 88,120 :button gosub "WindowFromPoint",*vlink1 id(0)=stat :custombutton id(0),-2,-1,0,48 // Object 2 objsize 40,16 :pos 224,136 :button gosub "point",*vlink2 id(1)=stat :custombutton id(1),-2,-1,0,48 // Object 3 objsize 96,16 :pos 0,152 :button gosub "Return Value",*vlink3 id(2)=stat :custombutton id(2),-2,-1,0,48 // MAIN LOOP repeat switch ( WindowFromPoint(ginfo(0),ginfo(1)) ) case objinfo(id(0),2) gosub *alink1 swbreak case objinfo(id(1),2) gosub *alink2 swbreak case objinfo(id(2),2) gosub *alink3 swbreak default gosub *clear swbreak swend await 10 loop /* 1st SubRoutine */ // vlink *vlink1 obj=0 gosub *click dialog "The WindowFromPoint function retrieves a handle to the window that contains the specified point." return *vlink2 obj=1 gosub *click dialog "[in] Specifies a POINT structure that defines the point to be checked." return *vlink3 obj=2 gosub *click dialog "The return value is a handle to the window that contains the point. \nIf no window exists at the given point, the return value is NULL. " return // alink *alink1 obj=0 gosub *hover return *alink2 obj=1 gosub *hover return *alink3 obj=2 gosub *hover return *clear repeat 3 if vlink(cnt) :color 0x80 :else :color 0xB0 custombutton id(cnt),-2,-1,0,48 loop return /* 2nd SubRoutine */ *click color 0x80 custombutton id(obj),-2,-1,0,48 vlink(obj)=1 return *hover color 0xFF custombutton id(obj),-2,-1,0,48 return


ちゃんと、link,alink,vlink が作れていると思われまし☆
とくに、osakanaさん、naznyarkさんには、大感謝ですm(_ _)m

#

これに、もう少し機能を付けてみたいと思いますv
もうちょっと頑張りまふ〜〜p ̄v ̄q



りさ

リンク

2006/9/13(Wed) 14:20:56|NO.2399

あっ♪
追加です(^^

開発wiki でnaznyarkさん提供のmod_customizebutton.hspが
あまりに多機能だったので、いくらでも装飾できることに気が付きました。

alink時に、背景色を変更してみたかったのですが、
( javascript の hover みたいな) すぐに出来ちゃいました☆

それから、読み返して気付いたんですが、
<pre>-</pre>間のスクリプトが意外に長くなってしまってました。
すいません(--;

サブルーチン *hover をこれに変えれば、前述したのができますっ

*hover color 0xFF custombutton id(obj),-2,0x00FF00,0,48 return

\ ̄▽ ̄/ すご〜い! \ ̄▽ ̄/



りさ

リンク

2006/9/13(Wed) 15:51:15|NO.2400

更に追記です☆

このように Win32API が自由に使えるということが分かりましたので、
HSP の PSET を作ってみました。
RGBマクロがないので、#defcfunc で作ってみました☆ミ

#module "macro_RGB" #defcfunc RGB int v1,int v2, int v3 return (v1+(v2<<8)+(v3<<16)) #global #uselib "gdi32.dll" #func global SetPixelV "SetPixelV" int,int,int,int // 点で線を描いてみる redraw 0 repeat 100 SetPixelV hdc,cnt,10,RGB(255,0,0) SetPixelV hdc,cnt,20,RGB(0,255,0) SetPixelV hdc,cnt,30,RGB(0,0,255) loop redraw 1 stop

これを見ると、Windowsプログラミングをしている以上、
「言語」が何かというのは、全くと言っていい程、
関係がないことだというのが理解できます(^^

昔、「HSPプログラマは、プログラマなのか?」という文章を読んだことがありますが、
そもそも基準が言語に置かれるべきではないような気がしてきますねww



りさ

リンク

2006/9/13(Wed) 19:15:19|NO.2405

ごめんなさい(^^;
更に更に追記です☆

マクロは、マクロとして記述すべきでした。
わざわざ関数にすることなかったです。

#define global ctype RGB(%1,%2,%3) (%1+(%2<<8)+(%3<<16)) #uselib "gdi32.dll" #func global SetPixelV "SetPixelV" int,int,int,int redraw 0 repeat 320 SetPixelV hdc,cnt*2,10,RGB(255,0,0) SetPixelV hdc,cnt*2,20,RGB(0,255,0) SetPixelV hdc,cnt*2,30,RGB(0,0,255) loop redraw 1 stop

今度は、点線を描いてみましたっ= ̄w ̄=



naznyark

リンク

2006/9/14(Thu) 02:57:52|NO.2410

> ということで、おかげさまで、完成しました(^^/

おめでとうございます。ですが注意点を一つ。

custombutton は(再)設定するたびにボタンの再描画をする上に、
透過処理の描画は通常の描画よりも処理としては重いので
ループの度に毎回 custombutton で設定を行うのは避けるべきです。
(設定内容の変更なしの再設定でも再描画してしまうモジュールの仕様が悪いのですが・・・すいません。)

例えば以下のように設定を変更する必要があるときのみ
custombutton での再設定を行うようにしたほうが良いです。

old=-1 : cur=-1 // MAIN LOOP repeat hwm=WindowFromPoint(ginfo(0),ginfo(1)) cur=-1 repeat 3 if hwm=objinfo(id(cnt), 2) : cur=cnt : break loop if old!=cur { switch cur case 0 gosub *alink1 swbreak case 1 gosub *alink2 swbreak case 2 gosub *alink3 swbreak default gosub *clear swbreak swend old=cur } await 10 loop



naznyark

リンク

2006/9/14(Thu) 03:01:16|NO.2411

> 欲しい命令・関数
>   ↓
> 存在する命令・関数
>   ↓
> HSPで使用可能な命令・関数

> という流れ、(今回でいう、alink → WindowFromPoint)
> というのをどういう風に取得されたのでしょうか?
> または、どうすれば取得できるのでしょうか?

結局うまくまとまらなかった。メモ程度の文章。


まずは欲しい命令の機能そのもの、および、その機能に直接関係している言葉で検索。
(alink、リンク、クリック、ジャンプ、移動など)


見つからなければ他の命令を組み合わせて欲しい命令を自分で作ることを考える。

まず命令の動作を考える。
(案 1)
リンクの置かれた場所の座標とマウスカーソルの座標を比べてその結果に応じて処理をする。
(案 2)
(今回はリンクにボタンを使っているので、)ボタンの上にマウスカーゾルがあるかを調べて
その結果に応じて処理をする。

その動作に必要な命令を関係する言葉で検索して探す。
(案 1) の検索キーワード
リンクの置かれた場所は矩形の座標で表現できる。
(矩形、点、座標など)
(案 2) の検索キーワード
ボタンはコントロール、つまりウィンドウ。
(ボタン、コントロール、ウィンドウ、マウスカーソルなど)

望みどうりの命令が見つからなければ別のやり方を考えたり、
命令を作るための命令を作るための命令を探す・・・と繰り返す。


プログラム上の基本的な要素(矩形、点、座標)やウィンドウズのシステムに関わる要素
(ボタン、コントロール、ウィンドウ、マウスカーソル)などについては
web 内を漠然と検索するよりは探す場所を限定したほうが結果的に早く本質的な情報を得やすい。
(私は上記のような場合 HSPのドキュメント・ヘルプ → MSDN の順で探す)


MSDN 内で必要な情報を見つけるのは慣れが必要(?)。私の MSDN の使い方は次のようなもの。
・MSDN(英語版)を使う。
・動作ではなく要素を軸に探す。(例えば「クリック(click)」ではなく「マウス(mouse)」で探すなど)
・まず xxxx , xxxxs といったキーワードで検索(xxxx は調べたい要素)
・xxxx reference (要素に関係する関数やメッセージの概略のページ)
xxxx overview , about xxxx (要素に関する説明のページ)
といったページを見つける。



りさ

リンク

2006/9/14(Thu) 04:18:34|NO.2412

>ループの度に毎回 custombutton で設定を行うのは避けるべき

確かにおっしゃる通りですっ、基本でした☆^^☆
これは、今回に限らず、出来る限り再描画を避けるのがベターですね(^◇^
訂正スクリプトありがとうございます。

>メモ程度の文章。
いえいえ、それだけでも充分参考になります^^

>関係している言葉で検索
とにかくマニュアル・過去ログ・ぐぅぐる ってゆ〜のは、一番大切ですよね♪

>命令を作るための命令を作るための命令を探す
これは結構ハードですね。
アルゴリズムがはっきり理解出来ていれば、可能かもです。

>MSDN(英語版)を使う。
まじですか(笑)
あたしも日本語で上手く見つけられなかったんで、英語版で試してみたんです。

上記スレのスクリプトで、ボタンをクリックして出てくるダイアログでは、
英語の解説の一部を載せてあります。これは、そこでGETしました^^;

見てみると、英語の方が項目が多いような気がします(?)
やっぱり英語版の方がメリットがあるんですね☆

>動作ではなく要素を軸に探す・・・
これ重要っぽいですね!

そもそも今回の場合のようなボタンから、
クリックは想定できても、マウスは思いつかないようです。
(そもそも「座標を調べることをせずに、リンクを製作する」というテーマでしたし)

次回からは、これを参考に自分で調べて、自分でAPIを使用してみようと思います☆
詳しい説明をどうもありがとうございます m<(_ _)>m

#

HSP開発wiki : MAKE HPI
http://hspwiki.nm.land.to/?MakeHPI

で kz3さんが提供されてるコードを、自分の環境でやってみました。
半年前からやっていて、7回やって7回ダメでした(エラーで)

ですが、今日やったらコンパイルに成功し、hsmsgbox.hpi を作成できました!
何故かは分かりません(><)(笑

あたしは未だに Microsoft Visual C++ 6.0 SE を使用しています。けど、

#regcmd "hsmsgboxinit","hsmsgbox.hpi" #cmd msgbox $000


#regcmd "_hsmsgboxinit@4","hsmsgbox.hpi" #cmd msgbox $000

という変更だけで、ちゃんとメッセージボックスが表示されました☆

頑張って、色々なプラグインを作ってみたいと思ってますvv



osakana

リンク

2006/9/15(Fri) 04:01:04|NO.2434

>ということで、おかげさまで、完成しました(^^/
完成おめでとうございますです!!
>ヒント沢山貰っちゃいましてww
今思えば私は横からちょっかいを出してた様な物ですね。逆にすいません(~o~

>MSDN(英語版)を使う。
英語・・・・やはり、避けては通れないのか・・・

>このように Win32API が自由に使えるということが分かりましたので、
>HSP の PSET を作ってみました。
と言うことで色々流用して簡単に時間を計ってみました。
1 API + RGB(module)
2 API + RGB(macro)
3 color + pset まとめて
4 color + pset 一色ずつ
ちょっとだけ長いです。。。

#define global ctype RGB_(%1,%2,%3) (%1+(%2<<8)+(%3<<16)) #module "macro_RGB" #defcfunc RGB int v1,int v2, int v3 return (v1+(v2<<8)+(v3<<16)) #global #uselib "gdi32.dll" #func global SetPixelV "SetPixelV" int,int,int,int max=1000 max2=640 //---------------- redraw 0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat max repeat max2 SetPixelV hdc,cnt,10,RGB(255,0,0) SetPixelV hdc,cnt,20,RGB(0,255,0) SetPixelV hdc,cnt,30,RGB(0,0,255) loop loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) pos 0,30 :mes strf("API+RGBモジュール=%d",time2-time1) redraw 1 //---------------- redraw 0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat max repeat max2 SetPixelV hdc,cnt,50,RGB_(255,0,0) SetPixelV hdc,cnt,60,RGB_(0,255,0) SetPixelV hdc,cnt,70,RGB_(0,0,255) loop loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) pos 0,70 :mes strf("API+RGBマクロ=%d",time2-time1) redraw 1 //---------------- redraw 0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat max repeat max2 color 255,0,0 :pset cnt,90 color 0,255,0 :pset cnt,100 color 0,0,255 :pset cnt,110 loop loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) pos 0,110 :mes strf("標準命令一括=%d",time2-time1) redraw 1 //---------------- redraw 0 time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat max color 255,0,0 :repeat max2 :pset cnt,130 :loop color 0,255,0 :repeat max2 :pset cnt,140 :loop color 0,0,255 :repeat max2 :pset cnt,150 :loop loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) pos 0,150 :mes strf("標準命令分割=%d",time2-time1) redraw 1 //---------------- stop
一瞬「API + RGB(macro)」が最速かと思いましたが最後の標準命令が一番ダントツでした。
試してて分かったんですが redraw って APIには効果が無いみたいです。
あ・・まだ vram + poke がありましたね・・・まぁいっか・・・。



りさ

リンク

2006/9/15(Fri) 05:20:06|NO.2436

>逆にすいません(~o~
そんなこと無いですよ!? ちょっと多めのヒント頂けたなって感じで☆

>英語・・・・
でも関数も英語みたいなもんですしね(^^
ウィンドウとかポインタとかマウスとかインスタンスとかハンドルとか、
みんなエ〜ゴじゃないですか〜♪

>簡単に時間を計ってみました
お疲れ様です( ̄v ̄ヾ
結果は実行するまで、全く想像できなかったです。

1より2が、3より4が早いのは分かりますねww
2と4は同じくらいだと思ってたんですけど・・・・全然ちがうぅ( ̄□ ̄;

>redraw って APIには効果が無いみたいです。

これはあたしも思いました。
っていうのも、 redraw 1 を実行後に入れないと、点が表示されないんです(^^?
あたしの知識で思いつくのは、
「EndPaint関数が必要?」とかぐらいで、全くもって謎ちゃんです(><
なんでなのでしょうかね?これが全体の実行速度に関係あると思うんですが・・

#

WindowsXP 224MB-RAM では、
4562
2969
3140
1641
となりました。(3回の平均です)
圧倒的ですね(笑)

それから、同じ環境で、redraw 0 をコメントアウトしました。
( redraw 1 は、API使用版の表示に必要なので)
4562
2844
14594
12156
となりました。(3回の平均です)
脅威でし(^^v

これについては、もう少し調べてみます(^^
もし分かる方がいらっしゃいましたら、宜しくお願いします m<(_ _)>m

#

開発wikiでプラグイン開発のサンプルを真似できたので、
自由にメッセージボックスを作れるように、MessageBox関数と同じにしてみたいのですが、

void msgbox( void ) { HWND hwnd; int iprm; char *sprm, *text, *title; /* 第一パラメータ取得 */ hwnd = (HWND)code_getdi( 0 ); /* 第二パラメータ取得 */ sprm = code_getds( "" ); text = hspmalloc( lstrlen( sprm ) + 1 ); lstrcpy( text, sprm ); /* 第三パラメータ取得 */ sprm = code_getds( "" ); title = hspmalloc( lstrlen( sprm ) + 1); lstrcpy( title, sprm ); /* 第四パラメータ取得 */ iprm = code_getdi( 0 ); stat = MessageBox( hwnd, text, title, iprm ); return; }

第一パラメータの取得部分が、これでいいのか分かりません。
一応、DLLにして、HSPから第一パラメータに
hWnd を入れると 、メインウィンドウに制御を移すことが出来なくなり、
NULL(0)を入れると、メインウィンドウに制御を戻すことが出来るようになります。
(メッセージボックスを出したままで・・・です)

なので、実現出来ているようなのですが、正しく実行できているのか不安なので、
ぜひ、アドバイス・助言を頂けませんでしょうか(^^??



osakana

リンク

2006/9/15(Fri) 06:14:51|NO.2437

>第一パラメータの取得部分が、これでいいのか分かりません。
私も詳しくないですが、MessageBox に関しての動作は
合っているのではなかろうか?と思います。
たしかNULLはオーナーウィンドウの無いメッセージボックスだったはず、
なんかまた的が外れてそうなのでこの辺にしときます。



りさ

リンク

2006/9/15(Fri) 07:03:32|NO.2438

>的が外れてそうなのでこの辺に
構わないですよ〜。情報が無いより、ぜんぜん助かりますっ(^^
考えて頂けるだけで、嬉しいですm(_ _)m

>計ってみました
そ〜いえば、osakanaさんの環境はどんなですかぁ?
教えてもらえると参考になりますっ☆

あたしもつられて、色々計ってみました(笑)
リストにでもして、まとめたいですねww

1. 無駄なスペースをたくさん挿入
2. 無駄なタブをたくさん挿入
3. 無駄なコメントをたくさん挿入

してみたところ、基本通りに、全く変わらずの結果でした。誤差もでないほどです♪

それを踏まえて、「if 文」の処理速度を計測しました。
環境は、(何度も書いてる気がしますっ(笑)
 WinXP 224MB と WinME 255MB です。

// A repeat 10000000 if x :a++ :b++ :c++ :else :a++ :b++ :c++ loop // B repeat 10000000 if x { a++ b++ c++ } else { a++ b++ c++ } loop // C repeat 10000000 if x { a++ :b++ :c++ } else { a++ :b++ :c++ } loop

これを、x=0 のときと、 x=1 のときで分けて考え、(計6パターン)
それぞれを3回計測しました(計18回)

A(x=1) A(x=0) B(x=1) B(x=0) C(x=1) C(x=0) WinXP 4141 3797 4156 3813 4140 3828 WinME 8730 7960 8630 7960 8620 7910
さらに、a++ :b++ :c++ を、 pos 0,0 :mes "A" と変えたところ(但し1000000回ループ)

A(x=1) A(x=0) B(x=1) B(x=0) C(x=1) C(x=0) WinXP 27078 26703 27313 26890 27047 26375 WinME 24550 24500 24600 24600 24600 24550

こうなりました。全部で36回の計測ですが、足りないようですv
まだばらついていました・・・pT Tq

ですが、注目して頂きたいのは、x=0 の時です。
あたしが測定した限りでは、x=0 の時の方が、処理が早いのです!!

つまり、分岐の偏りがある程度分かっている場合は、
else 後に記述した方がよい、という結論に達します☆

・・・達したいのですが、なにせ
 〃彗回数が少ない
◆〇遒靴心超が少ない
 ループ回数を上げ制度を上げると、時間がかかり過ぎる
という問題があるので、なかなか確信が持てませんっ(^^;

でも面白い内容じゃないですか(^〇^?ちょっと実用的かも☆



りさ

リンク

2006/9/15(Fri) 09:46:30|NO.2439

この前(?)、switchマクロが遅いという話をしたので、それも調べてみました。
分岐数が少ないので、参考になるかは分かりませんが・・・
出来る限り、条件を合わせてみましたので、
defaultマクロは使用せず、case の最後にも swbreak を入れました☆

#define else_if else:if #const nLoop 500000 mes "BenchMark ["+nLoop+"Loops] (ms)\n\nswitch :\nif :\nif else :" dim timeA,10 :dim timeB,10 :dim timeC,10 repeat 10 c=0 randomize cnt time1=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat nLoop x=rnd(3) // BenchMark ///////////////////// switch ( x ) case 0 c++ :swbreak case 1 c++ :swbreak case 2 c++ :swbreak swend ////////////////////////////////// loop time2=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat nLoop x=rnd(3) // BenchMark ///////////////////// if x=0 :c++ if x=1 :c++ if x=2 :c++ ////////////////////////////////// loop time3=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) repeat nLoop x=rnd(3) // BenchMark ///////////////////// if x=0 { c++ } else_if x=1 { c++ } else_if x=2 { c++ } ////////////////////////////////// loop time4=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7) pos 90+cnt*45,36 timeA(cnt)=time2-time1 :mes timeA(cnt) timeB(cnt)=time3-time2 :mes timeB(cnt) timeC(cnt)=time4-time3 :mes timeC(cnt) loop time1=0 :time2=0 :time3=0 repeat 10 time1+=timeA(cnt) :time2+=timeB(cnt) :time3+=timeC(cnt) loop pos 540,36 :mes "@AVRG "+(time1/10)+"\n@AVRG "+(time2/10)+"\n@AVRG "+(time3/10) stop
WinXP(224MB) 735,514,415 (ms) でした。

もし、試して頂ける方がいらっしゃいましたら、ご報告お願いいたしますm<(_ _)>m

『不要部分の多い長いスクリプトの投稿は ご遠慮ください。』
すいません。
同じスクリプトで試して頂きたいので、そのまま記述しました。
(出来る限り、行数は減らしました)
もし、不都合があったり、不適切・不必要だと感じましたら、削除します(><;



osakana

リンク

2006/9/15(Fri) 20:32:17|NO.2445

> みんなエ〜ゴじゃないですか〜♪
本当だ〜...って、確かにそうなんですが、文法が・・・
ここはイエス アイ ドゥーと言っておこう(・o・。

> 1 API + RGB(module)
> 2 API + RGB(macro)
> 3 color + pset まとめて
> 4 color + pset 一色ずつ
> そ〜いえば、osakanaさんの環境はどんなですかぁ?
> 教えてもらえると参考になりますっ☆
ではでは計った結果を書きます。
環境は:WinXP384MB RAMのアスロン2.19GHz
max:10000,max2:640 の結果を10で割ってます。

変数でmax,max2
1:3245 //RGB関数(module-global)
1:3167 //RGB関数(module指定なし)
2:2021
3:2336
4:1110

defineでmax,max2
1:3115 //RGB関数(module-global)
1:3093 //RGB関数(module指定なし)
2:1959
3:2278
4:1090

大体予想通り、ここまではっきり出るとは。
次のはredraw 0をコメントアウト。

変数でmax,max2
1:3168 //RGB関数(module-global)
1:3157 //RGB関数(module指定なし)
2:1969
3:9968
4:8203

defineでmax,max2
1:3117 //RGB関数(module-global)
1:3101 //RGB関数(module指定なし)
2:1984
3:9797
4:8000

誤差かな・・?恐るべしredraw!

>「if 文」の処理速度を計測しました。
x=1
A:2875
B:2890
C:2891
x=0
A:2796
B:2734
C:2750
> pos 0,0 :mes "A" と変えたところ(但し1000000回ループ)
x=1
A:5891
B:5922
C:5859
x=0
A:5843
B:5828
C:5828
誤差っぽいけど。どうだろう?
> x=0 の時の方が、処理が早いのです!!
大発見!?不思議ですね。たしかに0の方が早いみたい、


> switchマクロが遅いという話をしたので、それも調べてみました。
> もし、試して頂ける方がいらっしゃいましたら、ご報告お願いいたしますm<(_ _)>m
こちらも試してみました。

switch :540
if :376
if else :314

やっぱりif else、がはやーい。それでifを
if x=0 :c++ :continue
if x=1 :c++ :continue
if x=2 :c++
にして試してみましたら、if:321。少しばかり早くなりました。
ついでにif elseにもcontinueを付けてみたら、
何処につけても遅くなりました・・。
なんか奥が深いですね。そしてお疲れ様です(^-^

> もし、不都合があったり、不適切・不必要だと感じましたら、削除します
許容範囲だとおもいますよ。
それより1スレッドの許容範囲のほうが心配になります。



naznyark

リンク

2006/9/16(Sat) 01:38:05|NO.2472

>redraw って APIには効果が無いみたいです。

API というより描画の仕組みの話です。

1 HSP は表示されている画面とは別にウィンドウごとに描画用バッファ画面を保持しており、
通常の HSP の描画は
バッファ画面に描画 → バッファ画面の内容を表示されている画面にコピー
という 2段階で行われます。

redraw 0 の状態では「バッファ画面に描画」のみが行われ
「バッファ画面の内容を表示されている画面にコピー」は行われません。

redraw 1 では「バッファ画面の内容を表示されている画面にコピー」を
強制的に行います。


2 HSP のシステム変数 hdc が返すのは HSP が内部に保持しているバッファ画面の
デバイスコンテキスタハンドルであって表示されている画面のDCハンドルではありません。

システム変数 hdc と API を使って描画を行った場合は
hdc の示す画面(バッファ画面)に描画
が行われます。

API は HSP の仕様のことなど知らないので「バッファ画面の内容を表示されている画面にコピー」
は行いません。
「バッファ画面の内容を表示されている画面にコピー」を行いたい場合は API による描画とは別に
redraw 1 を実行する必要があります。


> 第一パラメータの取得部分が、これでいいのか分かりません。

実質問題は無いと思います。(引数の値を調べて NULL を明示的に代入したほうが
落ち着く感じはしますが気分の問題でしょう。)
それと動的に確保したメモリは用がすみ次第、すみやかに解放したほうが良いと思います。



osakana

リンク

2006/9/16(Sat) 15:29:22|NO.2477

>>redraw って APIには効果が無いみたいです。
>API というより描画の仕組みの話です。
2段構えと言うのはどこかで見聞きした事がありましたが、
そういう事だったんですね。お蔭様で理解できました。
naznyarkさん有難うございます。



りさ

リンク

2006/9/17(Sun) 10:51:41|NO.2487

お返事遅れましたっ m(_ _)m

>内部に保持しているバッファ画面のhDC
同じく、とてもわかり易い説明ありがとうございます☆
この事実は描画に関してはとても重要なことなので、
仕様を学ぶことができて、とても嬉しいです(^^/

>解放したほうが
そうですかっ!
ありがとうございます( ̄ ̄ヾ

SDKの解説を読んだ限りで、あった方がいいかとも思ったのですが、
渡される文字列は、メモリにそれ程の影響を与えないかとも考えていたので、
開放はしませんでした。
やはりしたほうがいいんですね。以後、注意します(^^v

>計った結果を書きます
ありがとうございます、ご丁寧にm(_ _)m
もう少し色々やってみて、今回試して頂いた結果と共に
まとめてHSPの特性を書き出してみようと思っています☆

osakanaさんの環境でも、x=0 の方が早いんですね〜♪
もうちょっと考えを拡張して、裏技的なことを見つけられたらいいんですが(^^;

マクロとの処理比較も、
マクロ元を考慮してなんらかの成果(・・・おおげさですが)を
出してみようと頑張ってます。もう少しお待ちくらさいww

#

APIを直接利用すると、常にredrawが付きまとうんですね。
ちょっと面倒だったりしますね〜。

バッファ画面のhDCは、分かったりはしないんですか?
それが分かると色々できそうです。
まだそれほど調べてないので、時間が空き次第、探してみます☆

>恐るべしredraw!
確かにっ♪
ただ、naznyarkさんのメッセージを読む限り、
「redrawが」というより「仮想画面が」、高速な描画を実現しているようですね。
かなり奥が深いですね〜(^^¥
ベンチマーク・解説、どうもありがとうございますm(_ _)m

#
>スレッドの許容範囲のほうが
(爆)容量制限・・あるんですかね・・?
もしアレだったら新しいのへ以降!ですね。
まだ色々と雑談して貰えるなら・・(^^



りさ

リンク

2006/9/19(Tue) 05:19:58|NO.2504

>>解放したほうが
>注意します

ふと思ったのですが、
何で動的メモリは解放をした方がいいのでしょうか。

というのも、HSP3.0自体には、
解放という概念がないように思えるからです(^^;

exist "data.ext" if strsize { sdim info,strsize ・・・処理・・・ }

として、動的にメモリを確保しても、解放はできません。
(不必要になっても、sdim info,0 でも解放出来なかった気が・・・☆)

1.このようなケース
2.DLLの hspmalloc のケース
3.例えば、APIの SetTimer関数を使用し、KillTimer関数を呼び出さないケース

などでは、どのようなデメリットが起こるのでしょうか?

解放することにより処理量(ほんの少しですが)が増えるのと、
とにかく解放するのと、どちらがいいのでしょうか( ̄v ̄??

>// mallocで確保されたメモリは持続性がある。
>// プログラム終了時か明示的にプログラマが解放しない限り存在し続ける。

という解説があったのですが、プログラム終了時に解放されるので、
解放というのは、プログラム実行時だけの、
メモリ節約(?)であると考えてます(゜w゜;

>// 640×480の画面を1つ作ると
>// dim a,1000000 と同じくらいのメモリを消費します

と昔教えて頂いたのですが、
今回のような微量のデータでも解放される方のほうが多いのでしょうか?



naznyark

リンク

2006/9/20(Wed) 02:06:35|NO.2515

> というのも、HSP3.0自体には、
> 解放という概念がないように思えるからです(^^;

> (不必要になっても、sdim info,0 でも解放出来なかった気が・・・☆)

HSP ではスクリプト上での明示的なメモリ解放という概念こそありませんが
内部では変数の型変換時など多くの局面でメモリの動的確保・解放が行われています。

例えば sdim s, 256 と実行すると 256バイト分のメモリが動的に確保されます。
その後に sdim s, 64 とすると先ほど確保された 256バイト分の領域は解放され、
新たに 64バイト分のメモリが動的に確保されます。
さらにその後に s=100 と変数の型変換を行った場合は 64バイト分の領域は解放され
4バイト(整数型の大きさ)分のメモリが動的に確保されます。
(このままプログラムが終了すればこの 4バイト分のメモリは終了時に解放されます。)


> 今回のような微量のデータでも

実行される度に 1バイトのメモリを確保するが実行後でも解放はしない命令があったとします。
この命令を数億回、数兆回と実行するプログラムがあったとしたらどういうことになるでしょうか?
(実験用や自分専用のプログラムなら甘い作りでもかまいませんが、
他人が使う実用品を作るつもりなら自分に都合のいい勝手な考え方はできるだけ避けるべきです。)
(今回の場合には神経質すぎる考え方のようにも感じますが、大局的な視点を持つのは大切です。)



りさ

リンク

2006/9/20(Wed) 03:04:45|NO.2516

>メモリの動的確保・解放が行われています
そうだったんですかぁm(_ _)m
解放されないっていうのは、HSP2.xまでの話だったのかもしれません(^^;
どっかで聞いた筈で、そのままかと思ってましたっ(><

>他人が使う実用品を作るつもりなら
確かにそうかもしれませんw
いい勉強になりました☆

>数億回、数兆回と実行するプログラム
実はあたしは、
同じ関数(命令)ならば、内部で使っている変数も同じなのかと思っていました!
それが、何度も使用されるのではなくて、
何度も新しいメモリ確保が行われてしまうのですね〜。誤解していました(^^;

それならば、NO.2436 のようなものは、
5回実行したら、使っているメモリ×5が消費されるわけで、
それは自分で使うにしても困ったものですね♪

naznyarkさん、ありがとうございます。
確保したメモリは必ず解放するように、癖をつけたいと思います(^w^/



hiro

リンク

2006/9/23(Sat) 10:09:55|NO.2567

> それならば、NO.2436 のようなものは、
void msgbox( void ) でしょうか?(C言語?)
それなら、変数は関数を抜けた時に開放されてると思います。



kz3

リンク

2006/9/23(Sat) 10:59:00|NO.2569

>それなら、変数は関数を抜けた時に開放されてると思います。

論外ですよ...。

; No.2436 void msgbox( void ) { HWND hwnd; /* 省略 */ text = hspmalloc( lstrlen( sprm ) + 1 ); // ここが論点です。 /* 省略 */ }

naznyarkさんの指摘は、単純に「解放していない」ことを問題視しているわけじゃなくて、
このmsgbox()関数が何回も呼ばれるたびに新しい領域を確保して、
それまで確保していた領域のことはほったらかしにしていることを問題視していた、と思います。

だから別に関数終了時に絶対に解放しなきゃいけない、なんてことはないです。
既存の領域で足りるなら再利用し、足りないときだけ古い領域を開放して新規確保でもいいです。
その場合はどこで解放させるのかということを注意してください。

# HSP開発wikiには解説入れておいたんだけどなぁ...
# もう終わったスレッド(?)ですが...



りさ

リンク

2006/9/23(Sat) 11:10:40|NO.2570

hiroさん、kz3さん、ありがとうございます☆

>それまで確保していた領域のことはほったらかしに

その通りなんです。
一番の問題は、あたしが、「繰り返し呼ばれても、同じ領域が使用されている」
と思い込んでいたことなんです(><

>多くの局面でメモリの動的確保・解放が行われています
ということは、もしかして、

repeat nLoop sdim string, 255 ;処理 loop
というような場合も、確保・解放が行われているってことになるんでしょうか?

これが長いループだった場合は、解放なしには無理ですね・・・(怖)

#

解放っていう概念が養われていない分、とても不安になってしまいます・・・

そういう意味でも、HSPは手軽です。

ウィンドウがどうとか、メッセージがどうとか、型がどうとか、
宣言がどうとか、解放がどうとか、コンパイラがどうとか、(続)

全く、意識させないでプログラミングをさせて貰っています。

#

今、いい勉強になるかなぁ、と色々な作業の合間に、
HSPをC++のコンパイラでコンパイルできないかな・・・と企んでいます(^^;

色々方法を考えているのですが、・・・なかなか難しいもんです☆

HSPの命令と等価なものを作り、
HSPファイルを読み込みながら、それを置き換えるというのが、
今一番有力なんですがww 無理ですかね〜(^^?
駄目もとで挑戦しています(笑)

ps:
皆様のおかげで色々なことができるようになったので、
何かしらを公開したいんですよねっ。

アドバイスを引数に、作ったものを返す関数みたいな(^^/
さすがにvoid型にはなりたくないので(笑)



hiro

リンク

2006/9/23(Sat) 14:20:30|NO.2573

> naznyarkさんの指摘は
これについては同意です。

ですが、別の意で言ったつもりですが

>論外ですよ...。

とのkz3さんの発言で言い失せました。

確かに論外ですね、失礼いたしました。



りさ

リンク

2006/9/24(Sun) 11:13:24|NO.2593

>失礼いたしました
そんなことないです〜よ(^^

ちょっと疑問に思ったことがあります

[ HSP開発wiki / make hpi / cpp / chap.6 ]
http://hspwiki.nm.land.to/?MakeHPI%2Fcpp%2Fchapter6

を読んで、色々勉強させて頂いてたんですが、
これはHSPの領域からかなり遠いのではないか・・と思います(^^

変な意味じゃないです☆
ただ、ここまでできる方々が多くいらっしゃって、スゴ過ぎる・・
と感動することしかできないのです( ̄▽ ̄!

それでもHSPを愛用されているのですよね。
よかったら理由を教えて頂きたいなぁ・・と。(゜∧゜?

あたしは、質問内容からとか分かると思うんですが、
C言語も満足にできませんし、Windowsプログラミングも簡単なものしか作れません。

もしかしたら、ある意味の「繋ぎ」なのかもしれません。
いい意味では、「きっかけ」で「楽しみ」で「教科書」です☆

ですが、Cで同じようなことが出来るようになったら・・・
HSPをやめることはないですが、使う機会も減ると思います(><;
実際には分かりませんが。

なので、先輩方の意見を聞かせて貰えませんでしょうか?
どんなことでも(感想でも独り言でもなんでも)いいんで、おねがいしますm(_ _)m



naznyark

リンク

2006/9/27(Wed) 02:12:34|NO.2660

> それでもHSPを愛用されているのですよね。
> よかったら理由を教えて頂きたいなぁ・・と。

私の場合は大雑把に言えば「HSP が好きだから」が理由です。

さらにもっともらしい別の理由を加えるならば
"HSPシステムドキュメント・インストールガイド (hsp3.htm) " 内の
『●作者より』に書かれているおにたまさんの考え方に共感する所があるから、
というのも理由のひとつになります。



りさ

リンク

2006/10/3(Tue) 02:54:33|NO.2819

naznyarkさん、どうもありがとうございます。

>私の場合は大雑把に言えば「HSP が好きだから」が理由です。
>共感する所があるから

HSPが好き。あたしも好きデス☆
シンプルな一言ですけど、なんか感動しまふ(T_ヾ

「HSPが目指したものは、オールドスタイルなパソコンのシステムです。 」

こういうことが書いてあるってことすら忘れてました(^^;

これがHSPの目標だったんですね〜
ちょっと意外です☆

こんなにHSPユーザーさんが居るってことは、
おにたまさんは当初の目標を実現できたってことかもしれませんね。



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