Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 10

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

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

Студворк — интернет-сервис помощи студентам
Вывод нового массива из функции. Странная ситуация с 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2020, 22:06
Ответы с готовыми решениями:

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

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

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

7
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
23.03.2020, 22:13
строки 61-62
C++
1
2
    int size = 0;
    int * new_arr = new int[size];
массив с размером 0 - неопределённое поведение
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
23.03.2020, 22:27
Цитата Сообщение от Алексей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  [ТС]
Размер массива растёт вместе с переменной size. А с помощью new_arr[size] я инициализирую массив
C++
1
new_arr[size] = arr[i][j];/
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.03.2020, 01:59
Цитата Сообщение от Deika_ Посмотреть сообщение
Размер массива растёт вместе с переменной size.
С чего вы взяли это? Его леший увеличивает неведанным магическим образом?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.03.2020, 02:29
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Эксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
24.03.2020, 03:57
Цитата Сообщение от Deika_ Посмотреть сообщение
Размер массива растёт вместе с переменной size.
В языке С++ массив никогда никуда сам по себе не растет, тем более вместе с какой-то переменной. Массивы в С++ в принципе не могут расти. Если вам нужно увеличить размер массива, то вам придется создать новый большего размера, скопировать в него данные и уничтожить старый. Причем делать все это придется именно вам, вручную.
1
0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 10
25.03.2020, 19:45  [ТС]
Действительно, была ошибка в этом объявлении массива. Пришлось два раза переписывать один и тот же цикл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2020, 19:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru