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

Возвратить массив из функции

25.01.2014, 16:34. Показов 1563. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код на FPC Lazarus, нада его точь в точь перевести в си++, я специально придумал этот пример для наглядности, мне нужно научиться возврашать массивные типы из функции.
И создавать свои массивные типы
Delphi
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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
  massiv_type = array[0..2] of real;
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
function give_me(a:real; b:real; c:real):massiv_type;
var
res:massiv_type;
begin
  res[0]:=a*2;
  res[1]:=b*2;
  res[2]:=c*2;
 
  Result:=res;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
  var
 res:massiv_type;
begin
   res:=give_me(1,-5,4);
   ShowMessage('1 ='+FloatToStr(res[0]));
   ShowMessage('2 ='+FloatToStr(res[1]));  ShowMessage('3 ='+FloatToStr(res[2]));
end;
 
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2014, 16:34
Ответы с готовыми решениями:

Возвратить массив из функции
как мне из функции input items возвратить мой массив?вот код protected: int ArrayLenght; int Amount; int *SortArray; ...

Возвратить массив из функции
Вопрос стар как мир it, но неопытному человеку, пока его не ткнут носом почти невозможно самому разобраться. Вообщем, как возвратить из...

Как принять и возвратить массив в другой функции?
пример: прототип функции ??? int main() { создаём функцию которая задаёт массив b выводим обнавлённый массив }

12
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
25.01.2014, 16:45
Цитата Сообщение от Samat B Посмотреть сообщение
мне нужно научиться возврашать массивные типы из функции.
а нельзя ли просто попросить написать пример как это делается?

Добавлено через 4 минуты
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
#include <iostream>
 
int *arrayCreate(size_t arraySize);
 
int main()
{
    size_t arraySize;
    std::cout << "Size of array: ";
    std::cin >> arraySize;
 
    int *array = arrayCreate(arraySize);
    for (size_t i = 0; i < arraySize; i++) {
        std::cout << array[i] << ' ';
    }
    std::cout << std::endl;
 
    delete [] array;
    array = nullptr;
 
    std::system("pause");
    return 0;
}
 
int *arrayCreate(size_t arraySize)
{
    int *array = new int [arraySize]; //выделяем память под массив, который будем возвращать из функции
    for (size_t i = 0; i < arraySize; i++) { //заполняем массив
        array[i] = (i + 1);
    }
    return array; //возвращаем
}
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2014, 16:47
Возвращайте std::vector.

Можно конечно память в функции выделять, но тогда нужно помнить о том, что её нужно обязательно перехватить и не забыть удалить. В общем не очень хороший прием.
1
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
25.01.2014, 16:49
Возвращай указатель на массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int *give_me(int a, int b, int c)
{
    int *p=new int[3];
 
    p[0]=a*2;
    p[1]=b*2;
    p[2]=c*2;
    return p;
}
int main ()
{
    int *p;
    p=give_me(3,2,5);
    cout<<"1="<<*p++<<endl<<"\n";
    cout<<"2="<<*p++<<endl<<"\n";
    cout<<"3="<<*p++<<endl<<"\n";
    system("pause");
    return 0;
}
1
0 / 0 / 2
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 16:49  [ТС]
Ev[G]eN, вот моя программа на паскале пример решения квадратного уравнения
Delphi
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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
  massiv_type = array[0..2] of real;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
function diskriminant(a:real; b:real; c:real):massiv_type;
var
d:real;
x_1:real;
x_2:real;
res:massiv_type;
begin
   d:=(b*b)-(4*a*c);
   if d>=0 then
   begin
        x_1:=(-b-Sqrt(d))/2*a;
        x_2:=(-b+Sqrt(d))/2*a;
 
        res[0]:=d;
        res[1]:=x_1;
        res[2]:=x_2;
   end;
 
   if d<0 then
   begin
        res[0]:=d;
        res[1]:=0;
        res[2]:=0;
   end;
 
Result:=res;
end;
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
 res:massiv_type;
begin
   res:=diskriminant(1,-5,4);
   ShowMessage('Дискриминант='+FloatToStr(res[0]));
   ShowMessage('X_1 ='+FloatToStr(res[1]));
   ShowMessage('X_2 ='+FloatToStr(res[2]));
 
end;
 
end.
я ее почти перевел на си++, только не могу разобраться с возвратом массивного типа вот исходник си++
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
#include <iostream>
 
using namespace std;
 
 
float diskriminant(float a, float b, float c)
{
    float d;
    float x_1;
    float x_2;
    //res:massiv_type;
 
        d = (b*b)-(4*a*c);
        if (d>=0)
        {
            //x_1=(-b-Sqrt(d))/2*a;
            //x_2=(-b+Sqrt(d))/2*a;
 
            //res[0]:=d;
            //res[1]:=x_1;
            //res[2]:=x_2;
        }
 
        if (d<0)
        {
            //res[0] = 0;
            //res[1] = 0;
            //res[2] = 0;
        }
 
    return d;
}
 
int main()
{
    float res;
 
    res = diskriminant(1,-5,4);
    cout << "diskriminant="<< endl;
    cout << res<< endl;
 
    return 0;
}
0
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
25.01.2014, 16:52
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
float *diskriminant(float a, float b, float c, size_t arraySize = 3)
{
    float d;
    float x_1;
    float x_2;
    //res:massiv_type;
 
    float *res = new float [arraySize];
 
    d = (b*b) - (4 * a*c);
    if (d >= 0)
    {
        x_1=(-b-sqrt(d))/2*a;
        x_2=(-b+sqrt(d))/2*a;
 
        res[0] = d;
        res[1] = x_1;
        res[2] = x_2;
    }
 
    if (d<0)
    {
        res[0] = 0;
        res[1] = 0;
        res[2] = 0;
    }
 
    return res;
}
 
int main()
{
    float *res = diskriminant(1, -5, 4);
    cout << "diskriminant=" << endl;
    for (size_t i = 0; i < 3; i++) {
        cout << res[i] << ' ';
    }
    cout << endl;
 
    delete [] res;
    res = nullptr;
 
    system("pause");
    return 0;
}
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
25.01.2014, 16:52
Samat B, конкретно в данном случае я бы вернул не массив, а структуру.
2
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
25.01.2014, 16:56
Цитата Сообщение от 0x10 Посмотреть сообщение
Samat B, конкретно в данном случае я бы вернул не массив, а структуру.
Вот точно лучшее конкретной задачи!
1
0 / 0 / 2
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 17:22  [ТС]
Ev[G]eN,
41я строчка вашего кода. переменная size_t обьявлялась не как глобальная переменная, ее можно использовать везде в коде?
46 и 47ые строчки. Зачем они нужны?
0
Mobile Software Engineer
Эксперт С++
 Аватар для Ev[G]eN
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
25.01.2014, 17:25
Цитата Сообщение от Samat B Посмотреть сообщение
переменная size_t
size_t это вообще тип, и в 41 строке это тоже самое, что for (int i = 0; ...). она используется как счетчик цикла и индекс элемента массива
в 46 и 47 строке освобождаем память, которые выделяли под указатель и обнуляем его, соответственно
1
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
25.01.2014, 17:29
Цитата Сообщение от Samat B Посмотреть сообщение
46 и 47ые строчки
Очистка памяти, выделенной под массив. Я когда писал на Delphi тоже не задумывался а сейчас часто, нарываюсь на проблемы: то чищу раньше времени, то забываю это сделать и как следствия утечка памяти, жутко противная вещь когда работаешь с огромными массивами....
Цитата Сообщение от Samat B Посмотреть сообщение
41я строчка вашего кода. переменная size_t объявлялась не как глобальная переменная, ее можно использовать везде в коде?
это локальная переменная она видна только в теле цикла
1
0 / 0 / 2
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 18:21  [ТС]
Ev[G]eN,
C++
1
2
3
4
5
6
||=== Build: Debug in disk (compiler: GNU GCC Compiler) ===|
D:\project\4_my_blog\7_Kvadratnoe_uravnenie\c++\mat_easy\main.cpp|47|warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]|
D:\project\4_my_blog\7_Kvadratnoe_uravnenie\c++\mat_easy\main.cpp||In function 'int main()':|
D:\project\4_my_blog\7_Kvadratnoe_uravnenie\c++\mat_easy\main.cpp|47|error: 'nullptr' was not declared in this scope|
D:\project\4_my_blog\7_Kvadratnoe_uravnenie\c++\mat_easy\main.cpp|49|error: 'system' was not declared in this scope|
||=== Build failed: 2 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Добавлено через 46 минут
вот решение добавил в код
#define nullptr NULL и закоментировал //system("pause");
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2014, 18:29
Поставьте во флагах компиляции -std=c++11

Добавлено через 24 секунды
C++
1
#include <cstdlib>
функция system определена в нем
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2014, 18:29
Помогаю со студенческими работами здесь

Как возвратить созданый динамический двухмерный массив из функции в main?
Надо из функции mtx возвртить матрицу в главную функцию. Матрица создаеться и заполняеться в mtx. Подскажите как правильно его...

Не удается возвратить значение функции
Функция arr() должна посчитать количевство шагов цикла while и вернуть их в main, но при запуске кроме черного экрана ничего не видно, что...

Возвратить из функции два значения
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double F(double x) { double f = 0; f = pow(x, 1/2)+ pow(x,...

Как возвратить пару (pair) в функции
Мне надо возвратить пару (pair) состоящую из суммы элементов вектора и произведения элементов вектора. Ниже текст проги. Как правильно...

Как возвратить несколько значений в функции?
Функция, реализующая обобщенный алгоритм Евклида. Нужно вернуть 3 значения: gcd, x и y. То есть нужно возвратить значения массива U....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru