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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Arcor
4794 / 1795 / 157
Регистрация: 20.11.2009
Сообщений: 5,684
Записей в блоге: 1
#1

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

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

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

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

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

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

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

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

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

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

Вернуть из функции 2 значения - C++
Как вернуть из функции 2 значения? Нужно вернуть строку и ее длину, но чтобы функция SendData() не вызывалась 2 раза. Сейчас узнаю длину...

26
Nekto
342 / 287 / 10
Регистрация: 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 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 17:42 #18
Цитата Сообщение от Bers Посмотреть сообщение
На с++ не существует "динамических массивов".
Вы сейчас ломаете мой взгляд на массивы... Почему память, выделенная с помощью new, к которой можно обращаться через индекс, не считается массивом?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.04.2012, 17:46 #19
Bers, я не понял, к чему это. Мы всё равно не сможем упаковать что-то в массив внутри функции и вернуть именно массив как самостоятельный объект. В данном случае мы завязаны на массиве-параметре и возвращаем именно его. В случае с вектором мы можем тягать наш вектор по коду, создавать вектор в одной функции и передавать в другую как результат, а не как ссылочный параметр и т.д.

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

чтобы писать в строки и в столбцы
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.04.2012, 17:50 #21
Arcor, ну вам нужно push_back'ать вектор целиком. Но раз вам известны размеры матрицы, почему бы сразу не создать её целиком и не применять оператор []?
0
Bers
Заблокирован
15.04.2012, 17:54 #22
Цитата Сообщение от Nekto Посмотреть сообщение
Вы сейчас ломаете мой взгляд на массивы... Почему память, выделенная с помощью new, к которой можно обращаться через индекс, не считается массивом?
Потому что "массив" - это синтаксическая конструкция языка. При помощи которой, вы можете создавать различные типы данных.

Например: int a[10] и int b[20] - это два принципиально разных типа данных.
Так же, эти два принципиально разных типа данных принципиально отличаются от типа данных "указатель".

Соответственно, правомерно сделать проверку типов. Функция может принимать только массив из 10 элементов, и браковать на стадии компиляции все прочие массивы, в том числе - сырые указатели.

Что касается адреса памяти - это всего лишь адрес. "Массив" на языке с++ не является "адресом памяти".
1
Arcor
4794 / 1795 / 157
Регистрация: 20.11.2009
Сообщений: 5,684
Записей в блоге: 1
15.04.2012, 18:07  [ТС] #23
Цитата Сообщение от silent_1991 Посмотреть сообщение
Arcor, ну вам нужно push_back'ать вектор целиком. Но раз вам известны размеры матрицы, почему бы сразу не создать её целиком и не применять оператор []?
ну так мне ее сперва заполнить нужно программно, скажем таким методом я буду считывать все из файла в массив, а в другой функции буду уже забирать из этой функции переделанные и обработанные значения. Поэтому и нужно было что-то независимое, и с которого можно было бы забирать результат
0
Bers
Заблокирован
15.04.2012, 18:08 #24
Цитата Сообщение от silent_1991 Посмотреть сообщение
Мы всё равно не сможем упаковать что-то в массив внутри функции и вернуть именно массив как самостоятельный объект.
Ну это максимум, что можно сделать с обычным массивом.
Нельзя из функции вернуть массив по значению.

C++
1
2
// : error C2090: функция возвращает массив
int (Test1(  int (arr)[10] )   )[10]       {  return arr; }
С чем связанно данное ограничение, лично мне не понятно. С другой стороны, на практике я ни разу не сталкивался с ситуацией, когда очень надо было бы вернуть массив по значению.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.04.2012, 18:10 #25
Arcor, создаём объект:
C++
1
std::vector<std::vector<type> > matrix(size1, std::vector<type>(size2));
После этого с ним можно работать как с массивом, созданным так:
C++
1
type matrix[size1][size2];
Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Нельзя из функции вернуть массив по значению.
Вот в этом и заключалось моё начальное "вернуть полноценный, автономный массив" .
1
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.04.2012, 18:11 #26
Цитата Сообщение от silent_1991 Посмотреть сообщение
Nekto, тут смотря как посмотреть. Можно назвать массивом байт объект любого типа, int, double и т.д.
Ну вот, например, "Уничтожение массива delete[] pointer"(Бьерн Страуструп). Называется именно уничтожение массива. И, раз его можно применить к указателю, то это можно назвать массивом. ИМХО.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.04.2012, 18:16 #27
Nekto, всё дело в уровне абстракции. Раз мы работаем с указателем, под который выделена память, как с массивом, то и думаем про него как про массив. Однако фактически это не массив (массив ячеек памяти - да, но не массив на уровне языка).

Добавлено через 3 минуты

Не по теме:

Пардон, не "под который выделена память", а "который указывает на выделенную памяти". Под указатель память выделяется при создании.

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 18:16
Привет! Вот еще темы с ответами:

Вернуть массив из функции - C++
Помогите пожалуйста, не получается вернуть массив #include &lt;iostream&gt; using namespace std; int input (int*array2) { int n; ...

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

Вернуть строку из функции. - C++
Как вернуть строку(AnsiString) из функции? int MyTXT (AnsiString Temlate, AnsiString tmp) { TSearchRec SR; int ires; ...

Вернуть указатель на массив из функции - C++
Дан массив из 20 элементов, который заполняется в функции, причем заполнение можно прервать. Функция должна вернуть ссылку на следующий...


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

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

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