Возврат нескольких значений из функции

Может ли кто-нибудь сказать мне, как вернуть несколько значений из функции?
Пожалуйста, уточните в каком-то примере?

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

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

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

Если различные элементы данных являются частью более крупного составного типа данных (такого как почтовый адрес или позиция в заказе клиента или какой-либо другой тип, описываемый несколькими атрибутами), затем определите тип структуры для представления одно значение этого составного типа:

Do not определить структуру для сбора случайных элементов, которые не так или иначе связаны друг с другом; что просто вызовет путаницу для вас и любого, кто должен поддерживать ваш код в будущем.

Если элементы данных не являются функционально связанными, но каким-то образом связаны с операциями (например, данные плюс флаг состояния плюс метаданные об операции или элементах как часть одной операции ввода), затем используйте несколько параметров для записи. Наиболее очевидными примерами являются функции *scanf() в стандартной библиотеке. Существуют также функции strtod() и strtol() , которые преобразуют строковое представление числа; они возвращают преобразованное значение, но они также записывают первый символ, который не был преобразован в отдельный параметр:

Вы можете комбинировать эти подходы; вот пример, вдохновленный некоторой работой, которую я сейчас делаю:

Служба, запрашивающая данные о высоте, возвращает 1-мерную последовательность значений; размеры массива возвращаются как часть метаданных.

Как вернуть несколько значений из функции в C?

Если у меня есть функция, которая дает результат int и результат string , как мне вернуть их как из функции?

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

Я не знаю, что такое string , но я предполагаю, что он управляет собственной памятью.

У вас есть два решения:

1: Верните a struct , который содержит все типы, которые вам нужны.

2: Используйте указатели для передачи значений.

Какой из них вы предпочитаете использовать, во многом зависит от личных предпочтений относительно любой семантики, которая вам больше нравится.

Option 1 : объявить структуру с int и строкой и вернуть структурную переменную.

Option 2 : вы можете передать один из двух указателей через указатель и внести изменения в фактический параметр через указатель и вернуть другой как обычно:

Option 3 : аналогично опции 2. Вы можете передавать оба указателя и ничего не возвращать из функции:

Два разных подхода:

  • Передайте возвращаемые значения указателем и измените их внутри функции. Вы объявляете свою функцию как void, но возвращаете ее через значения, переданные в качестве указателей.
  • Определите структуру, которая агрегирует ваши возвращаемые значения.

Я думаю, что №1 немного более очевиден в том, что происходит, хотя он может утомиться, если у вас слишком много возвращаемых значений. В этом случае вариант № 2 работает достаточно хорошо, хотя некоторые интеллектуальные накладные расходы связаны с созданием специализированных структур для этой цели.

Читайте так же:  Договор обустройство скважин

Поскольку один из ваших типов результатов является строкой (и вы используете C, а не С++), я рекомендую передавать указатели в качестве выходных параметров. Использование:

и назовите его следующим образом:

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

Создайте структуру и установите два значения внутри и верните структурную переменную.

Вы должны выделить место для char * в своей программе.

Используйте указатели в качестве параметров вашей функции. Затем используйте их для возврата нескольких значений.

Один из подходов — использование макросов. Поместите это в файл заголовка multitype.h

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

Это то, что он печатает:

Решение может быть не таким портативным, потому что для него требуется C99 или более поздняя версия для переменных переменных и объявлений переменных for-statement. Но я думаю, что было достаточно интересно опубликовать здесь. Другая проблема заключается в том, что компилятор не предупредит вас, если вы присвоите им неправильные значения, поэтому вы должны быть осторожны.

Дополнительные примеры и сводная версия кода с использованием объединений доступны в моем репозитории github.

Совет: возврат нескольких значений из функции

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

В данном примере функция вернёт $var2:

Если же нам нужно оба значения можем вернуть массив и обратиться к элементам по индексу:

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://stackoverflow.com/questions/3451906/multiple-returns-from-function
Перевел: Станислав Протасевич
Урок создан: 27 Апреля 2016
Просмотров: 8109
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Как функции вернуть несколько значений

Всего мнений: 22

(8) > Вообще, считаю, идеологически правильнее не изменять формальные параметры функцией. Функция в математическом смысле однонаправлена. И у неё четко разделены вход и выход.

Простой пример: код модуля стал очень сложным, хочется раскидать разные части по отдельным функциям.

Вырезаешь куски в отдельные функции, запускаешь проверку синтаксиса смотришь каких переменных не хваттае и тупо кидаешь их в параметры.

По частоте использования:
1. Структура, например, если нужно получить что-то связанное с объектом (периодические значения), но получать сам объект не имеет смысла.
2. Функция с параметром, определяющим значение чего будет возвращено.
3. Несколько функций.

(28) Исключение в данном случае благо. Может привести к неверной работе алгоритма, без ошибок времени выплонения.

Читайте так же:  Какие документы являются правом собственности на квартиру

Если функции надо вернуть несколько РАЗНЫХ значений, не объединенных семантически в какое-то целое, значит у тебя косяк в архитектуре и это две функции, а не одна.

А, если эти значения — это атрибуты какого-то одного объекта, то возвращай структуру да и всё.

(38)
> 1. Нельзя использовать автодополнение, выше вероятность опечатки
Автодополнение в 1с много где нет? это вопрос тестирования

> 2. Что бы при чтении кода понять, какие параметры могут возвращаться, приходится переходить к определению функции и читать комментарии к ней. Если они еще есть.
Для этого можно в начале функции инициировать структуру, которая нужно вернуть независимо от успешности функции

> 3. На опечатки нельзя проверить формально, надеемся на то, что упомянутое вами исключение выскочит при тестировании у разработчика, а не повалит у пользователей в том куске, который разработчик недостаточно протестировал.
Это совсем другой вопрос — вопрос тестирования.

> 3.1. А бывают еще любители избыточного использование Попытка Исключение. Получается вообще взрывоопасная смесь.

> 4. При рефакторинге могут возникнуть большие проблемы по переделке кучи мест в коде. Не решаемые полуинтеллектуальным поиском с заменой и прочими подобными инструментами.
Например какие проблемы?

(48) А возвращать в параметрах ещё отстойней.

(52) Кратко пересказать книжки М.Фаулера и Р.Мартина ?

(47) Если функция не нашла значение потому что его нет — возвращается пустое значение, если возникла ошибка из-за неверных параметров, функция должна генерить исключение. Как это исключение будет обрабатывать вызывающая сторона — уже пофиг. Если вызывающая сторона подходит ответственно к параметрам вызова функции, она не должна париться над текстом в принципе.

(54) Там много опирается на то, что функция должна делать что-то одно. А если функция должна делать что-то одно, откуда взяться чему-то второму что можно вернуть?

В общем случае, возврат нескольких значений — это массив, соответственно, структура, список и т.п. это более упрощённое понимание массива.
Но, реального возврата нескольких значений из функции всё равно нет — вы возвращаете один объект. И, самое главное, что он создаётся, а потом разрушается, что медленнее, чем если передавать эти несколько параметров в функцию или процедуру по ссылке.

Удобство структуры и списка значений в том, что можно указывать имена значений, что не требует следить за их порядком.

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

Вставлю своё имхо:
Когда нужно передавать по ссылке и там менять:
1. Когда меняешь движения, дописываешь данные в таблицу, список.
2. Когда у тебя есть большая структура, которая содержит несколько параметров, которые ты будешь использовать и тебе нужно дополнить её.
3. Когда передаёшь «Отказ» и там меняешь его на Ложь.
4. Когда передаёшь форму и добавляешь на неё свои элементы.
5. Когда передаёшь МенеджерВременных таблиц.

Это то, что смог вспомнить.

Во всех остальных случаях нужно возвращать.

(79) (80) В Си как раз всё просто — если параметр передан по значению (засунут в стек), то в функции будет его копия, а если по указателю, то в функции будет указатель на переменную, которую по указателю можно менять.
А вот в Си++ появились ссылки, когда передаётся как бы значение, но внутри это реализовано как указатель — то есть то, что мы имеем в 1С, если не написали Знач.

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

Читайте так же:  Требования к началу строительства

(91) Но, в той же java прекрасно как параметры передаются объекты-контейнеры (BOX) в которых можно менять содержимое, не меняя самого контейнера, то есть так они реализовали указатели.

Что касается передачи параметра в функцию по указателю, то в том же Си всё остаётся на уровне функции — указатель, как бы мы его не меняли, обратно не возвращается, то если является обычным входным параметром, а вот про то, на что он указывает, никто не говорил — его можно менять, получая доступ к ячейке памяти по указателю.

(88) Начнём с того, что во многих языках деление на процедуры и функции чисто условно, так как и те и другие могут иметь как выходные так и выходные параметры.
Просто у функции есть основной параметр, который только выходной.
А если смотреть на низком уровне, то все высокоуровневые процедуры и функции — это вызов кода, возвращающего код ошибки исполнения, а все параметры и результаты хранятся в отдельной области памяти.

(93) Там просто сборка мусора работает тогда, когда памяти стало очень мало — в результате — если память есть, то её будут жрать, пока не надоест. Но, есть ключи запуска, где всё это можно ограничить. И ваша java побыстрее 1С будет.

Форум поддержки читателей книги «Практическое пособие разработчика. Примеры и типовые приемы»

Текст запроса, пожалуйста. Скорее всего, у вас в тексте «=&. «, а при нескольких должно быть «В (&. )» (при единственном тоже работает).

И текст заполнения списка и передачи условия тоже.

Вот кусок текста запроса:

ХозрасчетныйОстаткиИОбороты.Субконто1.КодСоотвБУ КАК КСБУ,
| ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагенты,
| ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
| ХозрасчетныйОстаткиИОбороты.Субконто2.Ид КАК Ид,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет = &Сч60_1
| ТОГДА ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток, 0)
| ИНАЧЕ 0
| КОНЕЦ КАК СальдоНачСч_601,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет = &Сч60_1
| ТОГДА ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборот, 0)
| ИНАЧЕ 0
| КОНЕЦ КАК ОборотСч_601,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет = &Сч60_1
| ТОГДА ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)
| ИНАЧЕ 0
| КОНЕЦ КАК СальдоКонСч_601,
| ХозрасчетныйОстаткиИОбороты.Субконто2.ВидВзаиморасчетов КАК Вид
|ПОМЕСТИТЬ УПП
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
| &НачПериода,
| &КонПериода,
| ,
| ,
| Счет В ИЕРАРХИИ (&Счет),
| ,
| Субконто2.ВидВзаиморасчетов В (&ВидВзаиморасчетов)
| И Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты

Передаю параметр &ВидВзаиморасчетов, возвращаю список значений функцией:

СписокВидов = Новый СписокЗначений;

Если ЭлементыФормы.Агент.Значение = Истина И ЭлементыФормы.Провайдер.Значение = Ложь И ЭлементыФормы.Прочее.Значение = Ложь Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«8»));
Иначе Если
ЭлементыФормы.Агент.Значение = Ложь И ЭлементыФормы.Провайдер.Значение = Истина И ЭлементыФормы.Прочее.Значение = Ложь Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«7»));
Иначе Если
ЭлементыФормы.Агент.Значение = Ложь И ЭлементыФормы.Провайдер.Значение = Ложь И ЭлементыФормы.Прочее.Значение = Истина Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«5»));
ИначеЕсли
ЭлементыФормы.Агент.Значение = Истина И ЭлементыФормы.Провайдер.Значение = Истина И ЭлементыФормы.Прочее.Значение = Ложь Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«8»));
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«7»));
ИначеЕсли ЭлементыФормы.Агент.Значение = Ложь И ЭлементыФормы.Провайдер.Значение = Истина И ЭлементыФормы.Прочее.Значение = Истина Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«7»));
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«5»));
ИначеЕсли ЭлементыФормы.Агент.Значение = Истина И ЭлементыФормы.Провайдер.Значение = Ложь И ЭлементыФормы.Прочее.Значение = Истина Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«8»));
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«5»));
ИначеЕсли ЭлементыФормы.Агент.Значение = Истина И ЭлементыФормы.Провайдер.Значение = Истина И ЭлементыФормы.Прочее.Значение = Истина Тогда
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«8»));
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«7»));
СписокВидов.Добавить(Справочники.ВидыВзаиморасчетов.НайтиПоКоду(«5»));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СписокВидов;

Возврат из функции двух значений

Добрый день. есть функция, которая возвращает 2 значения

всегда выводится крайнее значение.
подскажите, как вывести вывести верно значение, чтобы было
Товар1 НомерАртикулаМетро1 КодВидаТовараМетро1
Товар2 НомерАртикулаМетро2 КодВидаТовараМетро2
и т.д.

а у меня получается
Товар1 НомерАртикулаМетро2 КодВидаТовараМетро2
Товар2 НомерАртикулаМетро2 КодВидаТовараМетро2

Ошибка. Возврат значения функции
Функцию вызываю из общего модуля. Ошибка возникает при присваивании. Общий.

1с 8.2 Связка двух таблиц значений
Здравствуйте. Две таблицы значений объединено запросом , получается так.

Сравнение значений двух выборок
Здравствуйте, форумчане! Размышляю, как лучше реализовать такую штуку -.

Сравнение двух значений реквизитов
Вопрос такого характера. В шапке формы документа имеется реквизит с типов поле.

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