C++ Передача динамического массива, определяемого параметром

Эта функция задавалась здесь несколько раз, но меня интересует конкретный случай. Возможно ли, чтобы размер передаваемого массива определялся дополнительным аргументом?

В качестве примера предположим, что мне нужна функция для печати двумерного массива. Однако массив может не иметь одинаковых размеров каждый раз. Было бы идеально, если бы у меня были дополнительные аргументы, определяющие размер этого массива. Я знаю, что я мог бы легко заменить n числом здесь по мере необходимости, но если у меня есть более сложные функции с отдельными файлами заголовков, кажется глупым идти и редактировать файлы заголовков каждый раз, когда появляется массив другого размера. Следующие результаты приводят к error: use of parameter 'n' outside function body..., что я понимаю, но хотел бы найти обходной путь. Я также пробовал с g++ -std=c++11, но все та же ошибка.

#include <iostream>
using namespace std;

void printArray(int n, int A[][n], int m) {
    for(int i=0; i < m; i++){
        for(int j=0; j<n; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {

    int A[][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9},
        {10,11,12}
    };

    printArray(3, A, 4);

    return 0;
}

Предположительно, это можно сделать с помощью C99, а также упомянутого в этот вопрос, но я не могу понять, как это сделать с С++.


person cdeterman    schedule 03.11.2014    source источник
comment
Это невозможно в стандартном C++. VLA — это функция только для C или нестандартные расширения компилятора. Ссылка на соответствующий вопрос   -  person M.M    schedule 04.11.2014


Ответы (1)


Это работает:

template<size_t N, size_t M>
void printArray( int(&arr)[M][N] ) {
  for(int i=0; i < M; i++){
    for(int j=0; j < N; j++) {
      std::cout << A[i][j] << " ";
    }
    std::cout << std::endl;
  }
}

если вы хотите поместить код в заголовочный файл. В качестве бонуса он выводит для вас N и M.

person Yakk - Adam Nevraumont    schedule 03.11.2014
comment
Это прекрасно работает в основном файле, но у меня возникают проблемы, когда я помещаю его в заголовок. Где он жалуется на то, что «M» и «N» не объявлены. Я что-то упускаю? - person cdeterman; 04.11.2014
comment
@cdeterman тело функции должно находиться в заголовочном файле. Возможно, вам придется #include <cstddef> получить size_t или заменить size_t на unsigned, если массивы размера 2^32 достаточно велики. - person Yakk - Adam Nevraumont; 04.11.2014