検証スクリプト

■ INDEX

最近の検証結果 / 検証スクリプト / 過去の検証結果
注意:最近のテストはWindows 7 64bit環境で行っています

■ 2010年12月末日時点の検証結果

(win7 64bit環境での検証)nscr2.95nscr2.82
スプライト 0〜999まで(計1000枚)使用可能。
数値変数 %0〜%4095まで(計4096個)使用可能
代入限度:32bit整数。2147483647〜-2147483648の範囲(±約21億)
文字列変数 $0〜$4095まで(計4096個)使用可能
nscr2.95代入限度:(半角で8183文字、全角で4091文字まで使用可能)
nscr2.82代入限度:(半角で2040文字、全角で1020文字まで使用可能)
配列変数 ?x〜?x+4095までの4096個を使用可能。添え字は20次元まで。ただし環境依存する。
配列に文字列は代入できない。(文字列変数で代用。SGPさんに素晴らしい記事有り)
配列の内容はセーブデータに保存されない。配列への数値代入方法はmov・movlのみ。
補講でも配列に関して記述。NScripterの配列は永字八法さんのdimの考察に詳しい。
nscr2.95Luaのテーブルを利用すると妙な制限もなく高機能な配列が使用可能。
ラベルの上限数 *define *startを除いて9998個まで使用可能。
gosubで潜れる深さ 1000回まで可能。
ボタン定義の上限数 511個まで可能。
画面領域 (0,0)から(639,479)まで。mode800時には合わせて変動。

 

■ 検証スクリプト

スプライト番号は999まで


lsp 1000,":c;test.jpg",0,0:print 1

nscr2.82nscr2.95
上記のスクリプトを実行すると不安定に。NScripterを終了するとBuffer overrun。

nscr2.96
同じく不安定に。 Buffer overrunは出ないものの、終了処理が上手くいかないのか、
一度NScripter終了後はexe実行できず起動エラーで再起動するしかなくなる。

 

数値変数は%4095まで


*define
effectcut
killmenu 7
game
*start
for %0=0 to 5000
rnd %%0,100
itoa $0,%0:itoa $1,%%0:
caption "数値変数:"+$0+"="+$1
wait 1
next
終了\
end

nscr2.95nscr2.96
上記のスクリプトを実行するとタイトルバーに4095表示状態でエラー落ち。
つまり4096番を使用したタイミングでエラー。

nscr2.82
以前のXP機でのチェックと違って4097番使用で落ちずに5000まで通る。OS依存があるのだろうか?
とりあえず、4095に合わせておくのが無難だと思われる。

 

文字列変数は$4095まで


*define
effectcut
killmenu 7
menusetwindow 20,20,0,0,1,1,#CCCCCC
game
*start
for %0=1000 to 5000
rnd %1,100
itoa $0,%0:itoa $%0,%1
caption "文字列変数:"+$0+"="+$%0
wait 1
next
終了\
end

nscr2.95nscr2.96
上記のスクリプトを実行するとタイトルバーに4095表示状態でエラー落ち。
つまり4096番を使用したタイミングでエラー。

nscr2.82
以前のXP機でのチェックと違って4246番使用で落ちずに5000まで一応通る。
しかしその後↓表示。こちらもOS依存があるのだろうか?
とりあえず、4095に合わせておくのが無難だと思われる。

 

数値変数へ代入できる限度:32bit整数。2147483647〜-2147483648の範囲

nscr2.82nscr2.95nscr2.96

*define
effectcut
killmenu 7
game
*start
mov %0,2147483000
*loop
	inc %0
	itoa $0,%0
	if %0 < 0 mesbox $0,"符号がマイナスに":end
	caption "数値:"+$0
	wait 1
goto *loop

*define
effectcut
killmenu 7
game
*start
mov %0,-2147483000
*loop
	dec %0
	itoa $0,%0
	if %0 > 0 mesbox $0,"符号がプラスに":end
	caption "数値:"+$0
	wait 1
goto *loop

 

文字列変数へ代入できる限度:


*define
effectcut
killmenu 7
game
*start
mov %0,1:mov $0,""
*loop
	add $0,"A"
	itoa $1,%0
	caption $1+"個:"+$0
	wait 1
	inc %0
goto *loop

*define
effectcut
killmenu 7
game
*start
mov %0,1:mov $0,""
*loop
	add $0,"あ"
	itoa $1,%0
	caption $1+"個:"+$0
	wait 1
	inc %0
goto *loop

nscr2.82
2041文字を代入した変数を使用したところでBuffer overrun表示落ち。
(半角で2040文字、全角で1020文字まで使用可能)
XP検証当時の2047までもいきませんね。こちらもOS依存があるのかな?
nscr2.95nscr2.96
8184文字を代入した変数を使用したところでエラー落ち。
(半角で8183文字、全角で4091文字まで使用可能)

 

配列限度のチェック


*define
effectcut
killmenu 7
for %0=5 to 4100
dim ?%0[0]
next
game
*start
for %0=5 to 4100
	rnd %1,100:mov ?%0[0],%1
	itoa $0,%0:itoa $1,?%0[0]
	caption "配列"+$0+"="+$1
	wait 1
next
click
end

【元々の仕様】
?0-?199番までの200個。
【検証してみると】
nscr2.95
総計4096個まで割り当て可能。範囲は?0-?4095固定ではなく、?5-?4100や?100-?4195でも可。
連番じゃなく飛び飛びでも合わせて4096個超えなければ大丈夫。
nscr2.96
総計4929個まで割り当て可能? あとはv295同様。
nscr2.82
制限なさげ? なんじゃこれ? v2.95と違って↓が通ってわけがわからない。


*define
effectcut
killmenu 7
for %0=9 to 5000
dim ?%0[0]
next
game
*start
for %0=9 to 5000
	rnd %1,100:mov ?%0[0],%1
	itoa $0,%0:itoa $1,?%0[0]
	caption "配列"+$0+"="+$1
	wait 1
next
終了\
end

nscr2.82では何故か完走。こちらもOS依存がありそうで怖い。
nscr2.95では普通に↓な感じで止まりました。

正直、配列に関しては色々謎なので本家マニュアルに記載されている仕様の200個に抑えた方がよさげ。
本格的に使う場合は圧倒的に便利なLuaのテーブルに回しましょう。その方が作業効率が良いです。

 

gosubで潜れる深さは1000まで


*define
game
*start
mov %0,0
*loop
inc %0
itoa2 $0,%0
csp 0
lsp 0,":s#FFFFFF"+$0,0,0
print 1
if %0 == 10000 end
wait 10
gosub *loop

nscr2.82nscr2.95nscr2.96
上記のスクリプトを実行すると1001で落ちる。
つまり1000回まではgosubが可能。

 

旧ボタン(spbtn)の定義は511個まで


*define
game
*start
mov %0,0
btndef clear
lsp 1,":s#FFFFFF定義限界",0,100
*loop
inc %0
itoa2 $0,%0
csp 0
lsp 0,":s#FFFFFF"+$0,0,0
print 1
spbtn 1,%0
wait 10
if %0 == 10000 end
wait 10
goto *loop

nscr2.82nscr2.95nscr2.96
上記のスクリプトを実行すると512表示で落ちる。
つまり511個まではボタン定義が可能。

 

新ボタン(bsp)の定義は256個まで


*define
game
*start
mov %0,0
btndef clear
lsp 1,":s#FFFFFF定義限界",0,100
*loop
inc %0
itoa2 $0,%0
csp 0
lsp 0,":s#FFFFFF"+$0,0,0
print 1
bsp 1
wait 10
if %0 == 10000 end
wait 10
goto *loop

nscr2.95nscr2.96
上記のスクリプトを実行すると257表示で落ちる。
つまり256個まではボタン定義が可能。

 

 

■ 過去の検証結果

(winXP 検証)nscr2.82
スプライト 0〜999まで1000枚使用可能。
数値変数 %0〜%4096まで(計4097個)使用可能(※1)
代入限度:32bit整数。2147483647〜-2147483648の範囲(±約21億)(※2)
文字列変数 $0〜$4246まで(計4247個)使用可能(※1)
代入限度:半角2047文字(全角1023文字)まで(※3)
配列変数 全部で200個までの配列、20次元まで使用可能。配列はグローバル変数不可。
配列に文字列は代入できない。(文字列変数で代用。SGPさんに素晴らしい記事有り)
ラベルの上限数 *define *startを除いて9998個まで使用可能。(※4)
gosubで潜れる深さ 1000回まで可能。
ボタン定義の上限数 511個まで可能。
画面領域 (0,0)から(639,479)まで。mode800時には合わせて変動。

※仕様の補足情報※
(※1:正確には%4097使用でエラー。4098〜20000は使用可能。(09/01/14貴史たま+MEさま調べ)
(   文字列変数の場合は$4246,$4759,$6012使用でエラー。以後未検証。(04/12/12検証)
(   言うまでもないかもしれませんが%0と$0は番号は同じでも別物なので、同時に利用できます。
(※2:2の31乗を超えた巨大な数を与えるとオーバーフローして1410065407になります。
(※3:ver2.55時は全角388文字までだが、現行ver2.82では全角1023文字。
(   代入は10万字超も可だが、いざその変数を使うとBuffer overrunに(08/11/10検証)
(※4:うpろだn_0135.zip投稿者さま調べによる。

「押さえておきたい仕様など」にモドル