14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422

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

30.01.2020, 17:34. Показов 4281. Ответов 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
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 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
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru