@@ИсаакГерде я так скажу, ты не делай так, а перед заполнением данных из другого массива, удали все данные из других, иначе если они будут разного размера, то будет факап
void Swaparr(int* &arr, int const size, int * &arr2, int const size2) { int *tempArr = new int[size]; for (int i = 0; i < size; i++) { tempArr[i] = arr[i]; } delete[] arr; arr = new int[size2]; for (int i = 0; i < size2; i++) { arr[i] = arr2[i]; } delete[] arr2; arr2 = new int[size]; for (int i = 0; i < size; i++) { arr2[i] = tempArr[i]; } delete[] tempArr; } вот рабочая функция, мб кому надо будет
@@AnderX003 ну как сказать. Я на чем-то, что между стажировкой и учёбой. Мне как бы не платят, но я без этого на работу попасть в эту компанию не смогу. Ну и я уже пишу не на C++, а на Java/Kotlin.
Возможно, чего-то не понимаю, но я реализовал данную идею следующим образом: for (int i = 0; i < size; i++){ *(firstarray + i) = *(secondarray + i); } В итоге адреса элементов первого массива остались прежними, но значения стали равными как у второго.
@@ДанилГолдобин-ж2ь так и способ автора не подойдёт,лол. Для такого нужно что бы массивы были одинаковые либо первый меньше второго, но не наоборот. Я тоже не понял зачем автор зачищал все когда можно было сделать firstarray[i]=secarray[i]. То же самое что и в комментарии выше.
@@aviator1472 автор говорил такой способ если массивы будут разной длины , соответственно его реализация тоже под массивы разной длины и если переменная size была бы у них не общая то его реализация была работающей! то есть она и так рабочаю но из за того что у них size один и тот же они одной длины
@@aviator1472 способ автора подойдёт. Потому что он удаляет всё первоначальное содержимое массива рецепиента, и выделяет память заново, уже в размере как у массива-донора. Ему надо было изначально создать 2 массива разной длины, чтобы людям было нагляднее видно, что происходит.
Сразу подумалось что должен быть способ более изящный чем цикл, подумалось о копировании куска памяти во вновь испечённый массив и действительно такая функция есть "memcpy".
пока смотрел начало видоса, успел написать функцию на копирование и автор говорит, что не получится, а спустя пару минут оказалось, что все правильно сделал хД
Когда, автор сказал, про алгоритм копирования массива, я решил поставить на паузу и написать функцию, которая это реализует. Вот, что вышло: void copyArray(int* const arr1, int* const arr2, const int size) { delete [] arr1; arr1 = new int arr[size]; int i = 0; for (i; i < size; i++) { arr1[i] = *(arr2 + i); } }
@@roockeet3460 Я давно это писал, мой и твой код можно считать не отличными, есть куда более быстрое копирование: по 4/8/16 и т.п. байта, если не возможно копировать по кускам, то оставшиеся байты, мы копируем, либо побитово, либо байтами. Это копирование можно назвать кусками.
Подскажите пожалуйста, почему здесь не используется обнуление значения указателей массива firstArray и secondArray посредством присваивания им значения nullptr?
Мой отладчик после ключевого слова delete[] указывает для двух массивов на одни и те же адреса в оперативной памяти. Возможно компилятор автоматически подчищает адреса после delete'a. Точно не знаю, поэтому мне не верьте)
А зачем), мы удаляем данные с помощью delete а у указатели просто помнят тот участок памяти на который они указывали, после мы просто присваиваем им новый участок памяти а про предыдущий они само собой забывают) хотя можно и обнулять, но разницы как таковой не будет)
Вот код создал, словари одинаковые и в памяти храняться под разными ячейками, хз к чему тот длинучий код, когда его увидел начал проклинать синтаксис c++ void main() { // Создание массива int matrix[5]{ 2,1,5,9,10 }; int copy_matrix[5]; for (int i = 0; i < size(matrix); i++) { copy_matrix[i] = matrix[i]; }
Да, как эксперимент копирование (firstArray = secondArray) в Mac OS X, приводит к взыванию исключения.Компилятор, даже во время компиляции, не допустил утечку памяти!! И вызвал исключение ошибок malloc(malloc_error_break). Для тех, кто работает на UNIX. A вот Visual Studio 2017, только после компиляции, и вывода информации в консоль, смог увидеть утечку памяти!
Мы удаляем данные, на которые указывает первый указатель, переназначаем его на новую выделенную память под массив, размер которого соответствует размеру второго массива, на который указывает второй указатель. И поэлементно записываем данные из второго массива в первый. Такая операция бывает полезна когда, например, нужно удалить из массива все положительные числа, или добавить туда какие-то числа. Сначала мы проворачиваем нужную процедуру с новым массивом, а затем копируем данные в старый, после чего можно удалить новый, вот и перезапись
Если массивы одинаковой длины, нельзя ли просто поэлементно присвоить новые значения нужному массиву, из другого. Уже сделал удаление строки из двумерного массива. Фактически создание нового массива с количеством строк на 1 меньше, и перезапись по элементно строк, исключая указанную. Вроде все получилось. Но сейчас пытаюсь осмыслить как и почему и не ясно. for (int i = 0; i < rows; i++) { delete[] arr[i]; } delete[] arr; rows--; arr = NewArray; Удаляем в цикле указатели строк, и потом сам массив массивов. Уменьшаем общее количество строк. Присваиваем данные из Нового массива, который сами же заполнили из основного. Вот не ясно. Как вообще заполняется. При таком удалении двумерного массива, мой arr в каком виде находится ? не остается ли в памяти пустая строка. которую не заполняю. Или после удаления массива и присвоении, он заново выстраивается ?
Очень классно. Но у каждого свои привычки. Хотелось бы еще сравнения функций выделения памяти. При работе с дин. массивами я привык работать с malloc и realloc. Numerical recipec in c дают третий вариант. А суммарно их очень много. Хочется попросить автора сделать сравнительный обзор (включая и функции ОС).
Можно ли что-то улучшить? #include using namespace std; void mas(int** const arr, const int row, const int col); /// Функция объявления двумерного массива по названию void fill(int** const arr, const int row, const int col); /// Функция наполнения двумерного массива void view(int** const arr, const int row, const int col); /// Вывод массива void del(int** const arr, const int row); /// Очистка памяти void copy(int** const arr, int** const brr, const int row, const int col);/// копирования из первого массива во второй. int main() { setlocale(LC_ALL, "ru"); int row, col; cin >> row >> col; int** arr = new int* [row]; // выделяем динамическую память под массив mas(arr, row, col); ///делаем массив arr двухмерным fill(arr, row, col); /// Функция наполнения массива. view(arr, row, col);///Вывод массива arr. cout
P.P.S Опять пришлось выключить SDL проверки. По умолчанию на visual studio 2019 они включены. Чтобы их выключить нужно нажать пкм по самому проекту(срр файлу), выбрать св-ва *** С/С++ *** Общие***Проверки SDL
@@ВладиславТимофеюк Есть смысл ставить delete, например в функции, а если написать delete в конце программы, в этом по моему нет смысла, потому что, что вы напишите delete и почистите кучу, что программа сама завершится и почистит память которую использовала при своей работе, в том числе и кучу.
@@konfedicialnenkokonfedicia1968 есть смысл ставить delete в том месте программы, после которого вы далее эти данные нигде не используете, то есть они вам не нужны, и место от них лучше освободить для чего-то нужного. Так то да, после убийства программы ОЗУ назначает её "бывшую" память свободной для использования.
А если глобальному дин. массиву присвоить ссылку на массив, созданный в функции, что произойдет после отработки функции? Глобальный массив будет ссылатся на освобожденную память, которая может быть выделена следующей функции? Так?
А можно ли копировать массив большего размера в меньший. Например нужно записать данные в неизвестном количестве, но до известного предела. Я создаю массив, заполняю его нулями, потом данными. Затем создаю второй массив, предварительно сделав счетчик, чтобы взять только данные без нулей. Или так нельзя?
Можно, только для этого должен быть алгоритм, который при заполнении массива высчитывает размер, чтобы цикл не зашел за границы массива (компилятор это не проверяет, поэтому здесь нужно быть внимательным). Я так понимаю, что в идеале размер массивов должен быть одинаковым, чтобы жизнь себе не усложнять. Но ситуации разные бывают, поэтому в данном случае без вычислений никак.
Сергей , пиши ,пожалуйста надпись о пользе видео и о том , что мне нужно поставить лайк, в самом конце, а то не хочется выходить из полноэкранного режима посередине просмотра и отвлекаться от учебы, а после просмотра как-то забывается нажать на "палец вверх".
Сергей, здравствуйте! Недавно встретился с проблемой когда в отладчике в консоль выводиться два массива с разными данными, а когда запускаю компилятор без отладчика консоль выводит одинаковые данные ( как-будто это одинаковые массивы). Вы не сталкивались с подобной проблемой? если да, подскажите пожалуйста решение. Спасибо!
Оказывается, если вызвать функцию srand(time(NULL)) из функции fillarray возникает данная проблема! srand() надо вызывать только из функции main(), в таком случае все работает корректно.
A vot u menya ne poluchilos skopirivat, potomu chto v novoy dinamicheskoy pamyati funkciya rand tak je zapolnyala sluchaynimi ciframi a ne kopirovala s predidushego. Kak eto ispravit?
Это нормально что у меня вообще компилятор axyel с таких приколов про присвоение указателя массива другому указателю массива и сказал что я даун... Ну трудно не согласиться, но я ведь чисто в научных целях ._.
2 варианта я полагаю, первый это возможно когда ты второй раз объявлял firstArray после delete, ты сделал это так: int *firstArray = new int[size]; //// А надо было так firstArray = new int[size]; И второй вариант, в этом не уверен, но возможно нужно в этом проекте нажать пкм по самому проекту(срр файлу), выбрать св-ва *** С/С++ * Общие***Проверки SDL. Если они включены выключи. По умолчанию на 2019 год они включены. Это полезная доработка VS, но некоторые вещи из-за них не получается проверить.
Эй, это магия, или совпадение? Перед просмотром способа переноса данных массива, сделал сам перенос каждого значения массива. В первом и втором массиве идентичные данные (как у автора видео) получились, до десятого индекса. rand() всегда назначает одни и те же числа на определенный размер массива, или действительно совпадение?
Я один обратил внимание на то, что после копирования указателя "firstArray = secondArray", выводимые значения массивов "firstArray" и "secondArray" стали одинаковыми. НО! значения массива "secondArray" в первом cout отличаются от значений "secondArray" во втором cout ???
// Помогите не могу понять правильно ли прога работает #include #include using namespace std; void FillArray(int * const arr, const int size) { for (int i = 0; i < size; i++) { arr[i] = rand() % 21; } } void ShowArray(int * const arr, const int size) { cout
пишет ошибку и: Error 3 error C3861: 'FillArray': identifier not found Error 4 error C3861: 'FillArray': identifier not found Error 5 error C3861: 'ShowArray': identifier not found Error 6 error C3861: 'ShowArray': identifier not found код в точности такой же в чем проблема? пользуюсь Студией 2010
двумерный массив в которых сразу введены значения , так же как с переменными, первые 3 числа это первый одномерный массив(в в фигурных скобках), а а другие второй одномерный массив
Harald TV спасибо. Давно разобрался посмотрев этот канал. В квадратных скопках: [число массивов] [сколько чисел в массиве]. Автору канала моё уважение и здоровья. Ах да с праздиком!
в данном случае размер (size) этих массивов одинаковый (видимо, что бы проще понять было суть), и конкретно тут можно было не удалять, а переписать "поверх", в старый массив. но это не по фен-шую, т.к. бывают разные ситуации: если размеры массивов будут разные, или тип данных у них будет разный, или еще что то. что бы исключить все эти "или", наверняка удаляют и создают новый массив по подобию копируемого,
Да, абсолютно верно написано. В этом примере размеры одинаковые, но в общем случае нужно сделать как сделал он, только размеры массива правильные указать.
Если вдруг кого интересует держите, всё работает. Если вдруг посмотрит опытный программист скажи пожалуйста, Верно ли всё или можно как то сделать получше. #include #include using namespace std; void fillarray(int** const arr, int row, int col); void showarray(int** const arr, int row, int col); void main() { setlocale(LC_ALL, "rus"); srand(time(NULL)); int row = 5; int col = 5; int** FirstArray = new int* [row]; int** SecondArray = new int* [row]; for (int i = 0; i < row; i++) { FirstArray[i] = new int[col]; } for (int i = 0; i < row; i++) { SecondArray[i] = new int[col]; } fillarray(FirstArray, row, col); fillarray(SecondArray, row, col); cout
Не понял, зачем сначала удалять массив, в который потом копируем второй массив. Мы же просто перезаписываем данные из первого, а не занимаем новые ячейки памяти и никакой утечки и без первого удаления не происходит.
Ваш способ подойдёт при копировании массивов с одинаковым количеством элементов. Если кол-во элементов у массивов разное, о чем рассказывал автор в видео, необходимо удалить старый массив и создать новый с другим кол-вом элементов)
void Swap(int* arr,int*arr2, const int SIZE) { for (int i = 0; i < SIZE; i++) { swap(arr[i], arr2[i]); } } Почему эту функция не использовать бы ? с Swap проще же
Ребят, а зачем вообще удалять первый массив и выделять ему новую память, если значения можно скопировать в старые ячейки? Это же динамический массив. UPD: То же самое можно сделать и со статическим массивом.
В статическом массиве размер известен до компиляции, а в динамическом может быть задан в ходе выполнения программы, НО размер массива не может быть переопределён более одного раза. Многократно увеличивать размер может не массив, а Вектор, но об этом далее.
Зачем удалять уже выделенное место для первого массива и выделять новое, если можно эти выделенные места заполнить поочерёдно данными из второго массива?
Размеры массивов может различаться, если мы продолжим делать, как ты говоришь, то есть вероятность выхода за пределы массива, что непременно приведет к ошибке.
#include using namespace std; void zapolnenie_arr(int *arr, int size) { for (int i = 0; i < size; i++) { arr[i] = rand() % 10; } } void show_arr(int *arr, int size) { for (int i = 0; i < size; i++) { cout
раз 10 пересмотрел видео и все понял, спасибо!
Пожалуйста! =)
Надо было домашним заданием дать смену местами этих массивов, пожалуй я этим и займусь сейчас, спасибо за урок!
Зачем их менять местами, если можно поменять только указатели?)
# include
# include
using namespace std;
void Massiv_zapolnenie(int*const arr,const int size)
{
for(int i=0;i
@@ИсаакГерде я так скажу, ты не делай так, а перед заполнением данных из другого массива, удали все данные из других, иначе если они будут разного размера, то будет факап
@@ИсаакГерде Руки могут оторвать за то, что так функции называешь. Аккуратнее)
void Swaparr(int* &arr, int const size, int * &arr2, int const size2) {
int *tempArr = new int[size];
for (int i = 0; i < size; i++)
{
tempArr[i] = arr[i];
}
delete[] arr;
arr = new int[size2];
for (int i = 0; i < size2; i++)
{
arr[i] = arr2[i];
}
delete[] arr2;
arr2 = new int[size];
for (int i = 0; i < size; i++)
{
arr2[i] = tempArr[i];
}
delete[] tempArr;
}
вот рабочая функция, мб кому надо будет
4к лайков против 4 дизлайков. Как по мне комментарии тут будут излишни. Моё уважение автору!
Даааа, сложный урок вроде всё понял но надо видео пересмотреть ещё раза два как минимум. Спасибо за урок было очень интересно
как успехи? стал Seniorom?
@@CapyBarsTraining за 8 месяцев нереально. И сфер много. Поэтому ты лучше спроси у него "Устроился на работу C++ прогером?"
@@andreyvolkov3117 а ты устроился?
@@AnderX003 ну как сказать. Я на чем-то, что между стажировкой и учёбой. Мне как бы не платят, но я без этого на работу попасть в эту компанию не смогу. Ну и я уже пишу не на C++, а на Java/Kotlin.
@@AnderX003 А у тебя как успехи:D
То чувство, когда вернулся на предыдущее видео, чтобы поставить лайк. хДД 0_о
стал программистом?
#динамическиймассив #SimpleCode #урокипрограммирования
Спасибо за урок.
Все подробно рассказано. Большое спасибо. В интернете всякую ерунду пишут, а здесь довольно все просто и внятно рассказано (и не только в этом уроке)
Возможно, чего-то не понимаю, но я реализовал данную идею следующим образом:
for (int i = 0; i < size; i++){
*(firstarray + i) = *(secondarray + i);
}
В итоге адреса элементов первого массива остались прежними, но значения стали равными как у второго.
Если размеры у массивов разные, то этот способ не пройдет
@@ДанилГолдобин-ж2ь так и способ автора не подойдёт,лол. Для такого нужно что бы массивы были одинаковые либо первый меньше второго, но не наоборот. Я тоже не понял зачем автор зачищал все когда можно было сделать firstarray[i]=secarray[i]. То же самое что и в комментарии выше.
@@aviator1472 автор говорил такой способ если массивы будут разной длины , соответственно его реализация тоже под массивы разной длины и если переменная size была бы у них не общая то его реализация была работающей! то есть она и так рабочаю но из за того что у них size один и тот же они одной длины
@@aviator1472 способ автора подойдёт. Потому что он удаляет всё первоначальное содержимое массива рецепиента, и выделяет память заново, уже в размере как у массива-донора. Ему надо было изначально создать 2 массива разной длины, чтобы людям было нагляднее видно, что происходит.
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
Спасибо большое!!!!!!!!!!!
Сразу подумалось что должен быть способ более изящный чем цикл, подумалось о копировании куска памяти во вновь испечённый массив и действительно такая функция есть "memcpy".
Добрый день! Очередное спасибо за урок!!!
Просто огромное СПАСИБО, Сергей
Большое спасибо. очень интересный урок!!!
Спасибо за урок!!!!
пока смотрел начало видоса, успел написать функцию на копирование и автор говорит, что не получится, а спустя пару минут оказалось, что все правильно сделал хД
Спасибо за знания!
Когда, автор сказал, про алгоритм копирования массива, я решил поставить на паузу и написать функцию, которая это реализует. Вот, что вышло:
void copyArray(int* const arr1, int* const arr2, const int size) {
delete [] arr1;
arr1 = new int arr[size];
int i = 0;
for (i; i < size; i++) {
arr1[i] = *(arr2 + i);
}
}
void copyArray(int* copyIn, int* copyFrom, int sizeIn,int sizeFrom) {
delete[] copyIn;
copyIn = new int[sizeFrom];
for (int i = 0; i < sizeFrom; i++) {
copyIn[i] = copyFrom[i];
}
}
@@roockeet3460 Я давно это писал, мой и твой код можно считать не отличными, есть куда более быстрое копирование: по 4/8/16 и т.п. байта, если не возможно копировать по кускам, то оставшиеся байты, мы копируем, либо побитово, либо байтами. Это копирование можно назвать кусками.
Cпасибо за урок, лайк!
Спасибо за классные уроки :)
Спасибо большое!
Thank you Sergey!
Ты очень крутой, обожаю тебя.
Лучшие уроки по с++, интересно, читаешь ли ты до сих пор комментарии к старым видео.
а ф-ция "memcpy" разве не подходит для таких целей ?
Подскажите пожалуйста, почему здесь не используется обнуление значения указателей массива firstArray и secondArray посредством присваивания им значения nullptr?
Мой отладчик после ключевого слова delete[] указывает для двух массивов на одни и те же адреса в оперативной памяти. Возможно компилятор автоматически подчищает адреса после delete'a. Точно не знаю, поэтому мне не верьте)
А зачем), мы удаляем данные с помощью delete а у указатели просто помнят тот участок памяти на который они указывали, после мы просто присваиваем им новый участок памяти а про предыдущий они само собой забывают) хотя можно и обнулять, но разницы как таковой не будет)
Вот код создал, словари одинаковые и в памяти храняться под разными ячейками, хз к чему тот длинучий код, когда его увидел начал проклинать синтаксис c++
void main()
{
// Создание массива
int matrix[5]{ 2,1,5,9,10 };
int copy_matrix[5];
for (int i = 0; i < size(matrix); i++)
{
copy_matrix[i] = matrix[i];
}
Да, как эксперимент копирование (firstArray = secondArray) в Mac OS X, приводит к взыванию исключения.Компилятор, даже во время компиляции, не допустил утечку памяти!! И вызвал исключение ошибок malloc(malloc_error_break). Для тех, кто работает на UNIX. A вот Visual Studio 2017, только после компиляции, и вывода информации в консоль, смог увидеть утечку памяти!
На vs сидят умные ребятки, они сначала массив удалят)
Здравствуйте, не очень понимаю, зачем удалять array1, если можно сразу каждый элемент одного массива заменить на элемент другого?
Он объяснил, что массивы могут быть разных размеров, поэтому и удаляем первый
@@yuziazumi3563 Вовремя )
@@ihy1234 никогда не поздно)
@@yuziazumi3563 А смысл в это если там размер size всё ровно
Мы удаляем данные, на которые указывает первый указатель, переназначаем его на новую выделенную память под массив, размер которого соответствует размеру второго массива, на который указывает второй указатель. И поэлементно записываем данные из второго массива в первый. Такая операция бывает полезна когда, например, нужно удалить из массива все положительные числа, или добавить туда какие-то числа. Сначала мы проворачиваем нужную процедуру с новым массивом, а затем копируем данные в старый, после чего можно удалить новый, вот и перезапись
Спасибо !
Спасибо!🥰
Довольно жеско выглядит добавление/удаление строк на плюсах, особенно после матлаба
Это тебе не высокоуровневый язык, такие трудности тут есть
Если все понять, то не так уж и жестко)
Наконецто нашел то что нужно, но у меня задача сложнее, чем в видео. Помогите пж, как скопировать элементы с двумерного в одномерный масив
дай одномерному длину = сумме всех строк двумерного
Если массивы одинаковой длины, нельзя ли просто поэлементно присвоить новые значения нужному массиву, из другого.
Уже сделал удаление строки из двумерного массива. Фактически создание нового массива с количеством строк на 1 меньше, и перезапись по элементно строк, исключая указанную. Вроде все получилось. Но сейчас пытаюсь осмыслить как и почему и не ясно.
for (int i = 0; i < rows; i++)
{
delete[] arr[i];
}
delete[] arr;
rows--;
arr = NewArray;
Удаляем в цикле указатели строк, и потом сам массив массивов.
Уменьшаем общее количество строк.
Присваиваем данные из Нового массива, который сами же заполнили из основного.
Вот не ясно. Как вообще заполняется.
При таком удалении двумерного массива, мой arr в каком виде находится ?
не остается ли в памяти пустая строка. которую не заполняю. Или после удаления массива и присвоении, он заново выстраивается ?
Очень классно. Но у каждого свои привычки. Хотелось бы еще сравнения функций выделения памяти. При работе с дин. массивами я привык работать с malloc и realloc. Numerical recipec in c дают третий вариант. А суммарно их очень много.
Хочется попросить автора сделать сравнительный обзор (включая и функции ОС).
Если кодить на плюсах, то лучше пользоваться именно функциями С++, а не Си.
Можно ли что-то улучшить?
#include
using namespace std;
void mas(int** const arr, const int row, const int col); /// Функция объявления двумерного массива по названию
void fill(int** const arr, const int row, const int col); /// Функция наполнения двумерного массива
void view(int** const arr, const int row, const int col); /// Вывод массива
void del(int** const arr, const int row); /// Очистка памяти
void copy(int** const arr, int** const brr, const int row, const int col);/// копирования из первого массива во второй.
int main()
{
setlocale(LC_ALL, "ru");
int row, col;
cin >> row >> col;
int** arr = new int* [row]; // выделяем динамическую память под массив
mas(arr, row, col); ///делаем массив arr двухмерным
fill(arr, row, col); /// Функция наполнения массива.
view(arr, row, col);///Вывод массива arr.
cout
Или это не правильно? Просто у меня в программе сначала вызывается функция копирования. А уже потом массив из которого мы копировали удаляется.
P.P.S Опять пришлось выключить SDL проверки. По умолчанию на visual studio 2019 они включены. Чтобы их выключить нужно нажать пкм по самому проекту(срр файлу), выбрать св-ва *** С/С++ *** Общие***Проверки SDL
Все разобрался, кажется, сделал для одномерных массивов.
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
int size=5;
//int size2 = 9;
//cout > size;
int* arr = new int[size] {7, 4, 9, 2, 4};
int* brr = new int[size] {5,4,3,2,1};
for (int i = 0; i < size; i++)
{
cout
Есть ли смысл ставить deleta[] в конце программы, если по завершению работы программа и так подчистит всю используемую память ?
программа может быть очень длинной и из-за такой утечки оперативка может закончиться
@@ВладиславТимофеюк Есть смысл ставить delete, например в функции, а если написать delete в конце программы, в этом по моему нет смысла, потому что, что вы напишите delete и почистите кучу, что программа сама завершится и почистит память которую использовала при своей работе, в том числе и кучу.
@@konfedicialnenkokonfedicia1968 есть смысл ставить delete в том месте программы, после которого вы далее эти данные нигде не используете, то есть они вам не нужны, и место от них лучше освободить для чего-то нужного.
Так то да, после убийства программы ОЗУ назначает её "бывшую" память свободной для использования.
Конечно классическая идеология полезна, но этим сейчас вряд ли будут многие пользоваться на практике.
C delete [] firstArray; не копируется....
Почему не копируется?
Отличный урок! спасибо большое!
было бы классно, если был бы код ещё
Лучший!
спасибо
Молодца
а для чего в функции "ShowArray " вы пишете "const int *const"?
Чтобы передаваемые значения случайно не изменились в ходе работы функции
предыдущий урок смотрите
@@Kokurorokuko вопрос именно в том, зачем 2 раза const. В FillArray написано просто "const int*"
как копировать двумерный динамический массив?
Стать раком и начать молится что твоя криворукость и нелогическое мышление все правильно сделает...
Подскажите пожалуйста как очистить полностью динамическую память
Создать цикл и каждой ячейке массива присвоить delete после самому массиву присвоить delete. Надеюсь помог :D
А если глобальному дин. массиву присвоить ссылку на массив, созданный в функции, что произойдет после отработки функции? Глобальный массив будет ссылатся на освобожденную память, которая может быть выделена следующей функции? Так?
Интересно, можливо ли скопировать таким образом массив объектов?
А можно ли копировать массив большего размера в меньший. Например нужно записать данные в неизвестном количестве, но до известного предела. Я создаю массив, заполняю его нулями, потом данными. Затем создаю второй массив, предварительно сделав счетчик, чтобы взять только данные без нулей. Или так нельзя?
Можно, почему нет.
Можно, только для этого должен быть алгоритм, который при заполнении массива высчитывает размер, чтобы цикл не зашел за границы массива (компилятор это не проверяет, поэтому здесь нужно быть внимательным). Я так понимаю, что в идеале размер массивов должен быть одинаковым, чтобы жизнь себе не усложнять. Но ситуации разные бывают, поэтому в данном случае без вычислений никак.
@@aviator1472 Умаляю вас можете помочь мне? у меня один вопрос!
@@russiantutorials4763 Помогите пожалуйста
Сергей , пиши ,пожалуйста надпись о пользе видео и о том , что мне нужно поставить лайк, в самом конце, а то не хочется выходить из полноэкранного режима посередине просмотра и отвлекаться от учебы, а после просмотра как-то забывается нажать на "палец вверх".
Поздравляю,у меня прога крашнулась.
Не надо говорить,что комп слабый.32гб оперативки,5кор,1050ти.
Поздравляю!
Динамическими памятем работать опасно
Динамическими памятем работать опасно
Мог про характеристики не писать
Сергей, здравствуйте! Недавно встретился с проблемой когда в отладчике в консоль выводиться два массива с разными данными, а когда запускаю компилятор без отладчика консоль выводит одинаковые данные ( как-будто это одинаковые массивы). Вы не сталкивались с подобной проблемой? если да, подскажите пожалуйста решение. Спасибо!
Оказывается, если вызвать функцию srand(time(NULL)) из функции fillarray возникает данная проблема! srand() надо вызывать только из функции main(), в таком случае все работает корректно.
A vot u menya ne poluchilos skopirivat, potomu chto v novoy dinamicheskoy pamyati funkciya rand tak je zapolnyala sluchaynimi ciframi a ne kopirovala s predidushego. Kak eto ispravit?
что-то не работает с разным размером массивов ;(
int* b = new int(*a)
Короче говоря, просто создаём новый динамическим массив и присваиваем соответствующие элементы друг другу, верно?
Почему в параметрах функций int* arr ,а не int arr[] ?
Как я понимаю, потому что это динамический массив, а не статический. Передаётся указатель на первый элемент. Просто синтаксис такой.
Спсб
Это нормально что у меня вообще компилятор axyel с таких приколов про присвоение указателя массива другому указателю массива и сказал что я даун...
Ну трудно не согласиться, но я ведь чисто в научных целях ._.
А почему нельзя просто поменять указатели местами через третий временный указатель?...
Утечка памяти произойдет
у меня вывел ошибку C2374 firstArray пепеопределение, множественная инициализация(
2 варианта я полагаю, первый это возможно когда ты второй раз объявлял firstArray после delete, ты сделал это так:
int *firstArray = new int[size]; //// А надо было так firstArray = new int[size];
И второй вариант, в этом не уверен, но возможно нужно в этом проекте нажать пкм по самому проекту(срр файлу), выбрать св-ва *** С/С++ * Общие***Проверки SDL. Если они включены выключи. По умолчанию на 2019 год они включены. Это полезная доработка VS, но некоторые вещи из-за них не получается проверить.
@@krouvy469 у меня был 1 вариант спасибо
Эй, это магия, или совпадение? Перед просмотром способа переноса данных массива, сделал сам перенос каждого значения массива.
В первом и втором массиве идентичные данные (как у автора видео) получились, до десятого индекса.
rand() всегда назначает одни и те же числа на определенный размер массива, или действительно совпадение?
нужно подключить две библиотеки : ctime и cstdlib.
srand(time(NULL));
после этого функция rand будет генерировать каждый раз разные значения
До меня только в конце видео доперло, что мы копируем массивы, а не меняем местами xD;
Подскажите, а где хранятся данные первого массива после того, как сделали delete первого массива, но ещё не создали new int для новой ячейки памяти?
после delete[] array данные массива нигде не хранятся
А кто изучил теорию - пора узнать и о memcpy(); хДД
Я один обратил внимание на то, что после копирования указателя "firstArray = secondArray", выводимые значения массивов "firstArray" и "secondArray" стали одинаковыми. НО! значения массива "secondArray" в первом cout отличаются от значений "secondArray" во втором cout ???
Он ещё раз присвоил случайные числа значениям массива.
Я только одного не понял. Зачем нужно было дважды очищать массив. Какая цель от этого?
// Помогите не могу понять правильно ли прога работает
#include
#include
using namespace std;
void FillArray(int * const arr, const int size) {
for (int i = 0; i < size; i++)
{
arr[i] = rand() % 21;
}
}
void ShowArray(int * const arr, const int size) {
cout
В чём проблема? Прогони через отладчик
Чё блять ты написал
пишет ошибку и:
Error 3 error C3861: 'FillArray': identifier not found
Error 4 error C3861: 'FillArray': identifier not found
Error 5 error C3861: 'ShowArray': identifier not found
Error 6 error C3861: 'ShowArray': identifier not found
код в точности такой же
в чем проблема?
пользуюсь Студией 2010
Компилятор не видит функции, которые Вы вызвали.
Студия старая скачай новую, может в 2010, что - то не предусмотрено..
Ну ща эксепшены полетят, только хандли
🧠
up
встречал вот такой массив:
arr[2][3]{5,6,3}{8,1,7}
двумерный массив в которых сразу введены значения , так же как с переменными, первые 3 числа это первый одномерный массив(в в фигурных скобках), а а другие второй одномерный массив
Harald TV спасибо. Давно разобрался посмотрев этот канал. В квадратных скопках: [число массивов] [сколько чисел в массиве]. Автору канала моё уважение и здоровья. Ах да с праздиком!
@@Dmitrii82 НУ ВОТ, НАКОНЕЦ-ТО И У ТЕБЯ ПРАЗДНИК!
что делать, если пропала мотивация и желание изучать(((
Отдохни, либо посмотри видосы о программировании, но не уроки, а просто подкасты. Мне это возвращает мотивацию))
@@husky7277 у меня уже мотивация вернулась, уже на 79 уроке)
@@аоалал-х1т Круто, за сколько времени?
аоалал как сейчас с мотивацией ?
Привет. Видео супер. Только не понял зачем было удалять и переназначать FirstArray, перед копированием. =))) Просто скопировать по элементно =)
Тоже самое хотел написать...
У тебя же массив уже заполненный там был. Ты удаляешь его значения через delete и можешь его заполнять/копировать
Мое мнение
в данном случае размер (size) этих массивов одинаковый (видимо, что бы проще понять было суть), и конкретно тут можно было не удалять, а переписать "поверх", в старый массив. но это не по фен-шую, т.к. бывают разные ситуации: если размеры массивов будут разные, или тип данных у них будет разный, или еще что то. что бы исключить все эти "или", наверняка удаляют и создают новый массив по подобию копируемого,
Да, абсолютно верно написано. В этом примере размеры одинаковые, но в общем случае нужно сделать как сделал он, только размеры массива правильные указать.
не работает передача с ключевым словом const , вот не работает и все
Пишу тот же код, но цифры разные
Ааа я тоже два раза написал Fillarray, надо было удалить
Есть кто сделал с двумерным массивом? дайте код, а то у меня как то не так получилось
Если вдруг кого интересует держите, всё работает.
Если вдруг посмотрит опытный программист скажи пожалуйста, Верно ли всё или можно как то сделать получше.
#include
#include
using namespace std;
void fillarray(int** const arr, int row, int col);
void showarray(int** const arr, int row, int col);
void main()
{
setlocale(LC_ALL, "rus");
srand(time(NULL));
int row = 5;
int col = 5;
int** FirstArray = new int* [row];
int** SecondArray = new int* [row];
for (int i = 0; i < row; i++)
{
FirstArray[i] = new int[col];
}
for (int i = 0; i < row; i++)
{
SecondArray[i] = new int[col];
}
fillarray(FirstArray, row, col);
fillarray(SecondArray, row, col);
cout
Не понял, зачем сначала удалять массив, в который потом копируем второй массив. Мы же просто перезаписываем данные из первого, а не занимаем новые ячейки памяти и никакой утечки и без первого удаления не происходит.
Ваш способ подойдёт при копировании массивов с одинаковым количеством элементов. Если кол-во элементов у массивов разное, о чем рассказывал автор в видео, необходимо удалить старый массив и создать новый с другим кол-вом элементов)
Это не копирование массивов, а перемещение данных.
Перемещение, это если бы оригинальный массив удалялся сразу после копирования. Здесь - копирование. Но думаю за полгода это стало понятно
Чтобы понять это, мне пришлось немного пострадать!
void Swap(int* arr,int*arr2, const int SIZE)
{
for (int i = 0; i < SIZE; i++)
{
swap(arr[i], arr2[i]);
}
}
Почему эту функция не использовать бы ?
с Swap проще же
Если первый массив больше по размеру второго то ничо не выйдет
при удалении данных по указателю во всех массивах кроме одного, всё будет ок
только надо будет всё-равно указывать 2-ой параметр, чтобы не выводить рандомное значение
Один раз посмотрел - скопировал одномерный массив.
Второй раз посмотрел - скопировал двумерный массив.
Что дальше?
Скопируй трёхмерный массив
😂😂
Ребят, а зачем вообще удалять первый массив и выделять ему новую память, если значения можно скопировать в старые ячейки? Это же динамический массив.
UPD: То же самое можно сделать и со статическим массивом.
В статическом массиве размер известен до компиляции, а в динамическом может быть задан в ходе выполнения программы, НО размер массива не может быть переопределён более одного раза. Многократно увеличивать размер может не массив, а Вектор, но об этом далее.
а что если циклом каждую ячейку скопировать в другой массиу?
А он как сделал
Зачем удалять уже выделенное место для первого массива и выделять новое, если можно эти выделенные места заполнить поочерёдно данными из второго массива?
Размеры массивов может различаться, если мы продолжим делать, как ты говоришь, то есть вероятность выхода за пределы массива, что непременно приведет к ошибке.
#include
using namespace std;
void zapolnenie_arr(int *arr, int size)
{
for (int i = 0; i < size; i++)
{
arr[i] = rand() % 10;
}
}
void show_arr(int *arr, int size)
{
for (int i = 0; i < size; i++)
{
cout
2019 год , 6 апреля на видео 1 дизлайк... это круто
НЕ ВЕРЮ(((
Спасибо за урок!
Спасибо Большое!
спасибо