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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 15:21     возвратить функцией массив #1
собственно такой вопрос, любыми методами нужно передать двумерный массив через функцию обратно, я не знаю как сделать это в с++, знаю только как в дельфи сделать это можно, но понадобилось решение в с++

кто в курсе, объясните или напишите пожалуйста небольшой пример

заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
15.04.2012, 15:58     возвратить функцией массив #2
Цитата Сообщение от Arcor Посмотреть сообщение
передать двумерный массив через функцию обратно
В смысле вернуть из функции или как?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 16:21     возвратить функцией массив #3
Arcor, все изменения с массивом-параметром будут отражены на реальном массиве, который был передан в функцию в качестве аргумента.
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 16:54  [ТС]     возвратить функцией массив #4
мне return'ом нужно

чтобы я мог забрать результат из функции

скажем у нас массив 10 х 10 и заполненный "таблицей умножения"

забрать, скажем в переменную целочисленную х

C++
1
x = MyArray()[5][3]; // функция возвращающая двумерный массив
чтобы в х вернулось значение из функции лежащее под этими индексами

как-то так

как параметром вернуть я знаю, а как результатом функции не знаю

Добавлено через 4 минуты
Цитата Сообщение от HighPredator Посмотреть сообщение
В смысле вернуть из функции или как?
HighPredator, по дельфийски вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
type Arr = Array[1..10, 1..10] of Integer;
 
function f: Arr;
begin
 
end;
 
var x: Integer;
begin
x := f[5][3];
end.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:07     возвратить функцией массив #5
Arcor, вернуть массив не получится. Можно вернуть обёртку - std::vector (динамический массив), std::array (обёртка над статическим массивом) (стандарт C++0x).
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 17:14  [ТС]     возвратить функцией массив #6
вот я тоже вектором сейчас тыкался тыкался, одномерный массив получилось забацать, а двумерный как, логики не хватает я просто не совсем силен в с++, вернее вообще бессилен
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:15     возвратить функцией массив #7
Двумерный вектор - std::vector<std::vector<type> >.
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 17:18  [ТС]     возвратить функцией массив #8
от спасибо, я немного по другому пробовал записать

и еще, один вопрос о векторе, мне тут говорит знакомый что вычитал, якобы если работать с вектором работа замедляется во много раз

Я не поверил этому сказанию, а как оно на самом деле? Выгодно или нет скажем для работы с матрицей 20 000 х 20 000 ?
естественно используя несколько потоков для обработки, ибо это очень большая величина для обработки
Bers
Заблокирован
15.04.2012, 17:22     возвратить функцией массив #9
Пример-иллюстрация того, как на с++ можно передавать массив по ссылке в функцию, и возвращать его наружу.
C++
1
2
3
4
5
6
    template<class T, size_t N>
    T (&Func(  T (&arr)[N] )   )[N]
    {
        //здесь делаем с массивом все, что захотим
        return arr; 
    }
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:24     возвратить функцией массив #10
Arcor, замедляется в несколько раз по сравнению с чем? Если со статическим массивом, и при этом не зарезервировать сразу всю нужную память, а выделять её инкрементно - замедляется, потому что освобождение и выделение памяти, а также копирование - дорогая операция. Если выделить всю нужную память сразу - то разницы не будет. Другой вопрос, что на стеке не удастся выделить много памяти, в отличие от кучи.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:29     возвратить функцией массив #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Arcor, вернуть массив не получится. Можно вернуть обёртку - std::vector (динамический массив), std::array (обёртка над статическим массивом) (стандарт C++0x).
Я наверное что-то не понимаю... Но указатель же можно вернуть.
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
#include <iostream>
 
int ** create_array(int rows,int cols)
{
 int ** a=new int*[rows];
 for (int i=0;i<rows;i++)
  {
   a[i]=new int[cols];
   for (int j=0;j<cols;j++)
    a[i][j]=rand()%100;
  }
 return a;
}
 
int main()
{
 int **array=create_array(5,5);
 using namespace std;
 for (int i=0;i<5;i++)
  {
   for (int j=0;j<5;j++)
    cout<<array[i][j]<<" ";
   delete [] array[i];
   cout<<endl;
  }
 delete [] array;
 system("pause");
 return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:30     возвратить функцией массив #12
Nekto, указатель - не массив. Вы можете вернуть полноценный массив из функции, самостоятельный, автономный массив?
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 17:30  [ТС]     возвратить функцией массив #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
Arcor, замедляется в несколько раз по сравнению с чем?
ммм, не правильно выразился, имел ввиду что работа очень медленная
Цитата Сообщение от silent_1991 Посмотреть сообщение
не зарезервировать сразу всю нужную память, а выделять её инкрементно - замедляется, потому что освобождение и выделение памяти, а также копирование - дорогая операция
ну это то понятно


сейчас уговорю товарища, использовать вектор для передачи матрицы А то он навыдумывает сейчас...

всем спасибо
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:31     возвратить функцией массив #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Nekto, указатель - не массив. Вы можете вернуть полноценный массив из функции, самостоятельный, автономный массив?
А в данном случае он неполноценный?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:33     возвратить функцией массив #15
Nekto, в данном случае выделение и освобождение памяти разнесены логически, что считается не очень хорошим тоном. И да, это не массив, это указатель на область памяти. Пускай мы и обращаемся с ним как с массивом.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:38     возвратить функцией массив #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Nekto, в данном случае выделение и освобождение памяти разнесены логически, что считается не очень хорошим тоном. И да, это не массив, это указатель на область памяти. Пускай мы и обращаемся с ним как с массивом.
Динамические массивы уже не считаются массивами?
Bers
Заблокирован
15.04.2012, 17:40     возвратить функцией массив #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вы можете вернуть полноценный массив из функции, самостоятельный, автономный массив?
http://codepad.org/GmdK3iLj

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
#include <iostream>
 
template<class T, size_t N>
T (&Test1(  T (&arr)[N] )   )[N]
{
    for(size_t i=0;i<N;++i ) { arr[i]= 1; } 
    return arr; 
}
 
template<class T, size_t N> 
void Test0( T (&arr)[N] )
{
    for(size_t i=0;i<N;++i ) { std::cout<< arr[i]<<std::endl; } 
    std::cout <<"Test passed\n";
}
 
 
int main()
{
    int arr[10];
    //Test0( &arr[0] ); //: error C2784: void Test0(T (&)[N]): не удалось вывести аргумент шаблон для "T (&)[N]" из "int *"
    Test0( arr );        //ok
    Test0( Test1(arr) );  //ok
 }
Добавлено через 36 секунд
Цитата Сообщение от Nekto Посмотреть сообщение
Динамические массивы уже не считаются массивами?
На с++ не существует "динамических массивов".
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:42     возвратить функцией массив #18
Цитата Сообщение от Bers Посмотреть сообщение
На с++ не существует "динамических массивов".
Вы сейчас ломаете мой взгляд на массивы... Почему память, выделенная с помощью new, к которой можно обращаться через индекс, не считается массивом?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.04.2012, 17:46     возвратить функцией массив #19
Bers, я не понял, к чему это. Мы всё равно не сможем упаковать что-то в массив внутри функции и вернуть именно массив как самостоятельный объект. В данном случае мы завязаны на массиве-параметре и возвращаем именно его. В случае с вектором мы можем тягать наш вектор по коду, создавать вектор в одной функции и передавать в другую как результат, а не как ссылочный параметр и т.д.

Добавлено через 1 минуту
Nekto, тут смотря как посмотреть. Можно назвать массивом байт объект любого типа, int, double и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 17:47     возвратить функцией массив
Еще ссылки по теме:

Двумерный динамический массив, неполадки с функцией C++
двухмерный массив(можно с использованием функцией) C++
C++ Цикл с функцией и массив

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

Или воспользуйтесь поиском по форуму:
Arcor
 Аватар для Arcor
4764 / 1765 / 153
Регистрация: 20.11.2009
Сообщений: 5,568
Записей в блоге: 1
15.04.2012, 17:47  [ТС]     возвратить функцией массив #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Двумерный вектор - std::vector<std::vector<type> >.
а как к нему применить push_back() ??? оО

чтобы писать в строки и в столбцы
Yandex
Объявления
15.04.2012, 17:47     возвратить функцией массив
Ответ Создать тему
Опции темы

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