Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422

Как вернуть массив из функции?

30.01.2020, 17:34. Показов 4450. Ответов 29

Студворк — интернет-сервис помощи студентам
Изучал массивы в C++, хотел написать функцию которая принимает, изменяет и возвращает массив:
C++
1
2
3
4
5
6
7
        numbers[] = { 1,1,1,1,1 };
    int num() {
        numbers[] = { 1,2,3,4,5 };
        return numbers;
    }
 
    cout << num();
Но компилятор естественно жалуется на несовместимый тип данных, а переменные вне функции уже,как правило, не видны. Буду рад любым идеям и подсказкам
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2020, 17:34
Ответы с готовыми решениями:

Как вернуть массив в данной функции ? Или как записать массив в переменную ?
#pragma once #include &quot;stdafx.h&quot; const int S = 49; int bin2; int decbin(int a, int sistem) { double b;

Как вернуть массив из функции?
В общем есть функция: ? foo() { array&lt;array&lt;double, N&gt;, 10&gt; Wave; .... return ?; } Как правильно написать return?

Как вернуть массив из функции?
не могу передать массив из функции mas(). Как передать массив из функции и записать в массив arr()? #include &quot;stdafx.h&quot; ...

29
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.02.2020, 21:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SalavatGood Посмотреть сообщение
Это из STL библиотеки?
Да. А вам по условию задачи нельзя пользоваться STL?
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
01.02.2020, 22:37
если STL использовать нельзя, то остаётся только new, или делать статический массив мега-размеров. У меня вопрос знатокам:

Цитата Сообщение от SalavatGood Посмотреть сообщение
стоить задача распарраллелить на потоки любую сортировку
это имеет смысл, и вообще - так делают? Понятно, что можно разбить условный массив 1, 2, 10, 50, 4, 1000, 51, 8, 3, 100
на 2 одинаковых части и параллельно эти части отсортировать. Потом опять разбить каждую часть на 2 и отсортировать и т. д. но всё же?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.02.2020, 23:03
Цитата Сообщение от Recrut_rf Посмотреть сообщение
это имеет смысл, и вообще - так делают?
Для больших массивов смысл есть. Сортировка в один поток - N*log2(N). Сортировка в два потока - N/2*(log2(N)-1) плюс слияние отсортированных половинок за линейное время (а для квиксорта и сливать ничего не надо). При больших log(N) вполне окупается. При маленьких - накладные расходы на создание потоков могут перевесить все выгоды от этой затеи.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
02.02.2020, 01:19
Цитата Сообщение от Renji Посмотреть сообщение
Есть ли такие виды массивов, которые не просят констант?
В С++ нету массивов, которые не требуют заведомо известного размера на этапе компиляции.

Поэтому пользуйтесь советом и начните с простого - с std::vector
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
02.02.2020, 10:27  [ТС]
Насколько мне известно вообще сортировка слиянием подходит для распараллеливания, поскольку основана на разбиении массивов, но пока что не могу найти достаточно материалов для решения данной задачи...
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
02.02.2020, 14:49
SalavatGood, я не понимаю чего тебя смущает. Быстрая сортировка это действительно неплохой алгоритм для распараллеливания.
Никакое копирование массивов в нём не нужно,
никакое изменение размеров массива не нужно,
никакой возврат массива из функции не нужен,
никакая передача массива в функцию как параметр не нужен.
Что мешает написать какой-нибудь типа
C++
1
2
3
4
5
void qsort(left, right)
{
  thread(qsort, left, mid);
  thread(qsort, mid, right);
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.02.2020, 21:15
Вообще быстрая сортировка рекурсивный алгоритм поэтому тут наверное нужен пул потоков.

Вроде в новых стандартах обещали распараллеленные алгоритмы из коробки.
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
03.02.2020, 14:28  [ТС]
Kuzia domovenok, просто не получается составить алгоритм, который подошёл бы для распараллеливания

Добавлено через 17 минут
Я составил алгоритм, руководствуясь из одного источника, но он сортирует некорректно, если указать количество элементов больше чем 12:
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
#include<iostream>
using namespace std;
 
 
void FillArray(int arr[], const int size)
{
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
}
 
void PrintArray(int arr[], const int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}
 
//Функция быстрой сортировки
void quickSort(int arr[], const int size, int left, int right)
{
    int pivot;
    int l_hold = left;
    int r_hold = right;
    pivot = arr[left];
 
    while ((arr[right] >= pivot) && (left < right))
    {
        right--;
    }
    if (left != right)
    {
        arr[left] = arr[right];
        left++;
    }
 
    while ((arr[left] <= pivot) && (left < right))
    {
        left++;
    }
    if (left != right)
    {
        arr[right] = arr[left];
        right--;
    }
    arr[left] = pivot;
    pivot = left;
    left = l_hold;
    right = r_hold;
 
    if (left < pivot)
    {
        quickSort(arr, size, left, pivot - 1);
    }
    if (right > pivot)
    {
        quickSort(arr, size, pivot + 1, right);
    }
 
}
 
 
//входная функция
void Quick_sort_2()
{
    setlocale(LC_ALL, "ru");
    const int SIZE = 12;
    int a[SIZE];
    FillArray(a, SIZE);
    PrintArray(a, SIZE);
 
    quickSort(a, SIZE, 0, SIZE - 1);
    PrintArray(a, SIZE);
    
    system("pause");
}
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
03.02.2020, 19:49
SalavatGood, держи

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
#include <iostream>
#include <ctime>
#include <future>
 
 
using namespace std;
 
 
// класс для определения времени выполнения кода
class SimpleTimer
{
public:
    SimpleTimer()
    {
        start = std::chrono::high_resolution_clock::now();
    }
 
    ~SimpleTimer()
    {
        end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<float> duration = end - start;
 
        cout << "DURATION " << duration.count() << " s" << endl;
    }
 
private:
    std::chrono::time_point<std::chrono::steady_clock> start, end;
 
};
 
 
int partition(int arr[], int low, int high)
{
    int pivot = arr[high];
    int i = low - 1;
    for (int j = low; j < high; ++j)
    {
        if (arr[j] < pivot)
        {
            ++i;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[++i], arr[high]);
    return i;
}
 
 
void quickSort(int arr[], int low, int high)
{
    if (low < high)
    {
        int pi = partition(arr, low, high);
 
        // не параллельно
        //quickSort(arr, low, pi - 1);
        //quickSort(arr, pi + 1, high);
 
        // параллельно
        std::future<void> result1(std::async(quickSort, arr, low, pi - 1));
        std::future<void> result2(std::async(quickSort, arr, pi + 1, high));
    }
}
 
 
int main()
{
    SimpleTimer sT; // для определения затраченного времени    (если не нужно, то можно убрать)
    
    int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
 
    quickSort(arr, 0, 9);
    
    for (auto val : arr) std::cout << val << ' ';
    
    cout << endl;
}
Вроде работает, не знаю точно, это нужно или нет. Код вроде рабочий, но весь выигрыш будет заметен лишь на здоровенных коллекциях

Добавлено через 8 минут
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Вроде работает
АААА, нет, не работает, сейчас протестировал и - не работает так как нужно - не сортирует нормально. В общем я сдаюсь - думал, думал как сделать - больше идей нет. увы
1
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
03.02.2020, 20:50  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Dynamic_Array()
{
    setlocale(LC_ALL, "ru");
 
    int num; //размер массива
    cout << "Введите размер массива: ";
    cin >> num;
 
    int *d_arr = new int[num]; //выделение памяти для массива
    for (int i = 0; i < num; i++)
    {
        d_arr[i] = i;
        cout << d_arr[i] << ' ';
    }
    delete[] d_arr;
 
    system("pause");
}
В общем, думаю через динамический массив сделать, чтобы можно было количество элементов изначально задать(для сравнения по времени, среднее арифметическое число можно взять из середины диапазона рандомного генератора чисел для массива (чтобы длины подмассивов примерно одинаковыми были) и разделить массив на два подмассива: меньшее и большее арифметического числа. И вот эти два подмассива уже пустить по потокам через библиотеку <thread> по быстрой сортировке. Но вся проблема в том, что эту самую функцию быстрой сортировки еще надо каким то образом сделать
Recrut_rf, время выполнения можно посчитать еще так:
C++
1
2
3
4
5
st = GetTickCount();
bubbleSort( a, size );
en = GetTickCount();
 
printf( "%d ms\t", en-st );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2020, 20:50

Как вернуть массив из функции?
int SumElementovStolbca(int M, int mas, int N) { int sum = 0; for (int i = 0; i&lt;N; i++) { for (int j = 0; j&lt;N; j++) {...

Как вернуть массив из функции?
Please! #include &lt;iostream&gt; using namespace std; int _plus1 (int array ) { for (int i = 0; i &lt; 5; i++){ array...

Как вернуть массив из функции?
у меня есть две функции: Одна должна возвращать три числа, а вторая двумерный массив 10Х10; Как это провернуть?

Как вернуть массив из функции?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int mass(int n) { int* Mass = new int; //здесь...

Как из функции вернуть массив символов?
Здравствуйте.Как возвратить массив символов?Читал другие темы,понял что надо создавать динамическую память,потом удалять её,по другому...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru