Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.09.2014, 07:28   #1
Diusha
 
Регистрация: 30.05.2009
Сообщений: 3
Вопрос C++: функция, возвращающая многомерное значение

Делаю первые шаги в освоении С++.
Нужно, чтобы возвращаемое значение функции было массивом. Как это сделать (если вообще возможно)?
На объявление типа int fff[20] (...) {...} компилятор ругается.
Иными словами, переведите, пожалуйста, с паскаля на С++:

Type aaa : array[1..20] of integer;

Function fff(...) : aaa;
Begin
...
fff[1]:=a; fff[2]:=b; ...
End;

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

Последний раз редактировалось Diusha; 28.09.2014 в 08:06.
Diusha вне форума
Старый 28.09.2014, 11:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.programmersforum.ru/showp...4&postcount=27
int** InputMatrix(int Rows,int Columns) возвращает матрицу.
I'm learning to live...
Stilet вне форума
Старый 28.09.2014, 11:27   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Не уверен что правильно понял:
Function fff(...) : aaa;

Выглядит как объявление функции по имени fff.

Однако:

fff[1]:=a;

Выглядит как обращение к 1 элементу функции. Но это же функция, а не массив?

На паскале я в последний раз писал ещё в школе много лет назад.

Поэтому, могу просто не понять конструкцию.

http://rextester.com/LZFRK95139

Код:
#include <iostream>
using namespace std;


enum { ELEMENTS = 5 };

/*
Type aaa : array[1..20] of integer;

Function fff(...) : aaa;
Begin
...
fff[1]:=a; fff[2]:=b; ...
End;
*/

/*
//Синтаксис функции которая принимает массив по ссылке и возвращает массив по ссылке:
template<class T, size_t N>
    T (&Example(  T (&arr)[N] )   )[N]
    {
        T tmp[N]; for(size_t i=0;i<N;++i ) { tmp[i]= arr[i]; }
        return tmp; 
    }

*/

template<class T> void view(const T& cont)
{
    cout<<endl;
    for(const auto& i: cont)
        cout<< i << endl;
}



int (&fff(  int (&arr)[ELEMENTS], int a, int b )   )[ELEMENTS]
{
    arr[0]=a;
    arr[1]=b;
    return arr;
}



int main()
{
    
    int array[ELEMENTS]; //<---- в паскале с 1..20, на плюсах 0...20
    
    cout<<"before: \n";
    view(array);
    
    cout<<"after: \n";
    fff(array,33,66);
    
    view(array);

    
    std::cout << "Hello, world!\n";
}
Цитата:
Сообщение от Diusha Посмотреть сообщение
Заставить функцию просто писать данные в нек. массив в данном случае нельзя, т.к. функция будет вызываться рекуррентно
Вы наверное имели ввиду рекурсивно?

Просто на самом деле это не принципиально.
Если функция имеет доступ к массиву (не важно где находится сам массив. предположим - это глобальная переменная) - значит она может обратиться к нему и рекурсивно тоже.

Последний раз редактировалось Stilet; 28.09.2014 в 13:19.
_Bers вне форума
Старый 28.09.2014, 13:21   #4
Diusha
 
Регистрация: 30.05.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Не уверен что правильно понял:
Function fff(...) : aaa;
Выглядит как объявление функции по имени fff.
Так и есть.

Цитата:
Сообщение от _Bers Посмотреть сообщение
Однако:
fff[1]:=a;
Выглядит как обращение к 1 элементу функции. Но это же функция, а не массив?
Это функция, значение которой есть массив.
fff[1]:=a;
Находится в теле функции – между Begin и End (Begin и End это аналог сишных { } ).
В паскале нет return(), и выходное значение задается или поэлементно (fff[1]:=a) или целиком:
fff:=arr (где arr – предварительно заданный массив правильного формата).

Цитата:
Сообщение от _Bers Посмотреть сообщение
Вы наверное имели ввиду рекурсивно?
Вы правы

Цитата:
Сообщение от _Bers Посмотреть сообщение
(не важно где находится сам массив. предположим - это глобальная переменная) - значит она может обратиться к нему и рекурсивно тоже.
Вы снова правы!
В данном случае я действительно смогу завести массив на стороне и обойтись без функции-массива.

Всем спасибо, буду разбираться (пока «по слогам») в приведенных кодах. Наверно, еще спрошу
Diusha вне форума
Старый 28.09.2014, 15:49   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Diusha Посмотреть сообщение
Всем спасибо, буду разбираться (пока «по слогам») в приведенных кодах.
путь с++ - это путь typedef. Код можно значительно упростить, если грамотно подобрать синоним типам.

например приведенный мною выше код можно переписать так:

http://rextester.com/ZBQP71139

Код:
#include <iostream>
using namespace std;


enum { ELEMENTS = 5 };

//обявляем тип Array, который является массивом.
typedef int Array[ELEMENTS];

//теперь делаем тип Array ссылкой
typedef ::std::add_lvalue_reference<Array>::type
    ReferenceArray;

template<class T> void view(const T& cont)
{
    cout<<endl;
    for(const auto& i: cont)
        cout<< i << endl;
}


//функция принимает ссылку на массив и возвращает ссылку на такой же массив
ReferenceArray fff( ReferenceArray arr, int a, int b  )
{
    arr[0]=a;
    arr[1]=b;
    return arr;
}



int main()
{
    
    int array[ELEMENTS];
    
    cout<<"before: \n";
    view(array);
    
    cout<<"after: \n";
    fff(array,33,66);
    
    view(array);

    
    std::cout << "Hello, world!\n";
}
Как видите: синтаксически код стал проще: легче прочитать и понять, что он делает.
_Bers вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция, возвращающая массив KORT Общие вопросы Delphi 10 04.02.2013 12:41
Функция, возвращающая массив (С++) Alendorff Помощь студентам 14 09.03.2012 17:23
Функция возвращающая указатель ]tach[ Общие вопросы C/C++ 1 19.01.2011 14:35
Функция возвращающая char Exeil Общие вопросы C/C++ 2 18.10.2010 19:42
Функция возвращающая строку(си++). necky Помощь студентам 1 18.10.2008 18:32