1. ホーム
  2. c++

[解決済み】c++エラー:配列の添え字に無効な型 'int[int]' があります。

2022-02-10 21:57:53

質問

C++を学ぼうとしていて、配列に関する簡単な練習をしています。

基本的には多次元配列を作成し、その値を出力する関数を作りたいのです。

Main()内のコメントされたforループはうまくいくのですが、そのforループを関数にしようとするとうまくいかず、どうしてもその理由がわかりません。

#include <iostream>
using namespace std;


void printArray(int theArray[], int numberOfRows, int numberOfColumns);

int main()
{

    int sally[2][3] = {{2,3,4},{8,9,10}};

    printArray(sally,2,3);

//    for(int rows = 0; rows < 2; rows++){
//        for(int columns = 0; columns < 3; columns++){
//            cout << sally[rows][columns] << " ";
//        }
//        cout << endl;
//    }

}

void printArray(int theArray[], int numberOfRows, int numberOfColumns){
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

解決方法は?

C++はC言語から構文を継承しており、構文が一致する部分では後方互換性を維持するように努めています。 そのため、配列の受け渡しはC言語と同じように動作します:長さの情報は失われます。

しかし、C++では、参照を用いて、自動的に長さ情報を渡す方法が用意されています(後方互換性の心配はありません、Cには参照はありません)。

template<int numberOfRows, int numberOfColumns>
void printArray(int (&theArray)[numberOfRows][numberOfColumns])
{
    for(int x = 0; x < numberOfRows; x++){
        for(int y = 0; y < numberOfColumns; y++){
            cout << theArray[x][y] << " ";
        }
        cout << endl;
    }
}

デモを行います。 http://ideone.com/MrYKz

複雑な配列参照の構文を避けたバリエーションを紹介します。 http://ideone.com/GVkxk

サイズが動的な場合、どちらのテンプレート版も使用できません。 CとC++は、配列の内容を行の長さの順に格納することを知っていればよいのです。

サイズ可変で動作するコードです。 http://ideone.com/kjHiR