|
|
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
|
|
2015/7/11(Sat) 02:32:14|NO.70035
おお!!
夜中なのに返答ありがとうございます!!
(夜行性なのでorzww)
後ほどためさせていただきます!!
|
|
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
というかんじに表示させたいのですが、、、
対処法を教えてください!!
|
|
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
|
|
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も構造体も使えないし……
| |
|
2015/7/12(Sun) 15:32:03|NO.70067
こんなにたくさんありがとうございます!!
解決しました!!
あと少し追加で質問があるのですが、新しいログを立てたほうがいいっぽいので
よろしくお願いします!!
|
|
2015/7/12(Sun) 16:37:02|NO.70071
Humi/BassClefさん、ふと思ったんですけど何もarray.asやsplit使わなくてもその方法、
簡単になりますよ。
strrepで,を¥nに置き換えて、
noteselで使うんです。
そうすればnotedelとかで処理が簡単にできます。
配列に変換してないし、処理速度も速いと思います。
note系命令で処理が終わったら¥nを,に戻せば出来ると思います。
文字列操作をする時に結構使える方法です。
|
|
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にはもう少し配列操作系を増やしたら色々と楽になるのではないかと思ってました。
スレ内容にあまり関係のない長文失礼致しました。
| |
|
2015/7/12(Sun) 19:54:24|NO.70075
無駄にモジュールとか使うよりも、
標準命令にあるので代用した方が処理は速いと考えたのですが
変わらないのかな?
誰か速度比べてくれませんか?
速度比べるプログラムの作り方がわからず…。
|
|
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)
|
|
2015/7/12(Sun) 20:44:40|NO.70081
>kanamaruさん
array.as の中身一度確認してみましたでしょうか?
array.as が効率的だとはいいませんが、標準命令しか使っていません。
でも、私が作成したものは大抵欠陥があるのでw、HSP本体にあればなぁと思った次第です。
|
|