Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 1
#1

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

15.04.2012, 15:21. Просмотров 3664. Ответов 26
Метки нет (Все метки)

собственно такой вопрос, любыми методами нужно передать двумерный массив через функцию обратно, я не знаю как сделать это в с++, знаю только как в дельфи сделать это можно, но понадобилось решение в с++

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

заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2012, 15:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вернуть матрицу из функции (C++):

Заполнить матрицу случайными числами. Вернуть матрицу на 90o по часовой стрелке
Заполнить матрицу случайными числами. Вернуть матрицу на 90o по часовой стрелке.

Считать матрицу из файла, транспонировать и вернуть в другой файл
Добрый день, есть задача по получению матрицы из файла, последующей её...

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при...

Вернуть массив из функции
Допустим есть класс Test: class Test { private: float point; };

Вернуть массив из функции
Помогите пожалуйста, не получается вернуть массив #include <iostream> using...

Вернуть строку из функции.
Как вернуть строку(AnsiString) из функции? int MyTXT (AnsiString Temlate,...

26
HighPredator
5648 / 1965 / 716
Регистрация: 10.12.2010
Сообщений: 5,697
Записей в блоге: 3
15.04.2012, 15:58 #2
Цитата Сообщение от Arcor Посмотреть сообщение
передать двумерный массив через функцию обратно
В смысле вернуть из функции или как?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 16:21 #3
Arcor, все изменения с массивом-параметром будут отражены на реальном массиве, который был передан в функцию в качестве аргумента.
0
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 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.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:07 #5
Arcor, вернуть массив не получится. Можно вернуть обёртку - std::vector (динамический массив), std::array (обёртка над статическим массивом) (стандарт C++0x).
1
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 1
15.04.2012, 17:14  [ТС] #6
вот я тоже вектором сейчас тыкался тыкался, одномерный массив получилось забацать, а двумерный как, логики не хватает я просто не совсем силен в с++, вернее вообще бессилен
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:15 #7
Двумерный вектор - std::vector<std::vector<type> >.
1
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 1
15.04.2012, 17:18  [ТС] #8
от спасибо, я немного по другому пробовал записать

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

Я не поверил этому сказанию, а как оно на самом деле? Выгодно или нет скажем для работы с матрицей 20 000 х 20 000 ?
естественно используя несколько потоков для обработки, ибо это очень большая величина для обработки
0
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; 
    }
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:24 #10
Arcor, замедляется в несколько раз по сравнению с чем? Если со статическим массивом, и при этом не зарезервировать сразу всю нужную память, а выделять её инкрементно - замедляется, потому что освобождение и выделение памяти, а также копирование - дорогая операция. Если выделить всю нужную память сразу - то разницы не будет. Другой вопрос, что на стеке не удастся выделить много памяти, в отличие от кучи.
1
Nekto
342 / 287 / 37
Регистрация: 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;
}
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:30 #12
Nekto, указатель - не массив. Вы можете вернуть полноценный массив из функции, самостоятельный, автономный массив?
1
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 1
15.04.2012, 17:30  [ТС] #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
Arcor, замедляется в несколько раз по сравнению с чем?
ммм, не правильно выразился, имел ввиду что работа очень медленная
Цитата Сообщение от silent_1991 Посмотреть сообщение
не зарезервировать сразу всю нужную память, а выделять её инкрементно - замедляется, потому что освобождение и выделение памяти, а также копирование - дорогая операция
ну это то понятно


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

всем спасибо
0
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:31 #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Nekto, указатель - не массив. Вы можете вернуть полноценный массив из функции, самостоятельный, автономный массив?
А в данном случае он неполноценный?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:33 #15
Nekto, в данном случае выделение и освобождение памяти разнесены логически, что считается не очень хорошим тоном. И да, это не массив, это указатель на область памяти. Пускай мы и обращаемся с ним как с массивом.
1
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:38 #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Nekto, в данном случае выделение и освобождение памяти разнесены логически, что считается не очень хорошим тоном. И да, это не массив, это указатель на область памяти. Пускай мы и обращаемся с ним как с массивом.
Динамические массивы уже не считаются массивами?
0
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 Посмотреть сообщение
Динамические массивы уже не считаются массивами?
На с++ не существует "динамических массивов".
1
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:42 #18
Цитата Сообщение от Bers Посмотреть сообщение
На с++ не существует "динамических массивов".
Вы сейчас ломаете мой взгляд на массивы... Почему память, выделенная с помощью new, к которой можно обращаться через индекс, не считается массивом?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
15.04.2012, 17:46 #19
Bers, я не понял, к чему это. Мы всё равно не сможем упаковать что-то в массив внутри функции и вернуть именно массив как самостоятельный объект. В данном случае мы завязаны на массиве-параметре и возвращаем именно его. В случае с вектором мы можем тягать наш вектор по коду, создавать вектор в одной функции и передавать в другую как результат, а не как ссылочный параметр и т.д.

Добавлено через 1 минуту
Nekto, тут смотря как посмотреть. Можно назвать массивом байт объект любого типа, int, double и т.д.
0
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,797
Записей в блоге: 1
15.04.2012, 17:47  [ТС] #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Двумерный вектор - std::vector<std::vector<type> >.
а как к нему применить push_back() ??? оО

чтобы писать в строки и в столбцы
0
15.04.2012, 17:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 17:47
Привет! Вот еще темы с решениями:

Вернуть значение из функции
Приветсвую программисты! Такая проблема, надо возвратить m из функции, а оно...

Вернуть из функции 2 значения
Как вернуть из функции 2 значения? Нужно вернуть строку и ее длину, но чтобы...

Вернуть 2 параметра из функции
Доброе время суток. Объясните, пожалуйста как вернуть 2 параметра из функции?...

Вернуть из функции массив символов
Здравствуйте! Не получается никак решить задачу. Напишите функцию merge,...


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

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

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