Почему данный фрагмент выдает ошибку в Visual Studio?
Ситуация:
С С++ знаком пару часов.
Есть код ниже. В CLion отрабатывает без сучка-задоринки, все как надо. Студия же матерится, как сапожник, что переменные rows и columns должны быть(с фига?) константами. Отсюда вопрос: что за фигня?!
#include <iostream>
using namespace std;
int main(){
int rows;
int columns;
cout << "Enter number of rows: \n";
cin >> rows;
cout << "Enter number of columns: \n";
cin >> columns;
int field[rows][columns];
return 0;
}
Всё верно. Размер массива с автоматическим временем жизни должен быть известен на этапе компиляции. Clion автоматически подключает нестандартные расширения, которые позволяют VLA (по аналогии с С99). Лечится -pedantic или -pedantic-errors в CLion.
Basil_Dev, есть несколько вариантов.
СИшный вариант - это выделять память при помощи malloc вначале для одномерных массивов в цикле, затем для двухмерных.
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int rows;
int columns;
cout << "Enter number of rows: \n";
cin >> rows;
cout << "Enter number of columns: \n";
cin >> columns;
int **field; //Создаем двумерный динамический массив
field = (int**)malloc(rows * sizeof(int*)); //Выделяем память для двумерного массива
for (i = 0; i<rows; i++) {
field[i] = (int*)malloc(columns * sizeof(int)); //Выделяем память для каждой строчки
}
return 0;
}
С++ варианты
1. Выделить память через new
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int rows;
int columns;
cout << "Enter number of rows: \n";
cin >> rows;
cout << "Enter number of columns: \n";
cin >> columns;
int **field; //Создаем двумерный динамический массив
field = new int*[rows]; //Аналогично, только с нью
for (i = 0; i<rows; i++) {
field[i] = new int[columns];
}
return 0;
}
2. Использовать std::vector
С++ варианты
1. Выделить память через new
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int rows;
int columns;
cout << "Enter number of rows: \n";
cin >> rows;
cout << "Enter number of columns: \n";
cin >> columns;
vector<vector<int>> field;
return 0;
}
Как говорил мой куратор, который цитировал дядю Бена из человека паука - "С большой силой, приходит большая ответственность". Управление памятью есть и преимущество и недостаток данного языка. В умелых руках оно может позволить писать очень лёгкие программы и предоставляет рукам полный контроль. А в неумелых руках может вам сильно навредить.