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

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

Войти
Регистрация
Восстановить пароль
 
 
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Возвращение многомерного массива из функции - C++

01.09.2009, 22:01. Просмотров 12925. Ответов 24
Метки нет (Все метки)

Как вернуть многомерный массив из функции
для обычного массива c использованием указателей это выглядит так

C++
1
2
3
void function(int*); // прототип функции
void function(int* pmassiv) {} // определение функции
function(massiv); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2009, 22:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвращение многомерного массива из функции (C++):

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

Возвращение массива из функции - C++
Как вернуть массив из функции? double* Zapolnenie(string Name) { if (Name == "A") { const int number1 = 10; double A; ...

Возвращение массива из функции - C++
Почему такой код выводит массив корректно. int* Input() { int b = { 10,20,30 }; return b; } int main() {

Возвращение массива из функции - C++
Нужно вернуть массив типа int из функции Как я понимаю сделать это можно только с помощью указателей У меня это получилось но так...

Возвращение массива из функции-шаблона - C++
Есть массив int iArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; есть шаблон функция template< typename T > T * MySwap(const T...

Возвращение двумерного массива из функции - C++
Здравствуйте, написал пробник, чтобы освоить метод возвращения из функции двумерного массива (указателя). Что-то не заладилось с двумерным....

24
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:06 #2
создавать и передавать массив как массив указателей на указатели (int**), или указателей на указатели на указатели (int***). имхо - самый оптимальный вариант.
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
01.09.2009, 22:09  [ТС] #3
ну а как это в коде записать то?
мне нужны три строчки пототип определение и вызов функции

писал так для двумерного массива

C++
1
2
3
void function(int**); // прототип функции
void function(int** pmassiv) {} // определение функции
function(massiv); //вызов функции
ошибки начинаюсться при вызове функции
пример ошибки
cannot convert parameter 1 from 'int [5][15]' to 'int **'

если прототип и определение правильные как делать вызов ?
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:21 #4
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
создавать и передавать массив как массив указателей на указатели (int**)
поссмотри вот
это
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
using namespace std;
 
void zapolnaem(int **M, int m, int n);
void print(int **M, int m, int n);
 
int main()
{
    int m = 5; // кол-во строк в массиве
    int n = 4; // кол-во рядов в массиве
 
    int **A; // наш двумерный массив
 
    // создаем двумерный массив
    A = new int*[m]; // создаем массив указателей
    for (int i=0; i<m; i++)
        A[i] = new int[n];
 
    // заполняем массив
    zapolnaem(A, m, n);
 
    // выводим массив
    print(A, m, n);
 
    // удаляем
    for (int i=0; i<m; i++)
        delete[] A[i];
    delete[] A;
 
    system("pause");
    return 0;
}
 
void zapolnaem(int **M, int m, int n)
{
    for (int i=0; i<m; i++)
        for (int j=0; j<n; j++)
            M[i][j] = i*j;
}
 
void print(int **M, int m, int n)
{
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {
            cout.width(3);
            cout << M[i][j];
        }
        cout << endl;
    }
}
0
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
01.09.2009, 22:30 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <iostream>
void vvod(int **a , int n , int m)
{
    for (int i=0;i<n;i++)
        for (int j=0;j<m;j++)
            std::cin>>a[i][j];
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"RUSSIAN");
    int n,m;
    std::cout<<"kolvo strok"<<std::endl;
    std::cin>>n;
    std::cout<<"kolvo stolbcov"<<std::endl;
    std::cin>>m;
    int **a=new int*[n];
    for (int i=0;i<n;i++)
        a[i]=new int[m];
    vvod(a,n,m);
    system("pause");
    return 0;
}
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:32 #6
Андрейка, а чистить за собой?) Я понимаю, что программа сама почистить при завершении.. но это не тру стайл.
0
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
01.09.2009, 22:35 #7
на скорую руку =)
C++
1
2
3
for (int i=0;i<n;i++) 
        delete a[i]; 
delete[] a;
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
01.09.2009, 22:43 #8
Как вернуть многомерный массив из функции
по ссылке.
C++
1
2
3
4
5
6
7
const int (&f())[10][10]
{
    static int arr[10][10];
    return arr;
}
 
const int (&arr)[10][10] = f();
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.09.2009, 23:02 #9
Цитата Сообщение от nill Посмотреть сообщение
Как вернуть многомерный массив из функции
для обычного массива c использованием указателей это выглядит так

C++
1
2
3
void function(int*); // прототип функции
void function(int* pmassiv) {} // определение функции
function(massiv); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
это зависит. от этого и нужно танцевать. способов "передать много", нужно знать контекст:
- имеется массив, нужно вызвать ф-ию, которая наполнит его данными
- не имеется ничего, функция его создаст и передаст на него ссылку и размер. вызывающий ответственен за освобождение
- ???

собственно, первый вариант, наверное, наиболее предпочтителен. как это записать - не играет большого значения и не имеет большой роли. транслируется это всегда в конструкцию, которая положит массив в вызывающем контексте, и передаст на него указатель в вызове.
0
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 23:06 #10
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
Цитата Сообщение от Rififi Посмотреть сообщение
static int arr[10][10];
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
01.09.2009, 23:31 #11
массив тогда все время жизни программы будет находится в памяти?
Ты не поверишь - массив всегда находится только в памяти

Rififi над вами прикалывается, а вы ведетесь
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
02.09.2009, 00:19 #12
Rififi над вами прикалывается, а вы ведетесь
а чё сразу прикалывается-то? ((:
функция дейвствительно возвращает массив по-ссылке, как и возжелал аффтар :gigi:

mirso,
массив тогда все время жизни программы будет находится в памяти?
поскольку переменная имеет статическое время жизни (как точно сказать по-русски не знаю, короче, static storage duration), то таки да, всё время. Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
2
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:24 #13
Инициализация массива будет выполнена до первого входа в функцию
Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
02.09.2009, 00:32 #14
odip,

Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.


чё, правда что ли? :eek:

А теперь - правильный ответ:

6.7/4
A local object of trivial or literal type (3.9) with static storage duration initialized with constant expressions is initialized before its block is first entered.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2009, 00:33 #15
Цитата Сообщение от mirso Посмотреть сообщение
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
естественно, раз она static
0
02.09.2009, 00:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2009, 00:33
Привет! Вот еще темы с ответами:

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

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

Возвращение двумерного массива из функции - C++
int function (int x, const int r, const int c) //работает только если указана размерность массива x { int max, i, maxelrownum = 0; ...

Возвращение массива из функции при наследовании - C++
Здравствуйте! У меня есть класс(Circle), который наследуется от нескольких базовых. Мне нужно выполнить определенные вычисления, но...


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

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

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