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

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

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

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

C++
1
2
3
void function(int*); // прототип функции
void function(int* pmassiv) {} // определение функции
function(massiv); //вызов функции
а как эти три строчки выглядят если надо вернуть многомерный массив
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2009, 22:01
Ответы с готовыми решениями:

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

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

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

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

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

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
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:21
Цитата Сообщение от 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
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
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.09.2009, 22:32
Андрейка, а чистить за собой?) Я понимаю, что программа сама почистить при завершении.. но это не тру стайл.
0
425 / 229 / 87
Регистрация: 25.03.2009
Сообщений: 744
01.09.2009, 22:35
на скорую руку =)
C++
1
2
3
for (int i=0;i<n;i++) 
        delete a[i]; 
delete[] a;
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
01.09.2009, 22:43
Как вернуть многомерный массив из функции
по ссылке.
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
Цитата Сообщение от nill Посмотреть сообщение
Как вернуть многомерный массив из функции
для обычного массива c использованием указателей это выглядит так

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

собственно, первый вариант, наверное, наиболее предпочтителен. как это записать - не играет большого значения и не имеет большой роли. транслируется это всегда в конструкцию, которая положит массив в вызывающем контексте, и передаст на него указатель в вызове.
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
01.09.2009, 23:06
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
Цитата Сообщение от Rififi Посмотреть сообщение
static int arr[10][10];
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
01.09.2009, 23:31
массив тогда все время жизни программы будет находится в памяти?
Ты не поверишь - массив всегда находится только в памяти

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

mirso,
массив тогда все время жизни программы будет находится в памяти?
поскольку переменная имеет статическое время жизни (как точно сказать по-русски не знаю, короче, static storage duration), то таки да, всё время. Инициализация массива будет выполнена до первого входа в функцию (или во время первого вызова)
2
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:24
Инициализация массива будет выполнена до первого входа в функцию
Да не будет никакой инициализации.
Массив будет сразу заполнен компилятором (нулями надо полагать) в сегменте данных.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
02.09.2009, 00:32
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
Цитата Сообщение от mirso Посмотреть сообщение
Rififi подскажи, массив тогда все время жизни программы
будет находится в памяти?
естественно, раз она static
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
02.09.2009, 00:35  [ТС]
Monte-Cristo
Андрейка
мой код работает как то странно вроде результат и записывает в txt файл тот который я ожидаю но потом все вылетает с ошибкой понять и разобраться с которой я пока не в состоянии
А как нить без new delete это можно сделать ? для одно мерного массива я их не использовал

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

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

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

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

а вопрос мой о возврате измененнного двумерного массива из функции
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
02.09.2009, 00:49
а у меня чё было написано?
Да у тебя все правильно было написано.
Просто я в посте #13 уточнил где скорее всего будет это место "before".
А ты начал из какого-то талмуда фразы приводить с этим "before"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.09.2009, 00:49
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru