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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0930
(´ω`)メモリノートパッドでちょっと困ったこと13解決


(´ω`)

リンク

2015/9/30(Wed) 14:29:17|NO.72046

メモリノートパッド命令、すごく便利ですよね。
もうなんか、愛して止まないって感じで使ってるのですが、ひとつ困ったことが。

プログラム中で、メモリノートに指定できるのって1つだけですよね。
例えば、モジュール中でもメモリノート命令を駆使した場合、そのモジュールを呼ぶと
今まで指定していたメモリノートが切り替わってしまい、戻って以降の意図せぬ問題の
きっかけになってしまうのです。

で、メモリノートを複数使えるようにする方法か、もしくは現在メモリノート機能を使って
いるか判別して使っていればそれ用の変数をスタックするなどの方法がないかなあ、と。

よろしくお願いいたします。(´・ω・`)



この記事に返信する


スペース

リンク

2015/9/30(Wed) 15:06:49|NO.72047

memcpyとかどうでしょう?
モジュール内で使う分には多少使い勝手が悪くても大丈夫なんじゃないでしょうか?



mjhd

リンク

2015/9/30(Wed) 16:26:16|NO.72048

noteunselという命令を試してみましたか?
http://ohdl.hsproom.me/?q=noteunsel

スタックほど高機能ではないかもしれませんが…。



(´ω`)

リンク

2015/9/30(Wed) 17:07:00|NO.72049

え……

……noteselとnoteunselがそのまんま、スタック機能持ってたんか!(u ゚ω゚ )
noteunselは単なる解放命令だと思ってた!知らんかったああぁぁぁ…………



スペース氏のヒントを元にモジュールをカリカリと書いておりました所、
mjhd氏のドンピシャのお答えで書く必要もないじゃないのと気づきました。
ていうか、基本命令で勘違いして覚えてる事、まだまだありそうです。

ご両名ともに、有難うございました。
今後とも宜しくお願い申し上げます。(´・ω・`)



kanamaru

リンク

2015/9/30(Wed) 17:17:28|NO.72050

複数同時使用が可能になるモジュールを作ってみました。
動作確認はしてないので、使う際は、自己責任でお願いします。
モジュールを読み込むだけで、標準のメモリノートパッド命令が拡張されるはず。
標準と違うところは、第一パラにユニークIDを指定することと、
noteselがユニークID初期化命令になったことと、
操作した結果はnotestr関数で取得するようになったことだけです。

#module #define NOTE_MAX 30 #deffunc noteadd2 int ID1,str string,int index1,int mode notesel bafa(ID1) noteadd string,index1,mode noteunsel return #deffunc notedel2 int ID2,int index2 notesel bafa(ID2) notedel index2 noteunsel return #deffunc noteget2 int ID3,var v,int index3 notesel bafa(ID3) noteget v,index3 noteunsel return #deffunc noteload2 int ID4,str path1,int sizemax notesel bafa(ID4) noteload path1,sizemax noteunsel return #deffunc notesave2 int ID5,str path2 notesel bafa(ID5) notesave path2 noteunsel return #deffunc notesel2 int ID6 bafa(ID6)="" return #deffunc noteunsel2 int ID7 bafa(ID7)="" return #defcfunc noteinfo2 int ID8,int type notesel bafa(ID8) return noteinfo(type) noteunsel return #defcfunc notestr int ID return bafa(ID) return #global #undef noteadd #undef notedel #undef noteget #undef noteload #undef notesave #undef notesel #undef noteunsel #undef noteinfo #undef notemax #undef notesize #define noteadd noteadd2 #define notedel notedel2 #define noteget noteget2 #define noteload noteload2 #define notesave notesave2 #define notesel notesel2 #define noteunsel noteunsel2 #define noteinfo noteinfo2 #define notemax noteinfo(0) #define notesize noteinfo(1)



y.tack

リンク

2015/9/30(Wed) 17:23:02|NO.72051

hsp3utilの
array2note note2array はどうですか?
普段、配列で保持して
編集したい時だけaray2noteする。みたいな



tds12

リンク

2015/9/30(Wed) 17:24:17|NO.72052

>スタック機能持ってたんか!(u ゚ω゚ )
残念ながら、スタックではありません。
直前に選択していた変数が記憶されているだけで、
2つ前以前の記録は戻ってきません。

notesel a noteadd "Goodbye." notesel b noteadd "Thank you." notesel c noteadd "Hello." noteget d,0 mes d noteunsel noteget d,0 mes d noteunsel noteget d,0 mes d noteunsel



kanamaru

リンク

2015/9/30(Wed) 17:25:25|NO.72053

よく考えたらbafaの初期化してない。
モジュールに

#deffunc noteinit #define NOTE_MAX 300 sdim bafa(0),NOTE_MAX return
を追加して、
モジュールの最後に

noteinit
を追加してください。
ちなみに改造、再配布等はご自由にどうぞ



(´ω`)

リンク

2015/9/30(Wed) 18:09:41|NO.72054

>kanamaru氏

私は、専用バッファ1つ作ってヘッダで管理して、とクソややこくてバグ出まくりそうなのを
書いていましたが、note命令だけでめっちゃシンプルに実装されててお茶吹きました。
己の発想力の欠乏が恨めしい今日この頃です。(´・ω・`)

>y.tack氏

今ヘルプを見てますが、なるほど、こういう便利な命令もあるんですね……
split命令と組み合わせたら、巨大な配列を作らずとも高速に処理できるなあ。
なんかもう、勘違い以前に何も知らない気がしてきました。(´・ω・`)

>tds12氏

2段階までしか試さずに「スタック!(キリッ」と言うてました。
後日絶対にバグで悩むことになる勘違いを迅速にご指摘いただき、誠に感謝いたします。
先日といい今回といい、もはやtds12氏の方角に足を向けて寝られません。
とりあえず日本海へ向けて寝ます。(´;ω;`)



kanamaru

リンク

2015/9/30(Wed) 20:38:36|NO.72061

モジュールに不備が見つかったので、
修整版を明日投稿します。
実は、最新のベータ版では、
メモリノートパッド命令にnotefindというのが追加されています。
特定の文字列が含まれている行を調べる命令です。
対応させますか?
とりあえず、標準のnoteselとの互換性を持たせるための命令のnotevarは追加する予定です。



y.tack

リンク

2015/9/30(Wed) 22:03:19|NO.72064

>hsp3util
昔、このソース見たら割と簡単だったんで改造したんですよね
なので使ったことある命令です

(´ω`)さんもソースコードを改造してみるのもいいかもしれません

僕が回答するのは大体一回やったことある処理で
もちろんあんまり大きくカバーしてなくて
そういう意味でも
未経験な部分を経験したことがある人が
指摘するのは 有意義ですよね
大体、皆、どこかしら 処理してるでしょうし



kanamaru

リンク

2015/10/1(Thu) 08:18:32|NO.72074

昨日話した不備を修正しました。
もしファイルをファイルを読み込んでなかったらstatに-1を返すようにしました。
また、二つ命令を追加しました。
この二つはnotestrと同様、このモジュールオリジナル命令です。
一つ目は、notevar。標準のnoteselの第一パラにユニークIDを指定して使います。
この命令によって、変数の中身をメモリノートパッドで操作できると思います。
二つ目は、noteuse。ユニークIDを使っているか使っていないかを調べます。
使っていたら1、使ってなかったら0を返します。

#module #define NOTE_MAX 300 #deffunc noteinit sdim bafa,NOTE_MAX return #deffunc noteadd2 int ID1,str string,int index1,int mode if(bafa(ID1)="")and(bool(ID1)=0):return -1 notesel bafa(ID1) noteadd string,index1,mode noteunsel return #deffunc notedel2 int ID2,int index2 if(bafa(ID2)="")and(bool(ID2)=0):return -1 notesel bafa(ID2) notedel index2 noteunsel return #deffunc noteget2 int ID3,var v,int index3 if(bafa(ID3)="")and(bool(ID3)=0):return -1 notesel bafa(ID3) noteget v,index3 noteunsel return #deffunc noteload2 int ID4,str path1,int sizemax if(bafa(ID4)="")and(bool(ID4)=0):return -1 notesel bafa(ID4) noteload path1,sizemax noteunsel bool(ID4)=1 return #deffunc notesave2 int ID5,str path2 if(bafa(ID5)="")and(bool(ID5)=0):return -1 notesel bafa(ID5) notesave path2 noteunsel return #deffunc notesel2 int ID6 bafa(ID6)="" bool(ID6)=0 bool2(ID6)=1 return #deffunc noteunsel2 int ID7 bafa(ID7)="" bool(ID7)=0 bool2(ID7)=0 return #defcfunc noteinfo2 int ID8,int type if(bafa(ID8)="")and(bool(ID8)=0):return -1 notesel bafa(ID8) return noteinfo(type) noteunsel return #defcfunc notestr int ID return bafa(ID) return #deffunc notevar int ID9,var v2 notesel2 ID9 bafa(ID9)=v2 return #defcfunc noteuse int ID10 return bool2(ID10) #global #undef noteadd #undef notedel #undef noteget #undef noteload #undef notesave #undef notesel #undef noteunsel #undef noteinfo #undef notemax #undef notesize #define noteadd noteadd2 #define notedel notedel2 #define noteget noteget2 #define noteload noteload2 #define notesave notesave2 #define notesel notesel2 #define noteunsel noteunsel2 #define noteinfo noteinfo2 #define notemax noteinfo(0) #define notesize noteinfo(1) noteinit



osakana

リンク

2015/10/1(Thu) 11:50:39|NO.72075

たしかどっかに note 変数データあった様な?
と思って漁ってみたらやっぱりありました
これですね

HSPCTX:
PVal *note_pval; // MemNote pval
APTR note_aptr; // MemNote aptr
PVal *notep_pval; // MemNote pval (previous)
APTR notep_aptr; // MemNote aptr (previous)

notesel, noteunsel 命令でこれらの値がどう変化するかを見て
安直にこれを横取りしたりすげ替えたりしてやれば良さそうと思い
実際にやって見たら意外と簡単にできてしまいました。

以下は複数ネスト対応モジュールです。
notesel 時にポインタデータを自前スタックに移して、
noteunsel 時にそこから元に戻しています。
#今回は notesel で書き込まれた PVal, APTR を使用していますが
#ユーザー定義命令のパラメータから変数のそれを取得して書き込んでも出来ました
#その際の参考になるページ:http://wiki.hsp.moe/小ワザ/ポインタを使ってのあれこれ.html

// メモリーノートパッド命令の複数ネストに対応するモジュール #module mod_notex #undef notesel #undef noteunsel #const NOTE_INITSIZE 10 ; 初期配列サイズ #deffunc notesel var v mref hspctx, 68 if hspctx(202) = 0 :dim stack_note, 2, NOTE_INITSIZE notesel@hsp v stack_note(0, i) = hspctx(204), hspctx(205) i ++ return #deffunc noteunsel if i > 1 { i -- hspctx(204) = stack_note(0, i) hspctx(205) = stack_note(1, i) } noteunsel@hsp return #global
使い方は通常の note 命令と同じで既存の命令がそのまま使えます。

一応 HSP の、notesel をした後に noteunsel を何回実行しても
最後の一つは解除されないという仕様に沿っています。

それほどテストしてませんが一応は
>http://hsp.tv/play/pforum.php?mode=all&num=72046#72052
このレスのスクリプトで動きました。

まだまだ改善の余地がありそうですが、
適当に改造してみても面白いかもしれません。
何か問題が有ったら教えて下さい



mjhd

リンク

2015/10/1(Thu) 16:41:27|NO.72076

> osakanaさん
わっ、すごい…



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