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

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

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

Как вернуть массив из функции и узнать его размер?
http://www.cyberforum.ru/cpp-beginners/thread157635.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 16:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как вернуть массив? (C++):

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

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

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

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

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

22
CyBOSSeR
Эксперт С++
2309 / 1682 / 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
Эксперт С++
2309 / 1682 / 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
Эксперт С++
2309 / 1682 / 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
Эксперт С++
2309 / 1682 / 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
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.05.2010, 17:20 #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
и не парься с памятью, размерами и т.д.
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:23 #14
Цитата Сообщение от alex_x_x Посмотреть сообщение
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
std::vector можно и по значению возвращать, тогда париться не придется.
0
alex_x_x
бжни
2454 / 1660 / 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
Эксперт С++
2309 / 1682 / 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
бжни
2454 / 1660 / 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
Эксперт С++
2309 / 1682 / 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
Привет! Вот еще темы с решениями:

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

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

Как вернуть массив из функции?
у меня есть две функции: Одна должна возвращать три числа, а вторая двумерный ...

Как вернуть массив из функции?
int SumElementovStolbca(int M, int mas, int N) { int sum = 0; for (int i...


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

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

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