В стандарте C ++ границы массивов должны быть константными выражениями. Оба ваших примера плохо сформированы.
Различие в поведении компилятора, которое вы наблюдаете, связано с нестандартным расширением, предоставляемым вашим компилятором, которое, очевидно, рассматривает два случая по-разному; обращение к документации вашего компилятора может быть способом продолжить, если вы хотите go продвинуться дальше по этому пути.
Конечно, мой совет - использовать стандартные конструкции, тогда это будет работать на каждом компиляторе, и поведение хорошо документировано.
Самое простое решение требования "создать непрерывный двумерный массив с переменными размерами и передать по ссылке на функцию" на самом деле создать вектор и выдержать второстепенное неудобство использования x + y*COLS
вместо [x][y]
для доступа к нему.
Код может выглядеть (псевдокод):
lint find_max(vector<mm> &arr2, vector<lint> const& nums, ....otherstuff)
{
mm& item_at_x_y = arr2[x + y * nums.size()];
}
с вызывающим абонентом:
void caller()
{
vector<mm> arr2( nums.size() * ops.size() );
// populate arr2...
find_max(arr2, nums, ops...);
}
Можно было бы написать класс, подобный Matrix, который позволяет [x][y]
синтаксис доступа, например, см. Здесь или другие примеры в Google.
Вы можете создать средство доступа для использования синтаксиса скобок, например:
auto arr = [&](size_t y, size_t x) { return arr2[x + y * nums.size()]; };
arr(3, 4) = 5;