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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0503
Seal要素数の取得方法8解決


Seal

リンク

2018/5/3(Thu) 15:43:24|NO.84247

こんにちは

StageData(0, 0) = 8, 8, 8, 8, 8, 8, 7, 1
↑のスクリプトの 「StageData(0, 0)内に要素数が8個あるんじゃ!!」を
どうしたら取得できるのでしょうか?



この記事に返信する


あらや

リンク

2018/5/3(Thu) 16:40:51|NO.84248

配列変数の要素数を知りたいならば length、length2、length3、length4
(それぞれが 1次元目の要素数、2次元目の要素数、…… を返します)

変数が使用しているバイト数を調べるだけなら varsize

変数の型が知りたいなら vartype

これらを使えばわかります。



Seal

リンク

2018/5/3(Thu) 18:23:23|NO.84250

戻り値が3に正確に取得できるスクリプト

a = 1, 2, 3 mes length(a)

戻り値が1024になるスクリプト

dim a, 1024 a = 1, 2, 3 mes length(a)

dim は必ず入れないと エラーになります。
dim の 1024 を無視して取得はできないでしょうか?



あらや

リンク

2018/5/3(Thu) 19:05:30|NO.84252

>dim の 1024 を無視して取得はできないでしょうか?
無理だと思います。

dimを使用した時点で要素数1024個を使用している。と判定されるので……

やるとしたらdim直後に「絶対に使わない数値」を全配列に入れて
repeat〜loopで配列の内容を1つずつ「絶対に使わない数値」が見つかるまで確認し
その数をカウントするような方法しかないかと思います。

0以上の整数しか使わないとかいう条件なら負数を入れておくだけで済むので簡単ですが、
そういった制限が無い場合は

同じ容量の配列をもう1つ用意して、
内容を全コピーして配列に数値を入れたら、
内容に変化がないか新旧の配列内容を比較して
異なる数値をカウントするとかでしょうか。
ただこの方法だと、新旧のデータがたまたま同じ数値になってしまうと
正確にカウントできない可能性があるので、どんな状況でもとなると無理でしょうね。

// 新旧データ比較した場合の失敗例 dim a, 1024 ; ここでは配列aは全て0が入る dim a_old, 1024 ; これが旧データ aと同じく全て0が入る a = 1, 2, 3, 0 ; 使用した要素数は4つ num = 0 ; 要素数が入る変数 repeat 1024 i = 1023 - cnt ; データを後ろから比較していく if( a(i) != a_old(i) ) { ; 不一致するデータが見つかった場合の処理 num = i+1 ; 要素数を代入 break } loop mes num ; 使用した要素は4つだが、偶然旧データと一致したために要素数は3つと判定される



KA

リンク

2018/5/4(Fri) 06:16:10|NO.84256


dim a, 1024 a = 1, 2, 3 b = 1, 2, 3 mes length(b)
でOKですか?



Seal

リンク

2018/5/4(Fri) 08:15:48|NO.84257

あらやさんのスクリプトの要素数取得を以下でも取得できますか?


StageData(0, 0) = 8, 8, 8, 8, 8, 8, 7, 1



MillkeyStars

リンク

2018/5/4(Fri) 13:00:36|NO.84261

あらやさんの方式で作ってみたサンプル。
絶対に使用しない数値で利用している要素をカウントするモジュール。

#module _dim_length_ //数値型配列のすべての要素を指定された数値で初期化します。 // DimReset p1,p2 // p1 は数値配列の変数名 // p2 は初期化したい数値 #deffunc DimReset array p1,int SetValue NullValue = SetValue SkipFlag = 0 if (length4(p1) >= 1)&(SkipFlag == 0){ MemoryLength = length4(p1) * length3(p1) * length2(p1) * length(p1) SkipFlag = 1 } if (length3(p1) >= 1)&(SkipFlag == 0){ MemoryLength = length3(p1) * length2(p1) * length(p1) SkipFlag = 1 } if (length2(p1) >= 1)&(SkipFlag == 0){ MemoryLength = length2(p1) * length(p1) SkipFlag = 1 } if (length(p1) >= 1)&(SkipFlag == 0){ MemoryLength = length(p1) } dupptr ArrayPointer,varptr(p1),MemoryLength * 4,4 repeat MemoryLength lpoke ArrayPointer,cnt * 4,SetValue loop return //数値型配列の一次元空間の要素を指定された数値で初期化します。 // DimResetOne p1,p2,p3 // p1 は初期化したい配列要素一次元 StageData(0,?,?,?) // p2 一次元要素の最大要素数 // p3 初期化したい数値 #deffunc DimResetOne var p1,int ArrayLen,int SetValue NullValue = SetValue dupptr Access,varptr(p1),ArrayLen * 4,4 repeat ArrayLen lpoke Access,cnt * 4,SetValue loop return //数値型配列の一次元空間の利用要素数を取得する // DimLength p1,p2 // p1 は取得したい配列要素一次元 StageData(0,?,?,?) // p2 は一次元最大要素数 #deffunc DimLength var p1,int ArrayLen dupptr Access,varptr(p1),ArrayLen * 4,4 counter = 0 repeat ArrayLen if Access(cnt) != NullValue : counter++ : else : break loop return counter #global dim StageData,8,3 //配列変数の内容をあり得ない値で初期化します。 DimReset StageData,0x7FFFFFFF //StageData に数値を入れてみる StageData(0,0) = 1,2,3,4,5,6,7,8 //8個使用 StageData(0,1) = 1,2,3,4,5 //5個使用 StageData(0,2) = 1,3,2,1,4,5 //6個使用 //StageData 二次元 1 番を初期化してみる DimResetOne StageData(0,1),length(StageData),0x7FFFFFFF //使用されている要素数を取得表示する DimLength StageData(0,0),length(StageData) : mes strf("StageData(0,0) は %d 個",stat) DimLength StageData(0,1),length(StageData) : mes strf("StageData(0,1) は %d 個",stat) DimLength StageData(0,2),length(StageData) : mes strf("StageData(0,2) は %d 個",stat



Seal

リンク

2018/5/4(Fri) 17:15:34|NO.84262

>MillkeyStarsさん
おー!!凄い!!
ありがとうございます!!



Seal

リンク

2018/5/5(Sat) 11:25:40|NO.84263

解決チェックを入れるのを忘れていました
すいません



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