Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/177: Рейтинг темы: голосов - 177, средняя оценка - 4.82
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
1

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

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

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

C++
1
2
3
void function(int*); // прототип функции
void function(int* pmassiv) {} // определение функции
function(massiv); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2009, 22:01
Ответы с готовыми решениями:

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

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

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

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

24
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:06 2
создавать и передавать массив как массив указателей на указатели (int**), или указателей на указатели на указатели (int***). имхо - самый оптимальный вариант.
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
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
2816 / 1407 / 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
425 / 229 / 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
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:32 6
Андрейка, а чистить за собой?) Я понимаю, что программа сама почистить при завершении.. но это не тру стайл.
0
425 / 229 / 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
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
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
556 / 510 / 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
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
01.09.2009, 23:06 10
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
Цитата Сообщение от Rififi Посмотреть сообщение
static int arr[10][10];
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
01.09.2009, 23:31 11
массив тогда все время жизни программы будет находится в памяти?
Ты не поверишь - массив всегда находится только в памяти

Rififi над вами прикалывается, а вы ведетесь
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
02.09.2009, 00:19 12
Rififi над вами прикалывается, а вы ведетесь
а чё сразу прикалывается-то? ((:
функция дейвствительно возвращает массив по-ссылке, как и возжелал аффтар :gigi:

mirso,
массив тогда все время жизни программы будет находится в памяти?
поскольку переменная имеет статическое время жизни (как точно сказать по-русски не знаю, короче, static storage duration), то таки да, всё время. Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
2
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:24 13
Инициализация массива будет выполнена до первого входа в функцию
Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2009, 00:33 15
Цитата Сообщение от mirso Посмотреть сообщение
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
естественно, раз она static
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
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
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:41 17
Rififi - ну не тормози так
Ключевое слово - "before". Это не значит что прямо перед блоком, заполнение может быть произведенно намного раньше ! Оно все равно будет "before" !
А скорее всего правильный компилятор создаст и заполнит этот массив в сегменте данных еще на этапе компиляции. Linker запихает это все в exe-ник.
И к моменту когда программа еще только запустится заполненный статический глобальный или локальный массив уже будет лежать в памяти.

Добавлено через 1 минуту
2nill: много слов, а ГДЕ КОД ?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
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
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
02.09.2009, 00:49  [ТС] 19
Rififi
только ненадо усложнять и так ничего не понятно про заполнение мне пока не нужно знать
заполняю я в ручную arr[0][1]=1; и так далее

а вопрос мой о возврате измененнного двумерного массива из функции
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:49 20
а у меня чё было написано?
Да у тебя все правильно было написано.
Просто я в посте #13 уточнил где скорее всего будет это место "before".
А ты начал из какого-то талмуда фразы приводить с этим "before"
0
02.09.2009, 00:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2009, 00:49
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru