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

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

30.01.2020, 17:34. Показов 4274. Ответов 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,476
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,476
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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru