Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Samat B
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 16:34     Возвратить массив из функции #1
Вот код на 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.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
25.01.2014, 16:45     Возвратить массив из функции #2
Цитата Сообщение от 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; //возвращаем
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
25.01.2014, 16:47     Возвратить массив из функции #3
Возвращайте std::vector.

Можно конечно память в функции выделять, но тогда нужно помнить о том, что её нужно обязательно перехватить и не забыть удалить. В общем не очень хороший прием.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
25.01.2014, 16:49     Возвратить массив из функции #4
Возвращай указатель на массив:
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;
}
Samat B
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 16:49  [ТС]     Возвратить массив из функции #5
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;
}
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
25.01.2014, 16:52     Возвратить массив из функции #6
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;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
25.01.2014, 16:52     Возвратить массив из функции #7
Samat B, конкретно в данном случае я бы вернул не массив, а структуру.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
25.01.2014, 16:56     Возвратить массив из функции #8
Цитата Сообщение от 0x10 Посмотреть сообщение
Samat B, конкретно в данном случае я бы вернул не массив, а структуру.
Вот точно лучшее конкретной задачи!
Samat B
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 17:22  [ТС]     Возвратить массив из функции #9
Ev[G]eN,
41я строчка вашего кода. переменная size_t обьявлялась не как глобальная переменная, ее можно использовать везде в коде?
46 и 47ые строчки. Зачем они нужны?
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
25.01.2014, 17:25     Возвратить массив из функции #10
Цитата Сообщение от Samat B Посмотреть сообщение
переменная size_t
size_t это вообще тип, и в 41 строке это тоже самое, что for (int i = 0; ...). она используется как счетчик цикла и индекс элемента массива
в 46 и 47 строке освобождаем память, которые выделяли под указатель и обнуляем его, соответственно
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
25.01.2014, 17:29     Возвратить массив из функции #11
Цитата Сообщение от Samat B Посмотреть сообщение
46 и 47ые строчки
Очистка памяти, выделенной под массив. Я когда писал на Delphi тоже не задумывался а сейчас часто, нарываюсь на проблемы: то чищу раньше времени, то забываю это сделать и как следствия утечка памяти, жутко противная вещь когда работаешь с огромными массивами....
Цитата Сообщение от Samat B Посмотреть сообщение
41я строчка вашего кода. переменная size_t объявлялась не как глобальная переменная, ее можно использовать везде в коде?
это локальная переменная она видна только в теле цикла
Samat B
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 170
25.01.2014, 18:21  [ТС]     Возвратить массив из функции #12
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");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 18:29     Возвратить массив из функции
Еще ссылки по теме:

C++ Как возвратить несколько значений в функции?
C++ Как функции возвратить ссылку на объект?
Возвратить массив из функции C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
25.01.2014, 18:29     Возвратить массив из функции #13
Поставьте во флагах компиляции -std=c++11

Добавлено через 24 секунды
C++
1
#include <cstdlib>
функция system определена в нем
Yandex
Объявления
25.01.2014, 18:29     Возвратить массив из функции
Ответ Создать тему
Опции темы

Текущее время: 17:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru