BASICでは0または1の値のみをとる変数にも普通の変数を割り当てます。
これは,大きな配列を使いたい場合には非効率です。
BitArray.zipをダウンロードし,展開して得られるBitArray.DLLを利用すると,次の例のようにして巨大ビット配列が使えます。
(BitArray.DLLをBASIC.EXEがあるフォルダに置くか,または,プログラムとBitArray.DLLを同じフォルダに保存して実行してください)
REM エラトステネスの篩
DECLARE EXTERNAL FUNCTION GetArray, Test
DECLARE EXTERNAL SUB FreeArray, setbit
LET Nmax=10000
LET p=GetArray(Nmax)
IF p<>0 THEN
FOR i=2 TO Nmax-1
IF Test(p,i)=0 THEN
PRINT i
FOR j=i^2 TO Nmax-1 STEP i
CALL SetBit(p,j)
NEXT j
END IF
NEXT i
CALL FreeArray(p)
END IF
END
EXTERNAL FUNCTION GetArray(s)
! (s+1)ビットのメモリを確保し,ゼロで埋める。
! 結果は,メモリのアドレス。0のときは失敗。
FUNCTION GetArray_sub(s)
ASSIGN "BitArray.DLL","GetArray"
END FUNCTION
IF 0<=s AND s<2^32 THEN
LET GetArray=getArray_sub(s)
ELSE
LET GetArray=0
END if
END FUNCTION
EXTERNAL SUB FreeArray(p)
! メモリを返却する。pはGetArrayで得た値
ASSIGN "BitArray.DLL","FreeArray"
END SUB
EXTERNAL FUNCTION Test(p,i)
! i番目のビットを取得する。pはGetArrayで得た値
ASSIGN "BitArray.DLL", "Test"
END FUNCTION
EXTERNAL SUB SetBit(p,i)
! i番目のビットを1にする。pはGetArrayで得た値
ASSIGN "BitArray.DLL", "SetBit"
END SUB
EXTERNAL SUB ResetBit(p,i)
! i番目のビットを0にする。pはGetArrayで得た値
ASSIGN "BitArray.DLL", "ResetBit"
END SUB
Test,SetBit,ResetBitで指定できるiの値は,GetArrayに指定した数をsとして,0〜sです。
また,実際にGetArrayに指定できるsの値の上限は,Windows XPでの実験結果では,1983381248です。
<注意>Test,SetBit,resetBitは範囲外の数を指定したときの安全策を講じていません。範囲外を指定しないように注意してプログラムを作る必要があります。