English

配列(Arrays)

Cm言語の配列は、C++スタイルの固定長配列をサポートします。

📋 目次

基本的な使い方

配列宣言

// 基本的な配列宣言
int[5] numbers;

// 宣言と初期化
int[3] values = [1, 2, 3];

// サイズ推論
int[] auto_size = {10, 20, 30};  // サイズ3と推論

配列の初期化

// ゼロ初期化
int[10] zeros;  // すべて0

// リテラル初期化
int[5] primes = {2, 3, 5, 7, 11};

// 部分初期化
int[5] partial = [1, 2];  // {1, 2, 0, 0, 0}

要素のアクセス

int main() {
    int[5] numbers;
    int first = numbers[0];
    numbers[1] = 10;
    return 0;
}

v0.11.0の変更点: 境界チェックが導入されました。範囲外のインデックスにアクセスすると、プログラムは安全に停止(パニック)します。

配列のメソッド

サイズ取得

int[5] arr;

int size1 = arr.size();     // 5
int size2 = arr.len();      // 5
int size3 = arr.length();   // 5(全て同じ)

要素検索

int[5] numbers = [1, 2, 3, 4, 5];

// indexOf - 要素の位置を検索
int pos = numbers.indexOf(3);  // 2
int not_found = numbers.indexOf(10);  // -1

// includes - 要素が含まれているか
bool has_3 = numbers.includes(3);  // true
bool has_10 = numbers.includes(10);  // false

// contains(includesのエイリアス)
bool has_5 = numbers.contains(5);  // true

高階関数メソッド

int[5] numbers = [1, 2, 3, 4, 5];

// some - いずれかが条件を満たすか
bool has_even = numbers.some(|x| x % 2 == 0);  // true

// every - すべてが条件を満たすか
bool all_positive = numbers.every(|x| x > 0);  // true

// findIndex - 条件を満たす最初の要素のインデックス
int idx = numbers.findIndex(|x| x > 3);  // 3 (値4のインデックス)

構造体配列

struct Point {
    int x;
    int y;
}

int main() {
    // 構造体配列の宣言
    Point[3] points;

    // 初期化
    points[0].x = 10;
    points[0].y = 20;

    points[1].x = 30;
    points[1].y = 40;

    // 構造体配列の初期化リスト
    Point[2] pts = {
        Point(1, 2),
        Point(3, 4)
    };
    return 0;
}

ポインタへの変換

配列は自動的にポインタに変換されます(Array Decay)。

int main() {
    int[5] arr = [1, 2, 3, 4, 5];

    // 配列→ポインタ変換
    int* p = arr;  // arr[0]のアドレス

    // ポインタ経由でアクセス
    int first = *p;     // 1
    int second = *(p + 1);  // 2
    return 0;
}

関数に配列を渡す

void print_array(int* data, int size) {
    for (int i = 0; i < size; i++) {
        println("{}", data[i]);
    }
}

int main() {
    int[5] numbers = [1, 2, 3, 4, 5];
    print_array(numbers, 5);  // 配列→ポインタ変換
    return 0;
}

for-in構文

範囲ベースのforループで配列を反復処理できます。

struct Point { int x; int y; }

int main() {
    int[5] numbers = [1, 2, 3, 4, 5];

    // 型指定あり
    for (int n in numbers) {
        println("{}", n);
    }

    // 型推論
    for (n in numbers) {
        println("{}", n);
    }

    // 構造体配列
    Point[3] points = {Point(1, 2), Point(3, 4), Point(5, 6)};

    for (Point p in points) {
        println("({}, {})", p.x, p.y);
    }
    return 0;
}

多次元配列

// 2次元配列
int[3][4] matrix;

// 初期化
matrix[0][0] = 1;
matrix[0][1] = 2;

// ループでアクセス
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        matrix[i][j] = i * 4 + j;
    }
}

パフォーマンス最適化(v0.11.0以降)

配列自動フラット化: Cm v0.11.0は多次元配列を自動的に最適化し、キャッシュ性能を向上させます。

// ユーザーコード(変更不要)
int[500][500] matrix;
matrix[i][j] = value;

// 内部最適化(自動):
// - キャッシュ局所性向上のため1次元配列に変換
// - 大規模な行列で最大250倍高速化
// - ユーザーに完全に透過的

この最適化により:

実装状況

バックエンド 状態
インタプリタ ✅ 完全対応
LLVM Native ✅ 完全対応
WASM ✅ 完全対応

サンプルコード

完全なサンプルは以下を参照してください:

関連ドキュメント


更新日: 2026-02-08