このページでは、FreeBASIC の動的配列の適切な使用について説明します。
これは簡単なチュートリアルです。多くの人々が、動的配列で苦労をしているので、私は、これを、「始める前の教本」のページに置く価値があると感じました。
配列は、整っています。
配列は、プログラムを通して、使えるし、リサイズできます。ただ、少し難しさがあります。
まず第一に、私たちは、動的配列を作成する、二つの方法について、議論します。
同じコードの中で、Sub や function の、Dynamic
Shared 配列を再定義 する方法を説明するつもりです。
コードの中のコメントを読んで、よく理解してください。
Declare Sub mySub
()
' V 0.17 では、OPTION DYNAMIC と '$DYNAMIC は不要です。
' あなたは、その都度、配列を動的になるように定義しなければなりません。
' お分かりのように、次の両方の方法を使うと、動的な配列をうまく作成できます
Dim Shared myArray1() As UByte
ReDim Shared myArray2(0) As UByte
mySub
' 配列を共有したので、配列は、モジュールのどこからでも、アクセスできます
Print myArray1(5) ' 2 を表示します
Print myArray2(6) ' 3 を表示します
Sleep
Sub mySub
()
' sub か function の中で "redim shared" を使用しないでください!
' 配列が共有されていても、"shared" という言葉を省略しなければなりません'
ReDim myArray1(0 To 9) As UByte
ReDim myArray2(0 To 9) As UByte
myArray1(5) = 2
myArray2(6) = 3
End Sub
今、あなたは、
PRESERVE キーワードを使っているとき、どうやって配列を再定義できるか、疑問に思うかもしれません。
REDIM のための構文に記述されているように、単に
PRESERVE を加えるだけです。
しかし実際、これは、最初の配列の寸法が、ただ一度の変更の場合にだけ、働きます!
例えば、下のプログラムは、適切に動作しないでしょう:
' 動的配列を、クリーンな方法で宣言します
ReDim Shared myArray(0 To 9, 0 To 9) As UByte
Dim As UByte x, y, i
' 配列に値を満たします
For y = 0 To 9
For x = 0 To 9
i += 1
myArray(x, y) = i
Next x
Next y
' 元の値は良いことを検証します:
For y = 0 To 9
For x = 0 To 9
Print Using "##,";
myArray(x, y);
Next x
Print
Next y
Print
print "Press a key..."
Sleep
Cls
' 配列を再定義します
ReDim Preserve myArray(0 To 18, 0 To 12) As UByte
' 値は適切に保持されていません !
For y = 0 To 9
For x = 0 To 9
Print Using "##,";
myArray(x, y);
Next x
Print
Next y
Sleep
End
これを十分に試してみてください!
あなたは、これが適切に働かないことを確認できます。
これは配列の最初の寸法だけが、サイズを変えるからです。
PRESERVE が適切に扱うように、残りは同じサイズのままで残っています。
回避方法があります。私は、将来、それを掲示するつもりです。私のプログラムだけでなく、どんなプログラムにも使えるように編集して、それが区域外に行かないように、いくつかの改正をした後にです。
さしあたり、創造的になってください;)