|
|
2010/2/7(Sun) 20:58:15|NO.30475
こんばんは。文字列型配列変数の保存について質問します。
arraysaveだと1次元配列のみしか保存できませんよね?
2次元の文字列型配列変数を保存したいのですが、どのようにすればいいでしょうか?
|
|
2010/2/7(Sun) 23:16:42|NO.30478
用途により変わります。単にhspで変数として読み書きできれば良いのであれば↓で済みます
#include "hspda.as"
sdim array_test, ,3,3
array_test(0,0) = "a","b","c"
array_test(0,1) = "d","e","f"
array_test(0,2) = "g","h","i"
vsave_start
vsave_put array_test
vsave_end "test.log"
vload_start "test.log"
vload_get array_test
vload_end
foreach array_test//試し書き
mes array_test(0,cnt)+array_test(1,cnt)+array_test(2,cnt)
loop
テキストファイルに書き出すのなら、どういう形式に書き出したいのかによります。
例えば2次元目を行、1次元目を列にしたカンマ区切りの行列でよければ↓でできるかと思われます。
#include "hsp3util.as"
sdim array_test, ,3,3
array_test(0,0) = "a","b","c"
array_test(0,1) = "d","e","f"
array_test(0,2) = "g","h","i"
sdim array_save
foreach array_test
array_save(cnt) = array_test(0,cnt) + "," + array_test(1,cnt) + "," + array_test(2,cnt)
loop
arraysave "test.txt", array_save
notesel var_load
arrayload "test.txt",array_temp
sdim array_test2, ,3,3
foreach array_temp
split array_temp(cnt), ",", array_temp2
var_n = cnt
foreach array_temp2
array_test2(cnt,var_n) = array_temp2(cnt)
loop
loop
foreach array_test2//試し書き
mes array_test2(0,cnt)+array_test2(1,cnt)+array_test2(2,cnt)
loop
| |
|
2010/2/8(Mon) 22:28:11|NO.30488
>>玄冬さま
回答ありがとうございます。
カンマ区切りで作ろうと思っていますが、行と列が常に一定じゃない場合はどうすればいいでしょうか?
|
|
2010/2/9(Tue) 00:21:31|NO.30491
2パターン作ってみました。こういうことでしょうか?
やっていることはどちらも","で繋いで2次元配列を1次元配列にしてarraysaveしているだけです。
*test2はhsp3utill.asのソースを参考にしてみました。
*test1と*test2どっちが処理が早いとかはわからないです。
あとソース中 "repeat length(配列)"で書いているところは、"foreach 配列"と同じ処理ですので、お好みで書き換えて下さい。
#include "hsp3util.as"
sdim array_test, ,3,3
array_test(0,0) = "a","b","c"
array_test(0,1) = "d","e","f"
array_test(0,2) = "g","h","i"
sdim array_save
gosub *test2
// gosub *test1
arraysave "test.txt", array_save
stop
*test1
repeat length(array_test)
var_cnt = cnt
repeat length2(array_test)
array_save(var_cnt) += array_test(cnt, var_cnt) + ","
loop
array_save(var_cnt) = strmid(array_save(var_cnt), 0, strlen(array_save(var_cnt))-1) //最後カンマが一個多いので削る。
loop
return
*test2 //hsp3utill.asのarray2noteを参考にしてみました
sdim array_save
repeat length(array_test)
var_cnt = cnt
var_index = 0
repeat length2(array_test)
poke array_save(var_cnt), var_index, array_test(cnt, var_cnt)
var_index += strsize
poke array_save(var_cnt), var_index, ","
var_index += strsize
loop
poke array_save(var_cnt), var_index-1, "" //最後カンマが一個多いので削る
loop
return
| |
|
2010/2/11(Thu) 21:15:47|NO.30535
>>玄冬さま
解釈が違うみたいなので、詳しく説明します。
たとえば3×3のデータを作成したあと、ほかのPCの同じプログラムやメモ帳などで変更して4×4や2×2にしても正常に読み込めるようにしたいということです。
|
|
2010/2/12(Fri) 03:51:48|NO.30544
>たとえば3×3のデータを作成したあと、ほかのPCの同じプログラムや
>メモ帳などで変更して4×4や2×2にしても正常に読み込めるように
>したいということです。
3×3のデータを2×2に読み込むのは不可能です。
それがわからないようなら、はっきり言ってあなたはプログラミングには
不向きです。HSPのことなんか忘れてもっと楽しいことをやりましょう。
わかってて書いているのなら、明らかに説明不足であり、
明白な説明不足のある質問は、まともに相手にされません。
3×3のデータを4×4に読み込むには3個読んだらその行の処理を
やめればいいです。
こんな簡単なこと、聞かなきゃわかりませんか?
これだけヒントをもらっても解決しないということは、
質問というよりスクリプト作成依頼と言うべきでしょう。
|
|
2010/2/12(Fri) 12:15:59|NO.30548
>>ANTARESさま
いやそいうことではなくて……。
たとえば,で区切った3×3のデータがありますよね?
a,b,c
d,e,f
g,h,i
このデータを変更して
a,b,c,d
e,f,g,h
i,j,k,l
m,n,o,p
とか
a,b
c,d
に変えても読み込めるようにしたいということです。
書き込む際はどこまでデータが入っているかに応じてどれくらいの大きさの配列変数にするかを自動で決定する予定なので、読み込む側も自動で大きさを判定したいということです。
|
|
2010/2/13(Sat) 00:18:42|NO.30566
うーさんがどこまでできるのか見せてください。
それによっては答えてもいいです。
> これだけヒントをもらっても解決しないということは、
>質問というよりスクリプト作成依頼と言うべきでしょう。
この評価が変わらなければレスしませんので、あしからず。
|
|
2010/2/13(Sat) 03:08:51|NO.30572
あら、忙しくて数日この掲示板を見ていなかったら、なんだかレスが増えている!
意外と意地悪なんですねANTARESさんって(笑)(むしろそれが大人の優しさでしょうかね)
>>解釈が違うみたいなので…
私はてっきりEXCELなどで編集したCSVの内容を見れるヴューアのようなものでも作るんだろうと思っていましたが、確かに若干解釈が違ったようですね。
読み込みに関しては、最初から不定行列に対応した読み込みにしてあるんですが、書き込みに関して、最初に示したスクリプトでは固定長になっていたので、可変長の行列を読み込むスクリプトを2度目の回答で示しています…
つもりでしたが、どうやら私が書いたスクリプトの*test1、*test2どちらも"repeat length(array_save)"と"repeat length2(array_save)"の位置が逆さになっていて縦横の長さが違うとエラーになりますねコレ…(たまたま3×3で試してたので気付きませんでした)
申し訳ない。
後、さらに自分で書いといて何なんですが、1つ目の回答のカンマ区切りの方のスクリプト内のnotesel var_loadって完全に不要ですよね。
しかも、ロードとセーブで参考にするレスが違うのもわかりにくい原因の一つですね。
というわけで、先の私の2回の回答を修正して以下にまとめてみました。
#include "hsp3util.as"
sdim array_test, ,5,2
array_test(0,0) = "a","3","c","d","3"
array_test(0,1) = "1","g","h","3","j"
//書き込み
sdim array_save
gosub *sub_save1 //または gosub *sub_save2どちらを使うかはお好みで。
arraysave "test.txt", array_save
//読み込み
var_m = 5 //読み込む列数
var_n = 2 //読み込む行数
sdim array_load, ,var_m, var_n
gosub *sub_load
//試し書き
repeat length2(array_load)
var_str = ""
var_cnt = cnt
repeat length(array_load)
var_str += array_load(cnt, var_cnt)
loop
mes var_str
loop
stop
*sub_save1
repeat length2(array_test)
var_cnt = cnt
repeat length(array_test)
array_save(var_cnt) += array_test(cnt, var_cnt) + ","
loop
array_save(cnt) = strmid(array_save(cnt), 0, strlen(array_save(var_cnt))-1) //最後カンマが一個多いので削る。
loop
return
*sub_save2 //hsp3utill.asのarray2noteを参考にしてみました
repeat length2(array_test)
var_cnt = cnt
var_index = 0
repeat length(array_test)
poke array_save(var_cnt), var_index, array_test(cnt, var_cnt)
var_index += strsize
poke array_save(var_cnt), var_index, ","
var_index += strsize
loop
poke array_save(var_cnt), var_index-1, "" //最後カンマが一個多いので削る
loop
return
*sub_load
arrayload "test.txt",array_temp
foreach array_temp
split array_temp(cnt), ",", array_temp2
var_cnt = cnt
foreach array_temp2
array_load(cnt,var_cnt) = array_temp2(cnt)
loop
loop
return
いかがでしょう?上記のミスを修正して前2回の回答をまとめただけですが。(まとめるに当たり一部変数名を変更はしています。)
var_mとvar_nをどうやって自動的に取得するようにするかはどのようなプログラムかによりますし、質問の趣旨からは外れると思いますのでご自分でお考え下さい。
まだ、何か解釈の異なる点がございましたら、お気軽に仰って下さい。
>>ANTARESさまへ私信
whileについてののスレッドは思っていることをうまく言葉にできず心苦しくも放置してしまっております。数日中にはなんとかしようと思います。
ここで書くことではないのは重々承知していますが、未解決の質問スレッドの立て主が他人様の質問におこがましくも回答していることが後ろめたかったので、主な回答者であられたANTARESさまには一応見苦しくも言い訳を。
| |
|
2010/2/14(Sun) 04:18:38|NO.30595
>whileについてののスレッドは思っていることをうまく言葉にできず
>心苦しくも放置してしまっております。
私の中では終わった話題ですが、そうでなかったとしても
別に気にする必要はありません。
放置されたスレッドは忘れ去りますが、
1年後にレスがついたとしても、内容によっては翌日であるかのように
レスするでしょう。それぞれの事情があるので、そんなことを
気にしてたら、掲示板なんてやってられません。
|
|
2010/2/15(Mon) 23:54:21|NO.30637
>>玄冬さま
ありがとうございました。
|
|