Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19

Копирование из второго массива в первый массив с используя функцию

11.03.2021, 18:32. Показов 2412. Ответов 30

Студворк — интернет-сервис помощи студентам
Хотел написать функцию, которая копирует данные из второго массива в первый, при этом данные первого массива удаляются. Написал код, но он работает не стабильно. Если постоянно запускать программу, то она работает как задумано 50/50. Не могу найти ошибку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, const int size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
 
}
 
void ShowArr(const int* const arr, const int size) {
    //показать массив в консоли
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
 
void CopyArray( int* arr1, int* const arr2, const int sizeofArr2) {
    //копируем значения из arr2 в arr1 массив 
    //данные arr1 нам не нужны
    //массивы не всегда одинаковы по размеру
    delete[] arr1;
    arr1 = new int[sizeofArr2];
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
 
}
 
void main() {
    //setlocale(LC_ALL, "ru");
 
    //тест с одинаковыми по размеру массивами
    int size = 5;
    int* firstArr = new int[size];
    int* secondArr = new int[size];
 
    //создаю и показаваю
    cout << "first array =\t";
    FillArray(firstArr, size);
    ShowArr(firstArr, size);
 
    //создаю и показаваю
    cout << "second array =\t";
    FillArray(secondArr, size);
    ShowArr(secondArr, size);
 
    //перемещаем данные из второго массива в первый с потерей данных у первого
    CopyArray(firstArr, secondArr, size);
    cout << "first array =\t";
    ShowArr(firstArr, size);
    cout << "second array =\t";
    ShowArr(secondArr, size);
    cout << firstArr << endl;
    cout << secondArr << endl;
 
    //избавляюсь от всех массивов
    cout << "deleting arrays" << endl;
    delete[] firstArr;
    delete[] secondArr;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2021, 18:32
Ответы с готовыми решениями:

Сформировать третий массива путем вставки в первый массив элементов второго массива без нарушения упорядоченности
Даны 2 линейных массива, упорядоченные по убыванию. Написать программу, формирования третьего массива путем вставки в первый массив...

Верно, ли что все элементы второго массива входят в первый массив
Условие задачи:Даны два массива целых чисел, длиной n и m (m&lt;n). В каждом из них элементы различны. Верно, ли что все элементы второго...

Вставьте элементы второго массива в первый массив через каждые три элемента
Создайте два одномерных массива. Второй массив в три раза меньшей длины. Создайте коллекции из элементов массива. Вставьте элементы второго...

30
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
11.03.2021, 20:10  [ТС]
Студворк — интернет-сервис помощи студентам
S7,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, const int size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
 
}
 
void ShowArr(const int* const arr, const int size) {
    //показать массив в консоли
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
 
void CopyArray(int* arr1, int* arr2, int sizeofArr2) {
    //копируем значения из arr2 в arr1 массив 
    //данные arr1 нам не нужны
    //массивы не всегда одинаковы по размеру
    delete[] arr1;
    arr1 = new int[sizeofArr2];
 
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
 
}
 
void main() {
    /*
    setlocale(LC_ALL, "ru");
 
    //тест с одинаковыми по размеру массивами
    int size1 = 5;
    int size2 = 9;
    int* firstArr = new int[size1];
    int* secondArr = new int[size2];
 
    //создаю и показаваю
    cout << "first array =\t";
    FillArray(firstArr, size1);
    ShowArr(firstArr, size1);
 
    //создаю и показаваю
    cout << "second array =\t";
    FillArray(secondArr, size2);
    ShowArr(secondArr, size2);
 
    //перемещаем данные из второго массива в первый с потерей данных у первого
    CopyArray(firstArr, secondArr, size2);
    cout << "first array =\t";
    ShowArr(firstArr, size2);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
 
    cout << endl;
    cout << firstArr << endl;
    cout << secondArr << endl;
 
    //избавляюсь от всех массивов
    cout << "deleting arrays" << endl;
    delete[] firstArr;
    delete[] secondArr;
    */
 
 
    int size1 = 5;
    int size2 = 9;
    int* firstArr = new int[size1];
    int* secondArr = new int[size2];
 
    FillArray(firstArr, size1);
    FillArray(secondArr, size2);
 
    cout << "first array =\t";
    ShowArr(firstArr, size1);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
    cout << endl;
 
 
    delete[] firstArr;
    firstArr = new int[size2];
    for (int i = 0; i < size2; i++)
    {
        firstArr[i] = secondArr[i];
    }
    cout << "first array =\t";
    ShowArr(firstArr, size2);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
 
    cout << endl;
    cout << "adres firstArr " << firstArr << endl;
    cout << "adres secondArr " << secondArr << endl;
 
 
    delete[] firstArr;
    delete[] secondArr;
}
0
S7
10 / 6 / 4
Регистрация: 08.04.2020
Сообщений: 61
11.03.2021, 20:10
Потестите на своих пк, должно работать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <iomanip>
#define ll long long
#define d double
using namespace std;
void FillArray(vector <ll> &a, ll size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        a[i] = rand() % 10;
    }
    return;
}
void ShowArr(vector <ll> &a) {
    //показать массив в консоли
    for (int i = 0; i < a.size(); i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}
void makecopyofvec(vector <ll>& from, vector<ll>& to, ll size) {
    ll i;
    for (i = 0; i < size; i++) {
        to[i] = from[i];
    }
    return;
}
int main() {
    ll n;
    setlocale(LC_ALL, "ru");
    cout << "Напишите размер массива" << endl;
    cin >> n;
    vector <ll> a(n);
    FillArray(a, n);
    cout << "Массив который будет копирован" << endl;
    ShowArr(a);
    vector <ll> b(a.size());
    makecopyofvec(a, b, n);
    cout << "Копия массива" << endl;
    ShowArr(b);
    cout << "Производим обратное копирование" << endl;
    makecopyofvec(b, a, n);
    cout << "Первый массив" << endl;
    ShowArr(a);
    cout << "Второй массив" << endl;
    ShowArr(b);
    ll* adrofa = &a[0];
    ll* adrofb = &b[0];
    cout << adrofa << endl << adrofb;
    return 0;
}
1
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
11.03.2021, 20:14  [ТС]
S7,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, const int size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
 
}
 
void ShowArr(const int* const arr, const int size) {
    //показать массив в консоли
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
 
void CopyArray(int* arr1, int* arr2, int sizeofArr2) {
    //копируем значения из arr2 в arr1 массив 
    //данные arr1 нам не нужны
    //массивы не всегда одинаковы по размеру
    delete[] arr1;
    arr1 = new int[sizeofArr2];
 
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
 
}
 
void main() {
    int size1 = 5;
    int size2 = 9;
    int* firstArr = new int[size1];
    int* secondArr = new int[size2];
 
    FillArray(firstArr, size1);
    FillArray(secondArr, size2);
 
    cout << "first array =\t";
    ShowArr(firstArr, size1);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
    cout << endl;
 
 
    delete[] firstArr;
    firstArr = new int[size2];
    for (int i = 0; i < size2; i++)
    {
        firstArr[i] = secondArr[i];
    }
    cout << "first array =\t";
    ShowArr(firstArr, size2);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
 
    cout << endl;
    cout << "adres firstArr " << firstArr << endl;
    cout << "adres secondArr " << secondArr << endl;
 
 
    delete[] firstArr;
    delete[] secondArr;
}
Добавлено через 2 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
Mordoc, кое-что заменил, проверьте работу:
Проблема в том, что моя функция должна быть void и работать с указателями на память, чтобы всё на лету происходило, создать новый массив и вернуть его у меня уже идеи были, но это не то.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
11.03.2021, 20:17
Цитата Сообщение от Mordoc Посмотреть сообщение
моя функция должна быть void
понятно. просто сообщите мой вариант работает или нет
0
S7
10 / 6 / 4
Регистрация: 08.04.2020
Сообщений: 61
11.03.2021, 20:20
Цитата Сообщение от Mordoc Посмотреть сообщение
S7,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, const int size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
 
}
 
void ShowArr(const int* const arr, const int size) {
    //показать массив в консоли
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
 
void CopyArray(int* arr1, int* arr2, int sizeofArr2) {
    //копируем значения из arr2 в arr1 массив 
    //данные arr1 нам не нужны
    //массивы не всегда одинаковы по размеру
    delete[] arr1;
    arr1 = new int[sizeofArr2];
 
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
 
}
 
void main() {
    int size1 = 5;
    int size2 = 9;
    int* firstArr = new int[size1];
    int* secondArr = new int[size2];
 
    FillArray(firstArr, size1);
    FillArray(secondArr, size2);
 
    cout << "first array =\t";
    ShowArr(firstArr, size1);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
    cout << endl;
 
 
    delete[] firstArr;
    firstArr = new int[size2];
    for (int i = 0; i < size2; i++)
    {
        firstArr[i] = secondArr[i];
    }
    cout << "first array =\t";
    ShowArr(firstArr, size2);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
 
    cout << endl;
    cout << "adres firstArr " << firstArr << endl;
    cout << "adres secondArr " << secondArr << endl;
 
 
    delete[] firstArr;
    delete[] secondArr;
}
Добавлено через 2 минуты


Проблема в том, что моя функция должна быть void и работать с указателями на память, чтобы всё на лету происходило, создать новый массив и вернуть его у меня уже идеи были, но это не то.
У меня так и работает, я в функцию передаю именно ссылку на массив , если бы я писал вместо: vector <ll> &a писал:
vector <ll> a, то у меня бы копировался весь массив. Мы же только в самом начале добавляем массив и рехервируем память, а потом используем их с помощью указателей
0
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
11.03.2021, 20:32  [ТС]
S7, Я нашел одну проблему:

Находится она в функции CopyArray, когда я передаю firstArr , то функция удаляет из памяти элементы этого массива, потом
я говорю, чтобы у firstArr создался новый пустой массив на sizeofArr2 элементов. Происходит, что-то не понятное точно создается в памяти массив, его даже наполняют элементами в цикле из массива secondArr. По хорошему праметр arr1 превращается в локальный массив функции CopyArray и остается там. В итоге из функции выходит firstArr, который указывает в пустоту (то есть ссылка есть, а данных нет), в конце когда пытаются delete[] firstArr, удалять нечего и выпадает ошибка.

Вопрос как спасти firstArr и помешать arr1 стать локальным массивом.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void CopyArray(int* arr1, int* arr2, int sizeofArr2) {
    //копируем значения из arr2 в arr1 массив 
    //данные arr1 нам не нужны
    //массивы не всегда одинаковы по размеру
    delete[] arr1;
    arr1 = new int[sizeofArr2];
 
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
 
}
0
S7
10 / 6 / 4
Регистрация: 08.04.2020
Сообщений: 61
11.03.2021, 20:34
Точно не знаю, но помоему не имеет смысла внутри функции делать новый массив, ты же должен просто идти от 0 до размера массива и ставить в один массив элементы другого.
0
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
11.03.2021, 20:37  [ТС]
S7, по хорошему решения еще нет, попробую набраться опыта с функциями, ссылками и указателями. Вернусь, чтобы дать нормальное решение.
0
S7
10 / 6 / 4
Регистрация: 08.04.2020
Сообщений: 61
11.03.2021, 20:43
Цитата Сообщение от Mordoc Посмотреть сообщение
S7, по хорошему решения еще нет, попробую набраться опыта с функциями, ссылками и указателями. Вернусь, чтобы дать нормальное решение.
А мой то код чем тебя не утроил, он работает стабильно и правильно. Для передачи массива используется ссылка, реализованно с помощью функций void
0
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
11.03.2021, 20:47  [ТС]
Цитата Сообщение от S7 Посмотреть сообщение
А мой то код чем тебя не утроил, он работает стабильно и правильно. Для передачи массива используется ссылка, реализованно с помощью функций void
он не может работать с разноразмерными массивами, во всяком случае эта версия, и зачем так много библиотек <iostream> достаточно. Я еще не знаю как реализуются вектора в c++.
0
7 / 5 / 2
Регистрация: 12.02.2020
Сообщений: 19
12.03.2021, 08:24  [ТС]
Нашел окончательное решение проблемы функции CopyArray, надо было передавать массив по ссылке в виде
C++
1
 *&имя_массива
Таким образом в функции не появляются фантомные массивы и существующие массивы не выходят пустые
Код работает только на ссылках массивов, присвоений массива к массиву нет, всё работает в функции, массивы могут быть разного размера. Главное массивы должны быть одного типа данных.

Окончательный код с тестированием на разноразмерных массивах.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, const int size) {
    //массив заполняется случайными значениями
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
}
 
void ShowArr(const int* const arr, const int size) {
    //показать массив в консоли
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << "\t";
    }
    cout << endl;
}
 
void CopyArray(int*& arr1, int* const arr2, const int sizeofArr2) {
 
    delete[] arr1;
    arr1 = new int[sizeofArr2];
    for (int i = 0; i < sizeofArr2; i++)
    {
        arr1[i] = arr2[i];
    }
    
}
 
 
void main() {
    setlocale(LC_ALL, "ru");
 
    //тест с массивами
    int size1 = 5;
    int size2 = 9;
    int* firstArr = new int[size1];
    int* secondArr = new int[size2];
 
    //заполняю и показаваю
    cout << "first array =\t";
    FillArray(firstArr, size1);
    ShowArr(firstArr, size1);
 
    //заполняю и показаваю
    cout << "second array =\t";
    FillArray(secondArr, size2);
    ShowArr(secondArr, size2);
 
    //перемещаем данные из второго массива в первый с потерей данных у первого
    CopyArray(firstArr, secondArr, size2);
    
    cout << "first array =\t";
    ShowArr(firstArr, size2);
    cout << "second array =\t";
    ShowArr(secondArr, size2);
    
    cout << endl;
    //адреса
    cout <<"firstArr adress =\t"<<firstArr << endl;
    cout <<"secondArr aresss =\t"<< secondArr << endl;
 
    //избавляюсь от всех массивов
    cout << "deleting arrays" << endl;
    delete[] firstArr;
    delete[] secondArr;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2021, 08:24

Обнуляет первый заданный массив вещественного типа,если среднее арифметическое элементов второго массива меньше единицы
Всем привет. Помогите написать функцию которая обнуляет первый заданный массив вещественного типа,если среднее арифметическое элементов...

Используя функцию копирования строк, организуйте конкатенацію и копирование строк в четвертый массив, содержащий полные имена
Пожалуйста с этим заданием. Написать программу, которая описывает четыре массива. Три первых массива должны содержать имена, фамилии и...

Отсортировать массив по убыванию, используя функцию поиска максимального элемента массива
Всем привет! Суть такова: Ввести одномерный массив A, вывести его. Найти номер максимального элемента массива. Отсортировать массив по...

Рассортировать массив по убыванию числа от начала массива до первого экстремума, от первого до второго, от второго до конца массива.
Посмотрите и помогите кто может PLEASE Создать два одномерных массива А и В различной длинны. Определить MAX и MIN значение с...

Пересортировать массив используя подпрограммы и Написать подпрограмму функцию определяющую число элементов массива.
Здравствуйте. Если это возможно,хотелось бы попросить помощи в рещении нескольких задач. 1) Дан линейный массив из 15 целых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru