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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0709
masako99sdimについて9解決


masako99

リンク

2008/7/9(Wed) 10:41:44|NO.17199

hsp 2.61で

sdim a,10,100,50,50 mes "b" stop
はほぼ瞬時に表示されますが
3.1ですと表示されるまでかなり時間がかかります。
これは、3.1での仕様でしょうがないことなのでしょうか?
それとも私のPCの性能のせいなのでしょうか?



この記事に返信する


Ve

リンク

2008/7/9(Wed) 12:03:14|NO.17200

仕様だと思いますね。
私の環境でも1秒ぐらいかかって mes "b"が実行されました。



masako99

リンク

2008/7/9(Wed) 12:23:54|NO.17201

やっぱり仕様ですか・・・。
hsp2.61で作っていたスクリプトを3.1でバージョンアップしようと思っていたのですが
sdimの配列変数を多用しているので実行まで時間が掛かるのでは無理ですね。
せっかく3.1に慣れてきたのですが、諦めてhsp2.61でバージョンアップする事にします。
やっぱり3.1の方が作りやすいな〜なんて思っていたのですがsdimで躓いてしまうとは
思ってもいませんでした。なんかちょっと納得がいきませんが・・・(笑)。
返信、ありがとうございました。



船丸

リンク

2008/7/10(Thu) 17:28:52|NO.17220

でも、これは10回繰り返しても100回繰り返しても10秒は超えませんよ。
遅くなると言っても最初に全てやれば良いだけの話ですよ。



GENKI

リンク

2008/7/10(Thu) 19:54:10|NO.17223

起動に時間がかかることはHSP3を使用することをあきらめるほどの致命的な
問題とは思えないのですが、何か特別な理由があるのでしょうか?
船丸さんがおっしゃるとおりメインループ内でsdim命令を使ったりしない限りは、
実行中の速度は問題ないはずです。
よければ理由を教えていただけませんか?



いとおちゃん

リンク

2008/7/12(Sat) 09:33:19|NO.17241

割り当てる要素が多いとこうなるのでは?
要素を指定しないで、

sdim a,100000 mes "b"
ですと瞬時に表示されます。
デフォルト文字数は関係ないようです。



いとおちゃん

リンク

2008/7/12(Sat) 09:33:38|NO.17242

追記ですが3.1です。



masako99

リンク

2008/7/17(Thu) 00:54:12|NO.17342

ごめんなさい、こんなにコメントが入っているとは思っていませんでした。
レスが遅くなってしまったこと、お詫びします。
GENKIさんの仰るとおり確かにあきらめるほどの致命的なものではないかもしれませんが
仕様で2.6より時間が掛かるのであれば、敢えて3.1でプログラムしなくても・・・
と思っただけで、配列の次元を少なくしたりして工夫をすれば問題ないかもしれません。
ただ折角4次元まで使えるようになったのに時間が掛かるのが不思議だったので、
仕様なのか、PCの性能の問題なのか知りたかったんです。
でも、思いませんか? 2.6より3.1の方が時間が掛かるのは変だな〜って。



osakana

リンク

2008/7/18(Fri) 04:54:08|NO.17361

文字数は高速に確保できるので
1次元の文字列型変数を大量に確保して、
それを擬似的な配列として管理し
そこからデータを切り貼りしたらどうだろう。

と思い 勢いで適当に実験して見ました。

/* Version 0.4.11 */ #module mod_string_array string, dimsize1, dimsize2, dimsize3, index, stmp // ここからモジュール変数操作命令 // モジュール変数初期化 #modinit int p1, int p2, int p3, int p4 sdim string, p1 * p2 * p3 * p4 sdim stmp, p1 dimsize1 = p1 dimsize2 = p1 * p2 dimsize3 = p1 * p2 * p3 return // 操作領域計算 #modfunc m_msa_access int p1, int p2, int p3 index = (dimsize1 * p1) + (dimsize2 * p2) + (dimsize3 * p3) return // 領域に書き込み #modfunc m_msa_write str s dupptr stmp, varptr(string) + index, dimsize1 - 1, 2 stmp = s return // 領域から読み込む #modfunc m_msa_read dupptr stmp, varptr(string) + index, dimsize1 - 1, 2 return stmp // ここまで内部用命令。 // データを格納する変数を初期化 // msa_dim データを格納する変数, 文字数, 配列要素の最大(3次元まで)... #deffunc msa_dim array a, int p1, int p2, int p3, int p4 dim a newmod a.0, mod_string_array, p1, p2, p3, p4 return // データ変数に操作領域を設定 // msa_access msa_dimで初期化した変数, アクセスする配列要素(3次元まで)... #deffunc msa_access array a, int p1, int p2, int p3 m_msa_access a.0, p1, p2, p3 return // 初期化した変数に文字列を書き込み // msa_write msa_dimで初期化した変数, 書き込む文字列 #deffunc msa_write array a, str s m_msa_write a.0, s return // 初期化した変数から文字列を取り出す // msa_read msa_dimで初期化した変数 // 戻り値:領域にある文字列 #defcfunc msa_read array a m_msa_read a.0 return refstr #global // サンプル // 変数初期化 msa_dim buf, 10, 10, 50, 50 // 書き込み repeat 16 msa_access buf, cnt\10, cnt/10 msa_write buf, strf("「%02d」", cnt) loop // 読み込み repeat 16 msa_access buf, cnt // 要素は纏めれる mes "読み出し:" + msa_read(buf) loop
初めはマクロで作っていたんですが、面倒になりモジュール化、
更にモジュール変数化と徐々に複雑になってしまいました。
(モジュール変数は0次元しか使って無いけど、
     要素の最大や添え字などを記憶できるので)

デバッグは余りしておらず きっとバグがあると思いますので
もし使う方が居るなら(居ないだろうけど)処理が変じゃないか確認してください。
(ちなみにスクリプトは、煮るなり焼くなり好きにしていいので)


というか蛇足でしたね。
すみません。



osakana

リンク

2008/7/18(Fri) 05:16:09|NO.17362

言い忘れましたが、
これは変数の確保は早いですが、
変数へのアクセスは遅いです。

通常の文字列型配列へのアクセスに比べ
私の環境で約4〜5倍低速になります。



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