FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgFixLenArrays

目次→実行時ライブラリー参考→プログラマーのための案内Fixed-length Arrays←オリジナル・サイト

固定長配列 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

固定サイズの、同種のデータ構造。

概要
固定長配列は、プログラムの実行中に、一定の固定サイズを保つ 配列 です。
固定長配列が、その要素を格納するために用いるメモリは、コンパイル時に、スタック上か、または、実行ファイルの .BSS.DATA セクションに割り当てられます。 配列を定義するために、Static (あるいは Shared) が使われているかどうかに依存します。
固定長配列は、配列のメモリが既に割り当てられているため、プログラムの実行が高速になります。実行時まで要素メモリが割り当てられない 可変長配列 との違いです。

自動保存 による固定長配列は、配列の要素をプログラム・スタック上に割り当てます。そして、配列が範囲にある間だけ、配列の要素へのポインターは有効です。
静的保存 による固定長配列の要素は、実行可能ファイルの .DATA.BSS 部分に割り当てられます。配列を定義するとき、配列が初期化されるかどうかよります。これらの要素へのポインタは、プログラムの実行の全体で有効です。
いかなる記憶域クラスの固定長配列も、プログラム実行中に、大きさを変更することができません。可変長配列だけが、大きさを変更することができます。

固定長配列も、ユーザー定義型 の内部のデータ・メンバーとして使うことができます。この場合には、配列は、ユーザー定義型構造の一部として、直接割り付けられます。

宣言
固定長配列は、DimStatic キーワードで宣言されます。ここで、変数識別子と、境界のリストを括弧に入れたものと、要素の data type が続きます。

'' 自動保存のINTEGER型の、一次元の固定長配列を定義します。
Dim arrayOfIntegers(69) As Integer

'' 静的記憶域のSHORT型の、一次元の固定長配列を定義します。
Static arrayOfShorts(420) As Short


配列の要素の数を指定する、様々な方法があります。
各配列は、1〜8 の間の次元を持つことができます。
次元は、それぞれ下限と上界を持っています。

Dim a(1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim b(0 To 1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim c(5 To 10) As Integer  '' 1-dimensional, 6 elements (5, 6, 7, 8, 9 and 10)

Dim d(1 To 2, 1 To 2) As Integer  '' 2-dimensional, 4 elements: (1,1), (1,2), (2,1), (2,2)
Dim e(9, 9, 9, 9) As Integer '' 4-dimensional, 10 * 10 * 10 * 10 elements


旧バージョン
Dim a(1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim b(0 To 1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim c(5 To 10) As Integer  '' 1-dimensional, 5 elements (5, 6, 7, 8, 9 and 10)

Dim d(1 To 2, 1 To 2) As Integer  '' 2-dimensional, 4 elements: (1,1), (1,2), (2,1), (2,2)
Dim e(255, 255, 255, 255) As Integer '' 4-dimensional, 256 * 256 * 256 * 256 elements
 


固定長で宣言する配列のために、添字範囲の値は、数字の直定数か、Const 値か、Enum 定数しか使えません。

Const myLowerBound = -5
Const myUpperBound = 10

'' 一次元の固定長配列を宣言します。myUpperBound - myLowerBound + 1 の文字列オブジェクトを保持します。
Dim arrayOfStrings(myLowerBound To myUpperBound) As String

'' INTEGERを登録するのに十分大きいバイト型の要素の、
'' 一次元の固定長配列を宣言します。
Dim arrayOfBytes(0 To SizeOf(Integer) - 1) As Byte


初期化子付き宣言
固定長の配列は、配列宣言の後に初期化子を付けることで、宣言時に値を与えることができます(可変長の配列宣言では、初期化子は使えません)。
この配列の初期化値は、中括弧で囲まれたカンマ区切りの値で与えられます。この配列値の初期化方法は、互いに入れ子にして複雑な代入を行うことができ、任意の次元の配列を初期化することができます。

'' 2×5 要素の配列を宣言し、それに続いて初期化子を指定します。
Dim array(1 To 2, 1 To 5) As Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}


上限値には省略記号 "..." (3つの点)を使うことができます。これは、初期化子で見つかった要素の数に基づいて、上限が自動的に設定されます。
つまり、省略記号を使う場合は、初期化子を使う必要があります。

'' 2×5 の要素を持つ配列を(1つの省略で)宣言し、それに続いて初期化子を宣言します。
Dim array(1 To 2, 1 To ...) As Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}


'' 2×5 要素の配列を(2つの省略記号で)宣言し、それに続いて初期化子を指定します。
Dim array(1 To ..., 1 To ...) As Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}




追記:
以下は、フォーラムで掲載された、配列の設定方法の注意点です。
https://www.freebasic.net/forum/viewtopic.php?f=2&t=28370

Fix-len arrays declared with only 'Dim' are located in the stack.
'Dim' だけで宣言された固定長配列は、「スタック」に配置されます。

Fix-len arrays declared with 'Dim Shared' or 'Static' are located in the .BSS section (in the .DATA section if they are initialized when defined).
'Dim Shared' か 'Static' で宣言された固定長配列は、.BSSセクションに配置されます。
(定義時に初期化されている場合は .DATAセクション)

The data of the var-len arrays is always located in the heap.
可変長配列のデータは、常にヒープに配置されます。

エラーを表示せずに終了してしまう例:
'このプログラムは、起動直後、もしくは最初の入力後に終了してしまいます。
'2 つの配列が大きすぎてシステム・スタックに収まらないからです。
'スタック容量は、デフォルトで合計 1MBです。

Dim As ULong dictcount(255,255)  '←この行がまずくて、実行に行かないで終了してしまう。
Dim As String dicts(255,255)     '←この行がまずくて、実行に行かないで終了してしまう。
Input "何か入力して下さい。 - ",dicts(1,1)
Print "あなたが入力したのは ";dicts(1,1)
Input "何か入力して下さい。 - ",dicts(2,2)
Print "あなたが入力したのは ";dicts(2,2)
Sleep

エラーにならない改善例1:
Dim Shared As ULong dictcount(255,255)
Dim Shared As String dicts(255,255)
Input "何か入力して下さい。 - ",dicts(1,1)
Print "あなたが入力したのは ";dicts(1,1)
Input "何か入力して下さい。 - ",dicts(2,2)
Print "あなたが入力したのは ";dicts(2,2)
Sleep

エラーにならない改善例2:
Static As ULong dictcount(255,255)
Static As String dicts(255,255)
Input "何か入力して下さい。 - ",dicts(1,1)
Print "あなたが入力したのは ";dicts(1,1)
Input "何か入力して下さい。 - ",dicts(2,2)
Print "あなたが入力したのは ";dicts(2,2)
Sleep

参考:

プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2020-07-27 00:12:30
日本語翻訳:WATANABE Makoto、原文著作者:LaananFisher

ホームページのトップに戻る

表示-非営利-継承