cin >> r;
int Arr[r]; можно ли так объявлять масив и делать его динамическим?
int i = 0;
while (i < r){
cin >> Arr[i];
}
Дальше решения с этим масивом
C/C++
C++. Как сделать ввод переменной (размера) на основе которой будет ввод массива?
В Си это придумали давно и банально просто:
#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;
}
#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;
}
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
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
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]); } } }
Тут получается экспонента, а размерность массива всякий раз перезадаётся по новой на каждом новом шаге вычисления вектора решений. Только этот массив не динамический, а как бы динамический. И область, отводимая для него в памяти не беспредельна, а строго лимитирована.
#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]); } } }
Тут получается экспонента, а размерность массива всякий раз перезадаётся по новой на каждом новом шаге вычисления вектора решений. Только этот массив не динамический, а как бы динамический. И область, отводимая для него в памяти не беспредельна, а строго лимитирована.
В современных компиляторах можно.
Но это плохая стратегия т. к. это требует динамическое выделение памяти и автоматической сборки мусора.
Лучше использовать классы наподобе vector
Но это плохая стратегия т. к. это требует динамическое выделение памяти и автоматической сборки мусора.
Лучше использовать классы наподобе vector
Сережа Салтыцкий
Тут нет динамического выделения памяти, потому и сборка мусора не нужна.
При использовании vector происходит динамическое выделение памяти и автоматическая сборка мусора.
При использовании vector происходит динамическое выделение памяти и автоматическая сборка мусора.
Роман Федотов
>> Получается, в C++ есть что-то, что не работает без ABI GC?
ABI фактически является стандартом согласно которому компилятор создает и размещает данные в памяти. У каждого компилятора свой такой стандарт т. е. свой ABI.
>> но это не случилось
Случилось. Еще в С++11 попало, но как рекомендация не обязательная к реализации. Что бы не вызывать разночтений при реализации в будущем.
Как следствие всего этого изменился ABI у разных версий компиляторов чего у GCC уже лет 10 не случалось т. е. код компилируемый разными версиями компиляторов стал бинарно не совместим потому что объекты в памяти размещаются по разному.
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];
cout << "Enter the number elements of array: ";
cin >> kol_elem;
int *set0 = new int[kol_elem];
Похожие вопросы
- Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Ввод массива строк с помощью рекурсии
- Задан целочисленный массив размера N. Определить число элементов в массиве кратных 2.
- C++, Как сделать тип возврата из функции по ситуации / динамический? P.S.auto не поможет
- C++ помогите сделать задания
- Помогите пожалуйста - создать 4 массива на c++
- Помогите добавить ввод чисел в массив матрицы на языке Си
- Измерить размер массива в функции Arduino. sizeof работает некорректно с переданной в функцию переменной.
- Как сделать сортировку массива по убыванию, сохранив индексы на языке C
Зачем тут if?
int *ptrArr = new int[r]
Цикл i {
ptrArr[i] = i;
}
?