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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.70
SSxMe
14 / 14 / 1
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 16:57     Как вернуть массив? #1
Как вернуть массив из функции и узнать его размер?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 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;
}
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
15.05.2010, 17:04     Как вернуть массив? #3
Верни указатель на первый элемент. А если нужен размер, то никак.
Зато можно завернуть указатель и размер массива в структуру и её вернуть как результат вызова функции.

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

Добавлено через 36 секунд
Как раз из функции массив может вернуть.
SSxMe
14 / 14 / 1
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:07  [ТС]     Как вернуть массив? #6
Еще вариант malloc
а это вроде бы устаревшее
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:07     Как вернуть массив? #7
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Еще вариант malloc
Для СИ - вариант, для С++ - нет.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.05.2010, 17:08     Как вернуть массив? #8
а это вроде бы устаревшее
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:08     Как вернуть массив? #9
Цитата Сообщение от SSxMe Посмотреть сообщение
а это вроде бы устаревшее
Для СИ другого способа нет.
SSxMe
14 / 14 / 1
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:09  [ТС]     Как вернуть массив? #10
Я на с++ пишу
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:11     Как вернуть массив? #11
Цитата Сообщение от SSxMe Посмотреть сообщение
Я на с++ пишу
Если ограничений нет - используй std::vector и не парься с памятью, размерами и т.д.
SSxMe
14 / 14 / 1
Регистрация: 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;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.05.2010, 17:20     Как вернуть массив? #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
и не парься с памятью, размерами и т.д.
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:23     Как вернуть массив? #14
Цитата Сообщение от alex_x_x Посмотреть сообщение
париться то все-равно придется, так как вектор все равно надо будет создавать динамически
std::vector можно и по значению возвращать, тогда париться не придется.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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 можно и по значению возвращать, тогда париться не придется.
дада, вы правы, но это приведет к вызову конструктора копирования
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.05.2010, 17:26     Как вернуть массив? #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
дада, вы правы, но это приведет к вызову конструктора копирования
Ну чтож, придется выбирать между быстродействием и удобством. Не думаю, что первый фактор является определяющим.
alex_x_x, vector<int> AnyArray; забыл убрать из функции.
SSxMe
14 / 14 / 1
Регистрация: 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;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.05.2010, 17:40     Как вернуть массив? #18
в таком виде вы ничего не возвращате, ссылка это синоним, возвращайте по значению
SSxMe
14 / 14 / 1
Регистрация: 09.05.2010
Сообщений: 79
15.05.2010, 17:46  [ТС]     Как вернуть массив? #19
то есть вот так?
C++
1
2
3
vector<int> AnyClass::AnyFunction(){
        return this->AnyArray;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2010, 17:49     Как вернуть массив?
Еще ссылки по теме:

Как вернуть массив из функции? C++
C++ Как вернуть массив из функции?
C++ Как вернуть массив из функции?
Как вернуть массив структур (слабонервным не смотреть) C++
C++ Как из функции вернуть массив символов?

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 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 ни к чему.
Yandex
Объявления
15.05.2010, 17:49     Как вернуть массив?
Ответ Создать тему
Опции темы

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