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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0330
オクラ☆3次元配列変数 vsave でシステムエラー・・・11解決


オクラ☆

リンク

2015/3/30(Mon) 22:16:25|NO.68216

むりなんですかねぇ?DTMを作っていて、パートを分けてると3次元配列変数。モジュールはdsoundx.hpi 、fps拾得のため、d3m.hspを利用。授業中までま考えてここまできたのに・・・なきそう、、、だれかおしえてください!何でシステムエラーなんだ!?



この記事に返信する


GENKI

リンク

2015/3/31(Tue) 02:00:50|NO.68223

まずは一晩ぐっすり寝ましょう。バグは寝かせると解決しやすくなります。とても重要な差作業です。
すっきりしたらデバッグ開始です。

・エラーの症状の確認。
 エラーを再現できる操作方法などの条件の確認。(またエラーが出ない場合の条件。)
 エラーメッセージの内容の確認。

もうやってると思いますが、改めてもう一度やってみてください。
解決しなかったら次の対処へ。

・エラー行の特定。
 logmes、title、dialogなどを適当な箇所にいれてどこまで正常に動作しているかを確認して行き、絞り込む。
 想定している変数の内容のまま処理が進行しているかを確認。

これでもダメなら本格的にバグの原因調査に集中して下さい。簡単には回避できません。
スクリプトのコピーを作って次の対処へ。

・最小限の構成でエラーを再現するスクリプトを作る。
 不要箇所を消していって原因を絞り込んでいく。
 スクリプトがシンプルになれば原因が特定しやすくなります。

これでも原因が特定できない、挙動が納得出来ない場合…

・掲示板に書き込める程度の行数まで絞り込んで、この掲示板で聞いてみる。
 ここまで来ると「ヘルプの説明の解釈に誤解がある」か「HSPのバグ」か「うっかり勘違い」かだと思います。
 いずれにせよこの段階までくれば大抵は解決します。(もちろん上記の対処が全て実施済みという条件付きです。)



Okura☆

リンク

2015/3/31(Tue) 09:52:31|NO.68225

これですなんですが・・・


screen 0 #include "hspda.as" dim part,2056,50,256 dim vol1,2056,50,256 dim vol2,2056,50,256 dim viv1,2056,50,256 dim long,2056,50,256 dim last,2056,50,256 dialog "var",17,"DTM FILE" sfile = refstr if getpath(sfile,2) = "" :sfile = ".var" vsave sfile

これで保存すると、15行目(vsave sfile)にシステムエラーがでるんです・・・
確保しすぎ何でしょうか?
それとも、システムのメモリーが小さいのでしょうか・・・
一応、HSP3.32とHSP3.4bで試しましたがだめです。
Windows XP,WindowsVista,Windows 7ともにだめでした・・・

Genkiさんわざわざそんな遅い時間にお答えしてくださりありがとうございます・・・



Taddi

リンク

2015/3/31(Tue) 20:24:55|NO.68243

詳しいことは分かりませんが、
変数をコメントアウトしながら確認していくと、
4つ目でエラーが発生しています(3つまでは正常に保存される)

1つの変数を保存すると100MBずつデータ量が増えていきます。
データ量が大きすぎると思います。
仮にこの仕様でソフトを製作すると、1つデータを保存するごとに
約CD1枚分の容量が必要になります。仕様の見直しをお勧めします。



暇人

リンク

2015/3/31(Tue) 20:44:22|NO.68244

344Mまでは大丈夫だけど345Mでエラーが出る
bsaveだと400Mでもエラーにならないからvsaveに問題があるんだろう
vsaveの修正を待つか、少し手間は増えるがbsaveを使う



zakki

リンク

2015/3/31(Tue) 21:36:07|NO.68247

保存するデータを一度オンメモリに生成してからファイルにその内容を
書き出す実装なので、最低でも保存データの2倍(+α)のメモリを使いそうです

http://dev.onionsoft.net/trac/openhsp/browser/trunk/plugins/win32/hspda/Hspda.cpp#L1519
# 書き込み途中でのエラー発生時の挙動が変わって問題なければ逐次書き出すって
# 変更もありなんでしょうか

他命令についても言えますがHSPのだと数百MB単位のデータを扱うことはあまり考慮されていなくて
かなり注意深く使う命令とロジック選ばないときつい気がします。



オクラ☆

リンク

2015/3/31(Tue) 21:54:00|NO.68248

そうですか・・・みなさまたくさん回答ありがとうございます。上のソースのdim part,1000,50,256の1000,50はそこに音楽の譜面を打ってあって256は256パート分あらかじめ確保します。仕様はどう変えたらいいんでしょうか・・・。何回も質問すみません。



GENKI

リンク

2015/3/31(Tue) 23:31:13|NO.68253

2056 * 50 * 256 * 4 バイトなので約100Mバイトですか。
大きいですね。でも大きすぎるとまでは言えない大きさです。
マニュアル捜してもサイズ制限の項目無かったのでhspdaのバグでしょうか?

回避方法としては2ファイル以上に分ける方法が考えられます。
こんな感じ。

screen 0 #include "hspda.as" dim part,2056,50,256 dim vol1,2056,50,256 dim vol2,2056,50,256 dim viv1,2056,50,256 dim long,2056,50,256 dim last,2056,50,256 dialog "var",17,"DTM FILE" sfile = refstr if getpath(sfile,2+16) ! ".var" : sfile = getpath(sfile,1) + ".var" sfile1 = getpath(sfile,1) + "1.var" vsave_start vsave_put part vsave_put vol1 vsave_put vol2 vsave_end sfile1 sfile2 = getpath(sfile,1) + "2.var" vsave_start vsave_put viv1 vsave_put long vsave_put last vsave_end sfile2



暇人

リンク

2015/3/31(Tue) 23:47:35|NO.68254

あぁ、一旦全部別メモリに移してるのね
それじゃバグじゃ無く仕様か・・・


>NO.68248
>仕様はどう変えたらいいんでしょうか・・・。
配列毎にbsave/bloadする方法
ファイル名リスト用のファイルも保存して
読込む時はそのファイルだけ見えるように

dim part,2056,50,256 dim vol1,2056,50,256 dim vol2,2056,50,256 dim viv1,2056,50,256 dim long,2056,50,256 dim last,2056,50,256 button "ロード",*load button "セーブ",*save stop *load dialog "dfl",16,"DTM FILE" if stat=0 {dialog "キャンセルします":end} wait 1 mes "ロード中" filelist_name = refstr dfname=getpath(filelist_name,1) //拡張子削除したディレクトリありのファイル名 fname=getpath(dfname,8) //ディレクトリ削除した拡張子無しのファイル名 filelist_name=fname+ ".dfl" //配列保存のファイル名をリストにして保存してるファイル名 notesel dtm_flist noteload filelist_name //セーブファイル名のリストを読込み noteget file_name,0 title file_name+"(1/6)" bload file_name,part noteget file_name,1 title file_name+"(2/6)" bload file_name,vol1 noteget file_name,2 title file_name+"(3/6)" bload file_name,vol2 noteget file_name,3 title file_name+"(4/6)" bload file_name,viv1 noteget file_name,4 title file_name+"(5/6)" bload file_name,long noteget file_name,5 title file_name+"(6/6)" bload file_name,last mes "ロード終了" stop *save dialog "dfl",17,"DTM FILE" if stat=0 {dialog "キャンセルします":end} wait 1 mes "セーブ中" filelist_name = refstr dfname=getpath(filelist_name,1) //拡張子削除したディレクトリありのファイル名 fname=getpath(dfname,8) //ディレクトリ削除した拡張子無しのファイル名 filelist_name=fname+ ".dfl" //配列保存のファイル名をリストにして保存するファイル名 sdim dtm_flist notesel dtm_flist title fname+".part"+"(1/6)" bsave fname+".part",part noteadd fname+".part",0 title fname+".vol1"+"(2/6)" bsave fname+".vol1",vol1 noteadd fname+".vol1",1 title fname+".vol2"+"(3/6)" bsave fname+".vol2",vol2 noteadd fname+".vol2",2 title fname+".viv1"+"(4/6)" bsave fname+".viv1",viv1 noteadd fname+".viv1",3 title fname+".long"+"(5/6)" bsave fname+".long",long noteadd fname+".long",4 title fname+".last"+"(6/6)" bsave fname+".last",last noteadd fname+".last",5 notesave filelist_name //セーブファイル名のリストを保存 mes "セーブ終了" stop



オクラ☆

リンク

2015/4/1(Wed) 00:13:42|NO.68255

ありがとうございますみなさま・・・これで何とかできそうです。マジで感謝を回答してくださったひと一人一人にしてます。ありがとうございました、勉強になりました。上のやり方って、ファイルを一つにできますか?できたらやってみたいんですが・・・ちなみにふつうの変数も一つに結合できたらいいんですけど・・・わがまますみません、ggってわかりませんでした・・・おねがいします!!!



暇人

リンク

2015/4/1(Wed) 01:50:59|NO.68258

bsave/bloadはオフセット値を指定できるので一つにするのは可能
今回みたいに配列のサイズが決まっていて、全部同じなら追加して
セーブすれば良いだけだが、違う場合は、サイズを記録する場所も
確保して保存する必要がある

変数も同様に出来るが変数の数によっては結構面倒だろう
変数の数や名前が変わったときの対応忘れとか色々と・・・
変数を使うときに一手間かければセーブロードの対応忘れを回避できるが・・・



Okura☆

リンク

2015/4/1(Wed) 13:45:27|NO.68265

皆様ありがとうございます。回答くださった皆様は、このシステムを公開する際に
そのReadmeにて書かせていただきます。
大変感謝しております。
解決ということでこの質問を切らせていただきます。
ありがとうございました!



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