Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/31: Рейтинг темы: голосов - 31, средняя оценка - 4.55
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
1

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

15.05.2010, 16:57. Просмотров 5525. Ответов 22
Метки нет (Все метки)

Как вернуть массив из функции и узнать его размер?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 16:57
Ответы с готовыми решениями:

Почему функция не может вернуть массив, но может вернуть структуру содержащий массив?
Почему функция не может вернуть массив, но может вернуть структуру содержащую...

Как вернуть массив?
Как правильно вернуть локальный массив (вместе с размером) из одной функции в...

Как вернуть массив?
Функция вроде как работает. Но функция "printMass(mas, l);" дожа выводить этот...

Как вернуть массив
Можно ли вернуть массив через возвращаемое значение? Если нет, то как можно...

Как вернуть массив?
Есть программа #include "stdafx.h" int fun1(int mas,int r) { int i;...

22
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:02 2
SSxMe, возвратить - легко, узнать размер - никак.
Так что, тем или иным образом необходимо сообщить вызывающей функции и адрес массива и его размер.
Самый простой вариант:
C++
1
2
3
4
5
6
7
8
9
struct Array {
  int* p;
  int size;
}
 
Array CreateArray(int size) {
  Array result = { new int[size], size };
  return result;
}
2
Adler
79 / 79 / 19
Регистрация: 07.05.2009
Сообщений: 316
15.05.2010, 17:04 3
Верни указатель на первый элемент. А если нужен размер, то никак.
Зато можно завернуть указатель и размер массива в структуру и её вернуть как результат вызова функции.

Добавлено через 22 секунды
неуспел
1
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:06  [ТС] 4
спасибо всем))
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
15.05.2010, 17:07 5
Еще вариант malloc

Добавлено через 36 секунд
Как раз из функции массив может вернуть.
0
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:07  [ТС] 6
Еще вариант malloc
а это вроде бы устаревшее
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:07 7
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Еще вариант malloc
Для СИ - вариант, для С++ - нет.
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
15.05.2010, 17:08 8
а это вроде бы устаревшее
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:08 9
Цитата Сообщение от SSxMe Посмотреть сообщение
а это вроде бы устаревшее
Для СИ другого способа нет.
0
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:09  [ТС] 10
Я на с++ пишу
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:11 11
Цитата Сообщение от SSxMe Посмотреть сообщение
Я на с++ пишу
Если ограничений нет - используй std::vector и не парься с памятью, размерами и т.д.
1
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:20  [ТС] 12
спасибо, вот так сделал..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
using namespace;
 
vector<int> AnyFunction(){
    vector<int> AnyArray;
    AnyArray.push_back(3);
    AnyArray.push_back(6786);
    ...
    return AnyArray;
}
 
int main(){
    
    vector<int> AnyArray = AnyFunction(); // вернуть массив
    cout<<AnyArray.size()<<endl; // узнать размер массива
    return 0;
}
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.05.2010, 17:20 13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
и не парься с памятью, размерами и т.д.
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:23 14
Цитата Сообщение от alex_x_x Посмотреть сообщение
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
std::vector можно и по значению возвращать, тогда париться не придется.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.05.2010, 17:25 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
using namespace std;
 
void AnyFunction(vector<int>& AnyArray){
    AnyArray.push_back(3);
    AnyArray.push_back(6786);
    ...
}
 
int main(){
    
    vector<int> AnyArray;
           AnyFunction( AnyArray ); // вернуть массив
    cout<<AnyArray.size()<<endl; // узнать размер массива
    return 0;
}
так избавишься от бесполезных копирований

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
std::vector можно и по значению возвращать, тогда париться не придется.
дада, вы правы, но это приведет к вызову конструктора копирования
1
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:26 16
Цитата Сообщение от alex_x_x Посмотреть сообщение
дада, вы правы, но это приведет к вызову конструктора копирования
Ну чтож, придется выбирать между быстродействием и удобством. Не думаю, что первый фактор является определяющим.
alex_x_x, vector<int> AnyArray; забыл убрать из функции.
0
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:34  [ТС] 17
А если у меня есть в определении класса массив, который формируется одной из функций класса, то как его вернуть, чтобы внешняя программа не могла его повредить?

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
#include <iostream>
#include <vector>
using namespace std;
 
class AnyClass{
public:
    void Function1();
    void AnyFunction(vector<int>);
private:
    vector<int> AnyArray;
};
 
void AnyClass::Function1(){
    // здесь формируется массив this->AnyArray;
}
void AnyClass::AnyFunction(vector<int>& param){
    param = this->AnyArray;
}
 
int main(){
           AnyClass anyclass;
           anyclass.Function1();
    vector<int> AnyArray;
    anyclass.AnyFunction(AnyArray); // вернуть массив
    cout<<AnyArray.size()<<endl; // узнать размер массива
    return 0;
}
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.05.2010, 17:40 18
в таком виде вы ничего не возвращате, ссылка это синоним, возвращайте по значению
1
SSxMe
14 / 14 / 2
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:46  [ТС] 19
то есть вот так?
C++
1
2
3
vector<int> AnyClass::AnyFunction(){
        return this->AnyArray;
}
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:49 20
SSxMe,
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
#include <iostream>
#include <vector>
using namespace std;
 
class AnyClass{
public:
        void Function1();
        vector<int> AnyFunction();
private:
        vector<int> AnyArray;
};
 
void AnyClass::Function1(){
        // здесь формируется массив this->AnyArray;
}
vector<int> AnyClass::AnyFunction(){
        return AnyArray;
}
 
int main(){
           AnyClass anyclass;
           anyclass.Function1();
        
        vector<int> AnyArray = anyclass.AnyFunction(); // вернуть массив
        cout<<AnyArray.size()<<endl; // узнать размер массива
        return 0;
}
Цитата Сообщение от SSxMe Посмотреть сообщение
то есть вот так?
C++
1
2
3
vector<int> AnyClass::AnyFunction(){
        return this->AnyArray;
}
Именно так. Только this ни к чему.
1
15.05.2010, 17:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2010, 17:49

Как вернуть массив?
Нужно вернуть массив из функции, как это сделать? #include &quot;stdafx.h&quot;...

Как вернуть массив из функции?
не могу передать массив из функции mas(). Как передать массив из функции и...

Как вернуть массив из функции?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru