Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
nill
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 417
#1

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

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

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

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

http://www.cyberforum.ru/cpp-beginners/thread1649840.html

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

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

Возвращение массива из функции
Почему такой код выводит массив корректно. int* Input() { int b = {...

Возвращение массива из функции
Как вернуть массив из функции? double* Zapolnenie(string Name) { if (Name...

Возвращение массива из функции-шаблона
Есть массив int iArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; есть шаблон...

Возвращение двумерного массива из функции
int function (int x, const int r, const int c) //работает только если указана...

24
Monte-Cristo
2794 / 1380 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:06 #2
создавать и передавать массив как массив указателей на указатели (int**), или указателей на указатели на указатели (int***). имхо - самый оптимальный вариант.
0
nill
10 / 10 / 2
Регистрация: 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
2794 / 1380 / 107
Регистрация: 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
Андрейка
421 / 225 / 87
Регистрация: 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
2794 / 1380 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:32 #6
Андрейка, а чистить за собой?) Я понимаю, что программа сама почистить при завершении.. но это не тру стайл.
0
Андрейка
421 / 225 / 87
Регистрация: 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
2363 / 1056 / 104
Регистрация: 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 / 25
Регистрация: 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 / 45
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 23:06 #10
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
Цитата Сообщение от Rififi Посмотреть сообщение
static int arr[10][10];
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
01.09.2009, 23:31 #11
массив тогда все время жизни программы будет находится в памяти?
Ты не поверишь - массив всегда находится только в памяти

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

mirso,
массив тогда все время жизни программы будет находится в памяти?
поскольку переменная имеет статическое время жизни (как точно сказать по-русски не знаю, короче, static storage duration), то таки да, всё время. Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
2
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
02.09.2009, 00:24 #13
Инициализация массива будет выполнена до первого входа в функцию
Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.
0
Rififi
2363 / 1056 / 104
Регистрация: 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 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2009, 00:33 #15
Цитата Сообщение от mirso Посмотреть сообщение
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
естественно, раз она static
0
nill
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 417
02.09.2009, 00:35  [ТС] #16
Monte-Cristo
Андрейка
мой код работает как то странно вроде результат и записывает в txt файл тот который я ожидаю но потом все вылетает с ошибкой понять и разобраться с которой я пока не в состоянии
А как нить без new delete это можно сделать ? для одно мерного массива я их не использовал

Rififi
а где в коде прототип
определение и вызов функции ?
надо что то типо твоего кода что то самое простое без лишних данных просто те три пункта что я написал

novi4ok
Имееться массив с заранее определенным количеством элементов
надо вызвать функцию которая наполнит его данными
то есть если совсем конкретно то создаеться массив
A[5][15] с нулевыми значениями всех элементов потом он передаеться в функцию f(int **A) (столбцы и строки передавать не нужно они не изменяються и известны заранее) после чего я получаю заполненый двумерный массив A

если совсем просто надо передать в функцию двумерный массив A[5][15] c заранее известным количеством элементов и вернуть с одним измененным элементом скажем A[0][0]=100; все больше никаких действий ненужно
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
02.09.2009, 00:41 #17
Rififi - ну не тормози так
Ключевое слово - "before". Это не значит что прямо перед блоком, заполнение может быть произведенно намного раньше ! Оно все равно будет "before" !
А скорее всего правильный компилятор создаст и заполнит этот массив в сегменте данных еще на этапе компиляции. Linker запихает это все в exe-ник.
И к моменту когда программа еще только запустится заполненный статический глобальный или локальный массив уже будет лежать в памяти.

Добавлено через 1 минуту
2nill: много слов, а ГДЕ КОД ?
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
02.09.2009, 00:45 #18
nill,

а где в коде прототип
определение и вызов функции ?

строки 1-5 - это прототип и определение. это как в рекламе шампуня от перхоти "два-в-одном"
в строке 7 - вызов

надо вызвать функцию которая наполнит его данными
заполнить массив, и вернуть его - это не одно и то же

для заполнения можно использовать функцию типа такой
void fill(int arr[][10]); // для C
или
C++
1
2
3
4
5
6
template <typename T, size_t Rols, size_t Cols>
void fill_cpp(T (&arr)[Cols][Rows]); // для C++
 
int arr[5][10];
fill(arr);
fill_cpp(arr);
вот примерно как-то так...

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

odip,

Ключевое слово - "before". Это не значит что прямо перед блоком, заполнение может быть произведенно намного раньше ! Оно все равно будет "before" !

а у меня чё было написано?

Цитата Сообщение от Rififi Посмотреть сообщение
Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
что-то теперь я вообще не понимаю, ты с чем споришь-то?
0
nill
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 417
02.09.2009, 00:49  [ТС] #19
Rififi
только ненадо усложнять и так ничего не понятно про заполнение мне пока не нужно знать
заполняю я в ручную arr[0][1]=1; и так далее

а вопрос мой о возврате измененнного двумерного массива из функции
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
02.09.2009, 00:49 #20
а у меня чё было написано?
Да у тебя все правильно было написано.
Просто я в посте #13 уточнил где скорее всего будет это место "before".
А ты начал из какого-то талмуда фразы приводить с этим "before"
0
02.09.2009, 00:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2009, 00:49
Привет! Вот еще темы с решениями:

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

Возвращение из функции массива указателей
Здравствуйте. Мне нужно вернуть из функции массив указателей. Внутри функции...

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

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


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

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

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