0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 10
1

Вывод нового массива из функции

23.03.2020, 22:06. Показов 423. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вывод нового массива из функции. Странная ситуация с delete[]arr_2 (строка 40). Через откладку демонстрирую работу программы. Программа работает со сбоями после вывода нового массива, поэтому начну с функции которая выводит его. Я вижу, что функция возвращает размер и сам массив в основную программу.
Кликните здесь для просмотра всего текста
Дальше, я вывожу его, чтоб проверить правильность (в консоли это строка с некоторым интервалом после матрицы). Чтобы закончить работу, я очищаю память.Память матрицы очистилась, мы видим по откладке.
Кликните здесь для просмотра всего текста
Дальше перехожу к очистке массива arr_2(строка 40). В этом месте выскакивает ошибка, которую я пропускаю, и дальше программа успешно очищает память arr_2 и открывает окно с исключениями.
При всем этом, эта программа запускается без проблем на другом ПК. Стоит ли разбираться в коде или просто забить и считать, что проблема в вижуале?


Код программы
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
/*Дан вещественный массив А размера NxN. Сформировать одномерный динамический массив из элементов исходного массива, расположенных над главной диагональю.*/
#include <iostream>
 
using namespace std;
 
void read(int **arr, int N);//функция инициализации исходной матрицы случайными числами
int * separation(int **arr, int N, int *new_arr_size); //функция отделения элементов матрицы, которые находятся над главной диагональю, и вывод в новый одномерный массив
void main()
{
    setlocale(LC_ALL, "Russian");
    int N;//размерность квадратной матрицы
    cout << "Введите размерность квадратной матрицы:";
    cin >> N;//инициализация квадртаной матрицы
    int **arr_1 = new int *[N];
    for (int i = 0; i < N; i++)
    {
        arr_1[i] = new int[N];
    }
    read(arr_1, N);//инициализация исходной матрицы случайными числами
    cout << endl;
    cout << endl;
 
    int * arr_2;// создание нового массива
    int new_arr_N;//размерность нового массива
 
    arr_2 = separation(arr_1, N, &new_arr_N);//отделение элементов матрицы, которые находятся над главной диагональю, и вывод в новый одномерный массив
 
    for (int i = 0; i < new_arr_N; i++)
    {
        cout.width(5);
        cout << arr_2[i] << ";";//проверка значений элементов над главн. диагональю матрицы
    }
    cout << endl;
    for (int i = 0; i < N; i++)
    {
        delete[] arr_1[i];// освобождение памяти МАТРИЦЫ
    }
    delete[]arr_1;//освобождение памяти МАТРИЦЫ
 
    delete[]arr_2;//освобождение памяти МАССИВА
    system("pause");
 
}
 
void read(int **arr, int N)
{
    cout << "Исходный массив:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            arr[i][j] = -40 + rand() % 75;//инициализация случайными числами от -40 до 
            cout.width(5);
            cout << arr[i][j];
        }
        cout << endl;
    }
};
int * separation(int **arr, int N, int *new_arr_size)
{
    int size = 0;//количество элементов, которые находятся над главной диагональю
    int * new_arr = new int[size];//создание массива, в который будут заноситься значения элементов матрицы
    for (int i = 0; i < N; i++)
    {
 
        for (int j = 0; j < N; j++)
        {
            if (i < j)
            {
 
                new_arr[size] = arr[i][j];//инициализация массива
                size++;//счетчик элементов
            }
        }
 
    }
 
    *new_arr_size = size;//передача размерности массива
    return new_arr;//возврат массива в основную программу
 
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2020, 22:06
Ответы с готовыми решениями:

Вывод нового массива
Записать в массив N подряд номера положительных элементов массива- ва (a,a,...,a). Непонятно...

Вывод нового одномерного массива с данными из двумерного
Есть задача (закомментирована в коде) //4.Дана матрица A(nn).Сформировать одномерный массив из...

Ошибка в функции образования нового массива через квадратное уравнение
Добрый день. Имеется следующая функция и компилятор выводит ошибку : error: invalid conversion from...

Функции двумерного массива. Транспонировать матрицу через ввод вывод функции двумерного массива.
Транспонировать матрицу через ввод вывод функции двумерного массива.Сначала вывести ее,а потом...

7
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,333
23.03.2020, 22:13 2
строки 61-62
C++
1
2
    int size = 0;
    int * new_arr = new int[size];
массив с размером 0 - неопределённое поведение
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
23.03.2020, 22:27 3
Цитата Сообщение от Алексей1153 Посмотреть сообщение
строки 61-62
C++
1
2
    int size = 0;
    int * new_arr = new int[size];
массив с размером 0 - неопределённое поведение
Размер 0 в new[] не является и никогда не являлся неопределенным поведением. new[] без проблем создает массив размера 0.

Попытка доступа к элементам такого массива - вот это действительно неопределенное поведение.
0
0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 10
24.03.2020, 01:42  [ТС] 4
Размер массива растёт вместе с переменной size. А с помощью new_arr[size] я инициализирую массив
C++
1
new_arr[size] = arr[i][j];/
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
24.03.2020, 01:59 5
Цитата Сообщение от Deika_ Посмотреть сообщение
Размер массива растёт вместе с переменной size.
С чего вы взяли это? Его леший увеличивает неведанным магическим образом?
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.03.2020, 02:29 6
Deika_, по условию:
Цитата Сообщение от Deika_ Посмотреть сообщение
Дан вещественный массив
требований насчёт функций не вижу
Цитата Сообщение от Deika_ Посмотреть сообщение
Дан вещественный массив А размера NxN. Сформировать одномерный динамический массив из элементов исходного массива, расположенных над главной диагональю.
размер одномерного массива определяется как число элементов матрицы минус число элементов диагонали разделить на 2
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int N, M, p=0;
    cout << "N="; cin >> N;
    
      double **A = new double*[N];
    for (int i = 0; i < N; i++)
         A[i]=new double[N];
         
    M=(N*N-N)/2;     
         
        double *B = new double[M]; 
    
    cout << "Matrrix A:\n";
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
        A[i][j]=0.1*(rand()%100);
        if(i<j) B[p++]=A[i][j];
        cout << setw(3) << A[i][j] << "  ";
        }
    cout << "\n";
    }
    
    cout << "Array B:\n";
    for (int i = 0; i < M; i++)             
        cout << B[i] << "  ";        
    cout << "\n"; 
    
    for (int i = 0; i < N; i++)
    delete[]A[i];
    delete[]A;
    delete[]B;
system("pause");
return 0;
}
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
24.03.2020, 03:57 7
Цитата Сообщение от Deika_ Посмотреть сообщение
Размер массива растёт вместе с переменной size.
В языке С++ массив никогда никуда сам по себе не растет, тем более вместе с какой-то переменной. Массивы в С++ в принципе не могут расти. Если вам нужно увеличить размер массива, то вам придется создать новый большего размера, скопировать в него данные и уничтожить старый. Причем делать все это придется именно вам, вручную.
1
0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 10
25.03.2020, 19:45  [ТС] 8
Действительно, была ошибка в этом объявлении массива. Пришлось два раза переписывать один и тот же цикл.
0
25.03.2020, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2020, 19:45
Помогаю со студенческими работами здесь

Открытые функции класса: ввод массива, вывод массива, определение длины вектора
Данные класса: массив N(10). Открытые функции класса: ввод массива, вывод массива, определение...

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

Вывод массива из функции С++
Вобщем, нашел код в интернете (консольное приложение) алгоритм Дейкстра #include&lt;iostream.h&gt;...

Вывод массива из функции
Здравствуйте! Искал ответ на сайтах, но никак не получается найти свой случай. Хочу переписать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru