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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0601
にゃんちゃん文字列の途中に開業挿入2解決


にゃんちゃん

リンク

2014/6/1(Sun) 19:57:02|NO.62270

こんにちは。
文字列の特定の位置に開業コードを挿入したいのですが、処理の早い方法を探しています。
挿入する開業コードの位置は自動計算していて、あとはその指定位置に開業コードを追加できれば解決と言う所まで来ています。
最初は、指定した場所とその次にCRとLFを挿入すればよいと思ったのですが、pokeを使うと前あった文字コードが上書きで消えてしまうので、仕方なく下のようなモジュールを書きました。
もし、タイトルのようなことを達成するのに、これよりも煩雑にならないアルゴリズムがあればお教えください。よろしくお願いします。

;文字列追加挿入のテスト ;指定した位置を基準に、前→追加文字列→残りの順に展開して返す。 #module test #defcfunc add_string var target, str addSTR, int index return strmid(target,0,index)+addSTR+strmid(target,index,strlen(target)-index) #global a="あいうえおかきくけこ" dialog add_string(a,"\n",10) end



この記事に返信する


FunnyMaker

リンク

2014/6/1(Sun) 23:27:47|NO.62275

改行するだけでいいんですよね?
それならばということで、memcopyを使ってみました。処理時間は約半分になります。

ただし、ターゲットの後方に2バイトの空き領域が必要です。


#module mod1 #defcfunc add_string var target, str addSTR, int index return strmid(target,0,index)+addSTR+strmid(target,index,strlen(target)-index) #global #module mod2 ;※targetの後方に2バイトの余裕が必要。 #deffunc BreakLine var target ,int index memcpy target,target ,strlen(target)-index ,index+2 ,index ;後半部分を後ろにスライド。 wpoke target ,index ,2573 ;改行コード (13,10) = (2573) を入れる。 return #global #uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" ;計時API *main num_rep = 100000 mes "repeat : "+num_rep+"" t0 = timeGetTime() repeat num_rep a="あいうえおかきくけこ" a = add_string(a,"\n",10) loop t1 = timeGetTime() mes "Method1 took "+str(t1-t0)+" ms." t0 = timeGetTime() repeat num_rep b = "あいうえおかきくけこ" BreakLine b,10 loop t1 = timeGetTime() mes "Method2 took "+str(t1-t0)+" ms."



にゃんちゃん

リンク

2014/6/2(Mon) 00:19:10|NO.62276

ご回答ありがとうございます。
何度かテストしてみたところ、確かに処理時間が半分ぐらいになっていました。
memcpyでずらして高速コピー、ぜんぜん思いつきませんでした。とても参考になりました。
この方法で解決とさせていただきます。ありがとうございました。



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