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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0711
SqOc文字列を増やす&追加、抜き取り13解決


SqOc

リンク

2015/7/11(Sat) 01:10:40|NO.70033


data="0123456789" data= strtrim(data, 3, '1')//dataから1をとる data="1"+data//dataに1をつける //↑data="1023456789"になる mes data//"1023456789" //一文字ずつ表示 repeat 10,0 datspl=strmid(data, cnt, 1) mes ""+datspl+"" loop
このプログラムだと

data="0123456789"
で、

data= strtrim(data, 3, '1')//dataから1をとる data="1"+data//dataに1をつける
の操作が、0~9間でしか使えず、僕のゲームではもっとたくさんの数で使いたいのですが、
たとえば、

data="0,1,2,3,4,5,6,7,8,9,10,11,12,13"
みたいにして、一番上のプログラムと同じ動作ができるようにはできませんか?
dataからたとえば12をぬいたら

data="0,1,2,3,4,5,6,7,8,9,10,11,13"
12を追加したら

data="12,0,1,2,3,4,5,6,7,8,9,10,11,13"
見たいにできるようにもしたいです。

いろいろ多くてすいません!!
よろしくお願いします!!



この記事に返信する


可憐

リンク

2015/7/11(Sat) 02:00:54|NO.70034

適当ですがこんな感じでいいですか?


data="0,1,2,3,4,5,6,7,8,9,10,11,12,13" : Character="12," mes "【元の文字列】\n"+data strrep data,Character,"" // 12, ←これに相当する文字列を削除する mes "\n【12だけを抜いたら】\n"+data mes "\n【12を追加する】\n"+Character+data



SqOc

リンク

2015/7/11(Sat) 02:32:14|NO.70035

おお!!
夜中なのに返答ありがとうございます!!
(夜行性なのでorzww)
後ほどためさせていただきます!!



SqOc

リンク

2015/7/11(Sat) 21:08:57|NO.70055

12を抜くのには成功したのですが、

//一文字ずつ表示 repeat 10,0 datspl=strmid(data, cnt, 1) mes ""+datspl+"" loop
のところが

//一文字ずつ表示 repeat 10,0 datspl=strmid(data, 2*cnt, 1) mes ""+datspl+"" loop
とかにして、取得する位置を変えても、10,11,12,13が二桁なので、
うまくし得できなくて、
結果的には、

data="0,1,2,3,4,5,6,7,8,9,10,11,12,13"
だったら

0
1
2
3
4
5
6
7
8
9
10
11
12
13

というかんじに表示させたいのですが、、、
対処法を教えてください!!



kanamaru

リンク

2015/7/11(Sat) 21:44:51|NO.70056

strrepで,を¥n(¥は半角)に置き換えればいけると思います。



窓月らら

リンク

2015/7/11(Sat) 21:47:25|NO.70057

表示だけなら上記で書かれてるようにstrrepで改行に置き換えるだけ。
またはこんな方法もある。

//一文字ずつ表示 strtmp="" // 文字列型にしておく i=strlen(data)+1 // 文字個数(バイト数) repeat i,0 // 文字列の先頭から1バイトずつアスキーコードを取得 asc=peek(data,cnt) // アスキーコードを元に判定する // ','または文字列の最後なら strtmp を表示後リセット // そうでなければ、strtmp に文字を追加していく // asc-48の-48は、アスキーコード表を見れば意味がわかります if asc=',' | cnt=i-1 { mes strtmp: strtmp="" } else { strtmp+=str(asc-48) } loop



窓月らら

リンク

2015/7/11(Sat) 22:01:52|NO.70058

これのがよかった。

//一文字ずつ表示 strtmp="" // 文字列型にしておく i=strlen(data) // 文字個数(バイト数) repeat i+1,0 // 文字列の先頭から1バイトずつアスキーコードを取得 asc=peek(data,cnt) // アスキーコードを元に判定する // ','または文字列の最後なら strtmp を表示後リセット // そうでなければ、strtmp に文字を追加していく // asc-48の-48は、アスキーコード表を見れば意味がわかります if asc=',' | cnt=i { mes strtmp: strtmp="" } else { strtmp+=str(asc-48) } loop



Humi/BassClef

リンク

2015/7/12(Sun) 15:15:37|NO.70065

HSP34(だったかな)には split という文字列で文字列を分割する命令があってそれが便利です。
こういうのは一度配列にしてしまうと扱いが楽ですよね……
文字列のままだと何回も変換することになりますし。
参考程度にどうぞ
※そのままだと動作しないです array.as はここの as集 に含まれてます。
http://hsp.tv/play/pforum.php?mode=all&num=69992


#define global INT_MAX 0x7FFFFFFF #include "array.as" font msgothic, 12 data = "0,1,2,3,4,5,6,7,8,9,10,11,12,13" mes "data = {"+data+"}" split data, ",", prm // data を , で分割して prm に入れる mes "配列の個数" + length(prm) repeat length(prm) // とりあえず全部表示 mes prm.cnt loop array_delete prm, 12, 1 // 配列 prm から要素番号 12(prm.12) から 1 つ(prm.12のみ)削除する array_delete prm, 5, 2 // 配列 prm から要素番号 5(prm.5) から 2 つ(prm.5とprm.6)削除する mes "配列の個数" + length(prm) repeat length(prm) // 5,6,12 が抜かれて表示される mes prm.cnt loop // 先頭に 12 を追加 array_unshiftprm prm, "12" // 注意、prmは文字列の配列なので 12 をそのまま渡すと変換されて 12 だけになります data = array_join(",", prm) // 文字列 , で区切って再び prm の要素を連結する mes "data = {"+data+"}" // 「data = {12,0,1,2,3,4,7,8,9,10,11,13}」 と表示される

asは 普段hspファイルを置いているディレクトリ か C:\hsp3x\common にコピーしてくださいな
動作がきになったら中を見てみてください。

これは余談ですけど、HSP って配列関係の操作命令が少ないですよね……
変数関連は自分で勉強してくれってことなんですかね?
classも構造体も使えないし……



SqOc

リンク

2015/7/12(Sun) 15:32:03|NO.70067

こんなにたくさんありがとうございます!!
解決しました!!

あと少し追加で質問があるのですが、新しいログを立てたほうがいいっぽいので
よろしくお願いします!!



kanamaru

リンク

2015/7/12(Sun) 16:37:02|NO.70071

Humi/BassClefさん、ふと思ったんですけど何もarray.asやsplit使わなくてもその方法、
簡単になりますよ。
strrepで,を¥nに置き換えて、
noteselで使うんです。
そうすればnotedelとかで処理が簡単にできます。
配列に変換してないし、処理速度も速いと思います。
note系命令で処理が終わったら¥nを,に戻せば出来ると思います。
文字列操作をする時に結構使える方法です。



Humi/BassClef

リンク

2015/7/12(Sun) 19:43:13|NO.70073

解決されてますけど、一応お返事を。
>kanamaruさん
>Humi/BassClefさん、ふと思ったんですけど何もarray.asやsplit使わなくてもその方法、簡単になりますよ。
そうですね、、少し、自分の環境に頼りすぎていたかもしれません。
配列にする癖が付いてしまいました。申し訳ないです。

>配列に変換してないし、処理速度も速いと思います。
コンマと改行の置換は速度に影響がないのでしょうか?
またnote系は大きな文字列をそのまま扱っていますけど本当に早いのでしょうか?

動作を整理してみてください、あまりやっていることは変わりません。
文字列
1.strrepでコンマを改行に変える
3.note系 などで処理
4.strrepで再び改行をコンマに変える

配列
1.splitでコンマで配列にする
2.配列を操作する
3.配列を再び文字列に戻す

また速度面でも、私にはsplitでコンマを使って配列に分けるより、
コンマを改行に置き換えるほうが遅くなりそうな気がするのですけど、どうでしょうか?
単純なアクセス速度でも配列の方が速いと思います。

#define global INT_MAX 0x7FFFFFFF #include "array.as" sdim prm // 20000個代入 repeat 20000 prm.cnt = str(cnt) loop // 単純な読み取り logmes "配列の個数" + length(prm) repeat length(prm) logmes ""+prm.cnt loop // 5000番目から10000個削除 array_delete prm, 5000, 10000 // 確認 logmes "配列の個数" + length(prm) repeat length(prm) logmes ""+prm.cnt loop


sdim prm notesel prm // 20000個代入 repeat 20000 noteadd str(cnt), -1 loop // 単純な読み取り logmes "配列の個数" + notemax repeat notemax noteget buf, cnt logmes ""+buf loop // 5000番目から10000個削除 repeat 10000 notedel 5000 loop // 確認 logmes "配列の個数" + notemax repeat notemax noteget buf, cnt logmes ""+buf loop
そんな事を思い、HSPにはもう少し配列操作系を増やしたら色々と楽になるのではないかと思ってました。

スレ内容にあまり関係のない長文失礼致しました。



kanamaru

リンク

2015/7/12(Sun) 19:54:24|NO.70075

無駄にモジュールとか使うよりも、
標準命令にあるので代用した方が処理は速いと考えたのですが
変わらないのかな?
誰か速度比べてくれませんか?
速度比べるプログラムの作り方がわからず…。



Humi/BassClef

リンク

2015/7/12(Sun) 20:14:23|NO.70079

私の環境では16s位誤差がありました。

#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #define global INT_MAX 0x7FFFFFFF #include "array.as" sdim prm time = timeGetTime() // 20000個代入 repeat 20000 prm.cnt = str(cnt) loop // 単純な読み取り logmes "配列の個数" + length(prm) repeat length(prm) logmes ""+prm.cnt loop // 5000番目から10000個削除 array_delete prm, 5000, 10000 // 確認 logmes "配列の個数" + length(prm) repeat length(prm) logmes ""+prm.cnt loop time = timeGetTime()-time mes strf("%ds %dms", time/1000, time\1000) time = timeGetTime() sdim prm notesel prm // 20000個代入 repeat 20000 noteadd str(cnt), -1 loop // 単純な読み取り logmes "配列の個数" + notemax repeat notemax noteget buf, cnt logmes ""+buf loop // 5000番目から10000個削除 repeat 10000 notedel 5000 loop // 確認 logmes "配列の個数" + notemax repeat notemax noteget buf, cnt logmes ""+buf loop time = timeGetTime()-time mes strf("%ds %dms", time/1000, time\1000)



Humi/BassClef

リンク

2015/7/12(Sun) 20:44:40|NO.70081

>kanamaruさん
array.as の中身一度確認してみましたでしょうか?
array.as が効率的だとはいいませんが、標準命令しか使っていません。
でも、私が作成したものは大抵欠陥があるのでw、HSP本体にあればなぁと思った次第です。



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