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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2015, 03:22   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Может ли функция возвращать множество значений?

Собственно весь вопрос, но с поправкой...разного типа(возможно ли).

Если можно, то приведите примеры на языках С++, Делфи и Ява.

Есть идея только с использованием функци- пользовательских типов.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 27.08.2015, 04:17   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Ну, в Паскале есть волшебное слово var
Код:
function FuZna1(x:Integer;var zna2:Integer;var zna3:Double;var zna4:string):Boolean;
Так сойдет ?
type_Oleg вне форума Ответить с цитированием
Старый 27.08.2015, 04:57   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Возвращать значения через аргумент функции? Это говнокод)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 27.08.2015, 05:23   #4
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

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

Чтобы обойти подобные ограничения, используются структуры и указатели. В структуру можно записать значения разного типа и вернуть указатель на структуру, динамически выделив память под структуру либо функцией malloc языка С, либо оператором new языка С++.

Простой пример
Код:
#include <stdio.h>

struct typ
{
int a;
float b;
};

struct typ* func()
{

struct typ* a = new struct typ;
a->a = 5;
a->b = 1.0;
return a;
}


void main()
{
struct typ* b = func();
printf("%d %f\n", b->a , b->b);
delete b;
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.08.2015, 05:50   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Вы тут использовали указатель на функцию типа структуры, как я понял. А что если написать просто struct typ func()...

Код:
struct typ func()
{

struct typ a ;
a.a = 5;
a.b = 1.0;
return &a;
}
Как-то так можно сделать?

Чем чреват мой вариант (если вообще скомпилируется)


А вот пример такой задачи, придумав которую создал эту тему


Написать функцию, возвращающую массив типа структуры, размер массива генерируется рандомом.

По сути решил то, что возвращать надо указатель на массив, точнее на первый элемент, но далее сложность в выводе его в main...


Код:
struct new_type
{
int a;
float b;
std::string c;
};

int n=rand()%150;
new_type array[n];//в qt допускается так


new_type newfunc()
{

For (int i=0;i<n;i++)
{
array [i].a=i+3;
...
}

return *a; // или как? Думаю так как это просто функция, а не указатель, то нужно не * писать, а &. Жду вашего ответа)
}
Как вывести такой массив, при том, что заранее количество элементов-неизвестно? И вообще можно ли так писать?
from dark to light)

Последний раз редактировалось Алексей_2012; 27.08.2015 в 06:55.
Алексей_2012 вне форума Ответить с цитированием
Старый 27.08.2015, 06:43   #6
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

У вас переменная локальная для функции. Она может уничтожиться при выходе из функции.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.08.2015, 06:56   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Исправил, на счет использования рандома в области вне функции-не уверен. Пишу на потолке. В листинге выше (где не массив) структура - это глобальная переменная, поэтому, думаю , можно использовать ссылку, т.к. деструктурирования данных не произойдет.

А как быть с листингом два, где массив? как можно и можно ли решить задачу так (двумя способами ):

Возвращая указатель
Возвращая ссылку.
from dark to light)

Последний раз редактировалось Алексей_2012; 27.08.2015 в 07:21.
Алексей_2012 вне форума Ответить с цитированием
Старый 27.08.2015, 07:31   #8
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Несколько значений вернуть нельзя(по крайней мере на Java).
НО можно запихнуть несколько объектов в какую либо коллекцию
(массив, список, ХэшМапа и т.п.) и вернуть коллекцию:

Код:
class Example{
	public static ArrayList getArrayList()
	{
		List list = new ArrayList();
		list.add(5);
		list.add("String value");
		list.add(true);
		list.add(new Object());
		list.add(23.5);
		return (ArrayList) list;
	}

	public static void main(String args[])
	{
		List myList = getArrayList();
		for(Object o : myList)
			System.out.println("Item: " + o.toString());
	}
}
Код:
результат:

Item: 5
Item: String value
Item: true
Item: java.lang.Object@12b3d53
Item: 23.5

П.С. Можно также как писали выше создать класс который содержит несколько полей и вернуть объект этого класса.

Последний раз редактировалось tolikprankster; 27.08.2015 в 07:33.
tolikprankster вне форума Ответить с цитированием
Старый 27.08.2015, 07:36   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Вы можете создать собственную структуру и возвращать ее. Например вектор (одномерный массив, в котором могут храниться значения разных типов). Во всякой там функциональщине подобные структуры идут дефолтом без сторонних библиотек и считаются как нечто само собой разумеющееся.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 27.08.2015, 07:36   #10
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
new_type newfunc()
{

for (int i=0;i<n;i++)
{
array [i].a=i+3;
...
}

return *a; 
// или как? Думаю так как это просто функция, 
//а не указатель, то нужно не * писать, 
//а &. Жду вашего ответа)
}
В таком виде функция не new_type возвращает, а int, соответственно прототип будет int newfunc().
И возвращается не структура, а поле структуры.

Код:
new_type array[n];//в qt допускается так
Размер массива должен быть константным, в g++/ms vs так не получится


Переписал немного ваш код. Только возврата из функции не делаю, так как смысла в таком примере нет.
Код:
#include <stdio.h>
#include <stdlib.h>

struct new_type
{
int a;
float b;
};

int n=rand()%150;
new_type* array;


void newfunc()
{
int i;

for (i=0;i<n;i++)
{
array[i].a=i+3;
printf("%d %d \n", i, array[i].a);
}

}


void main()
{
array = new new_type[n];
newfunc();
delete [] array;
}
Память можно динамически выделить, тогда возврат по указателю выделенной под массив структур памяти будет производится так:
Код:
new_type* mem()
{
array = new new_type[n];
return array;
}

void main()
{
new_type* p = mem();
newfunc();
delete [] p;
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль(множество значений и цикл) Ксюшка2 Помощь студентам 5 30.01.2013 09:58
Может ли функция возвращать массив? TzX Общие вопросы Delphi 4 20.09.2010 19:27
что будет возвращать функция при различных pos vasyapupkin Общие вопросы C/C++ 4 03.11.2009 20:48
Паскаль,функция и множество pavlentus Помощь студентам 4 20.04.2009 20:39