C/C++

C++. Как сделать ввод переменной (размера) на основе которой будет ввод массива?

cin >> r;
int Arr[r]; можно ли так объявлять масив и делать его динамическим?
int i = 0;
while (i < r){
cin >> Arr[i];
}
Дальше решения с этим масивом
В Си это придумали давно и банально просто:
#include<эстэдэио. ха>//напиши латиницей
#include<эмаллок. ха>//напиши латиницей
int main(){
int n;
while(n>0)
{
printf("%s","\nВведите размер массива (0=выход из программы): \t");
scanf("%d",&n);
int *heap=(int*)malloc(sizeof(int)*n);
if(heap) printf("\nСоздан массив в куче размером %ld байт, количество элементов = %d",sizeof(int)*n,n);
else printf("%s","\nНихрена не создан массив)))");
free(heap); heap=0;
if (!heap) printf("%s","\nКуча освобождена от массива.");
}
return 0;
}
Таалайбек Анаркулов
Таалайбек Анаркулов
37 945
Лучший ответ
Сережа Салтыцкий > if (!heap) printf("%s","\nКуча освобождена от массива.");
Зачем тут if?
Андрей Полянский А что если
int *ptrArr = new int[r]
Цикл i {
ptrArr[i] = i;
}
?
size_t n_max = 1024;
int box[n_max];
size_t n;
cin >> n;
if (n > n_max) exit(0);
auto x = 1;
for (auto i = 0U; i < n; ++i, ++x) box[i] = x * x;

Такой вариант устроит?

Лучший вариант – использование std::vector
Павел Глоба
Павел Глоба
73 549
int Arr[r]; - не динамический массив, а особый тип массива - Variable Length Array (VLA), со своими особенностями. В стандарте C++ отсутствует, поскольку в нем есть тип c бОльшими возможностями - vector, но некоторые компиляторы его поддерживают как расширение стандартного C++ (но далеко не все). Так что можно ли его использовать, зависит от того, каким компилятором пользуешься, и у других твой код может не компилироваться.
Это зависит от компилятора C++: в GCC можно, в Visual С++ вроде нельзя (раньше точно нельзя было, может уже реализовали)
У меня такая конструкция работает вполне нормально. Вот, например, как можно получать вектор узловых решений диффуравнения dy/dx = f(x,y), xє[a;b], y(a)=ya с переменным шагом, задаваемым с экрана:
#include "iostream"
#include "cmath"
#include "cstdio"
double f(double x,double y) { return y; }
int main() { double a,b,h,hp,x,u,ya; int n,nplus,k; for (;;) { std::cout << "a b y(a) n >> "; std::cin >> a >> b >> ya >> n; nplus=n+1; h=(b-a)/n; hp=h/2; double y[nplus]; y[0]=ya; for (k=0; k<n; k++) { x=a+k*h; u=y[k]; y[k+1]=u+h*f(x+hp,u+hp*f(x,u)); }
for (k=0; k<nplus; k++) { x=a+k*h; print("%10.6f%22.16f", x,y[k]); } } }
Тут получается экспонента, а размерность массива всякий раз перезадаётся по новой на каждом новом шаге вычисления вектора решений. Только этот массив не динамический, а как бы динамический. И область, отводимая для него в памяти не беспредельна, а строго лимитирована.
Ильгиз Валитов
Ильгиз Валитов
28 648
В современных компиляторах можно.
Но это плохая стратегия т. к. это требует динамическое выделение памяти и автоматической сборки мусора.
Лучше использовать классы наподобе vector
Роман Федотов
Роман Федотов
12 592
Сережа Салтыцкий Тут нет динамического выделения памяти, потому и сборка мусора не нужна.
При использовании vector происходит динамическое выделение памяти и автоматическая сборка мусора.
Роман Федотов >> Получается, в C++ есть что-то, что не работает без ABI GC?
ABI фактически является стандартом согласно которому компилятор создает и размещает данные в памяти. У каждого компилятора свой такой стандарт т. е. свой ABI.

>> но это не случилось
Случилось. Еще в С++11 попало, но как рекомендация не обязательная к реализации. Что бы не вызывать разночтений при реализации в будущем.

Как следствие всего этого изменился ABI у разных версий компиляторов чего у GCC уже лет 10 не случалось т. е. код компилируемый разными версиями компиляторов стал бинарно не совместим потому что объекты в памяти размещаются по разному.
Вот потому я и люблю C#, что там есть List<>, с которым можно делать что душе угодно и хранить в нем что хочешь не сильно запариваясь)
Сережа Салтыцкий В C++ есть аналогичный шаблонный класс vector
Так можно в QT creator сделать, но не в Visual Studio
это элементарно, Ватсон!

cout << "Enter the number elements of array: ";
cin >> kol_elem;

int *set0 = new int[kol_elem];