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

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

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

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

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

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

C++
1
2
3
void function(int*); // прототип функции
void function(int* pmassiv) {} // определение функции
function(massiv); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2009, 22:01     Возвращение многомерного массива из функции
Посмотрите здесь:
C++ Как реализовать передачу массива в функцию и возвращение массива из функции?
Возвращение массива из функции C++
Возвращение массива из функции C++
Возвращение массива из функции C++
C++ Возвращение двумерного массива из функции
Возвращение из функции значения массива C++
Возвращение двумерного массива из функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:06     Возвращение многомерного массива из функции #2
создавать и передавать массив как массив указателей на указатели (int**), или указателей на указатели на указатели (int***). имхо - самый оптимальный вариант.
nill
9 / 9 / 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 **'

если прототип и определение правильные как делать вызов ?
Monte-Cristo
2787 / 1373 / 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;
    }
}
Андрейка
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;
}
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:32     Возвращение многомерного массива из функции #6
Андрейка, а чистить за собой?) Я понимаю, что программа сама почистить при завершении.. но это не тру стайл.
Андрейка
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;
Rififi
2338 / 1053 / 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();
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); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
это зависит. от этого и нужно танцевать. способов "передать много", нужно знать контекст:
- имеется массив, нужно вызвать ф-ию, которая наполнит его данными
- не имеется ничего, функция его создаст и передаст на него ссылку и размер. вызывающий ответственен за освобождение
- ???

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

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

mirso,
массив тогда все время жизни программы будет находится в памяти?
поскольку переменная имеет статическое время жизни (как точно сказать по-русски не знаю, короче, static storage duration), то таки да, всё время. Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:24     Возвращение многомерного массива из функции #13
Инициализация массива будет выполнена до первого входа в функцию
Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.
Rififi
2338 / 1053 / 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.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2009, 00:33     Возвращение многомерного массива из функции #15
Цитата Сообщение от mirso Посмотреть сообщение
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
естественно, раз она static
nill
9 / 9 / 0
Регистрация: 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; все больше никаких действий ненужно
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:41     Возвращение многомерного массива из функции #17
Rififi - ну не тормози так
Ключевое слово - "before". Это не значит что прямо перед блоком, заполнение может быть произведенно намного раньше ! Оно все равно будет "before" !
А скорее всего правильный компилятор создаст и заполнит этот массив в сегменте данных еще на этапе компиляции. Linker запихает это все в exe-ник.
И к моменту когда программа еще только запустится заполненный статический глобальный или локальный массив уже будет лежать в памяти.

Добавлено через 1 минуту
2nill: много слов, а ГДЕ КОД ?
Rififi
2338 / 1053 / 44
Регистрация: 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 Посмотреть сообщение
Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
что-то теперь я вообще не понимаю, ты с чем споришь-то?
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
02.09.2009, 00:49  [ТС]     Возвращение многомерного массива из функции #19
Rififi
только ненадо усложнять и так ничего не понятно про заполнение мне пока не нужно знать
заполняю я в ручную arr[0][1]=1; и так далее

а вопрос мой о возврате измененнного двумерного массива из функции
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2009, 00:49     Возвращение многомерного массива из функции
Еще ссылки по теме:
C++ Возвращение из функции массива указателей
C++ Возвращение массива из функции-шаблона
Возвращение массива из функции при наследовании C++
C++ Возвращение результата функции bool и использование его в функции main()
Внутреннее устройство многомерного массива и неявное преобразование массива в указатель C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:49     Возвращение многомерного массива из функции #20
а у меня чё было написано?
Да у тебя все правильно было написано.
Просто я в посте #13 уточнил где скорее всего будет это место "before".
А ты начал из какого-то талмуда фразы приводить с этим "before"
Yandex
Объявления
02.09.2009, 00:49     Возвращение многомерного массива из функции
Ответ Создать тему
Опции темы

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