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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0207
うー多次元文字列型配列変数の保存10解決


うー

リンク

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にしても正常に読み込めるようにしたいということです。



ANTARES

リンク

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

に変えても読み込めるようにしたいということです。

書き込む際はどこまでデータが入っているかに応じてどれくらいの大きさの配列変数にするかを自動で決定する予定なので、読み込む側も自動で大きさを判定したいということです。



ANTARES

リンク

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さまには一応見苦しくも言い訳を。



ANTARES

リンク

2010/2/14(Sun) 04:18:38|NO.30595

>whileについてののスレッドは思っていることをうまく言葉にできず
>心苦しくも放置してしまっております。
 私の中では終わった話題ですが、そうでなかったとしても
別に気にする必要はありません。
 放置されたスレッドは忘れ去りますが、
1年後にレスがついたとしても、内容によっては翌日であるかのように
レスするでしょう。それぞれの事情があるので、そんなことを
気にしてたら、掲示板なんてやってられません。



うー

リンク

2010/2/15(Mon) 23:54:21|NO.30637

>>玄冬さま

ありがとうございました。



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