Вход | Регистрация

  1  2

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

Как функции вернуть несколько значений
Я
   vi0
 
03.10.16 - 05:32
1. Возврат структуры50% (11)
3. Свой вариант45% (10)
2. Возврат одного значения и изменение параметров5% (1)
Всего мнений: 22

Поделитесь, какими способами вы пользуетесь при необходимости возврата функцией нескольких значений. И почему.
 
 
   dmpl
 
101 - 05.10.16 - 12:03
(99) Не, в том коде вообще не было классов (как и ООП - чисто в стиле Си был код), а переменные были объявлены как int. Только отладка с показом дизассемблерного кода позволила выявить эту особенность. На это, кстати, напарывались и серьезные производители. Например, у некоторых контроллеров Promise драйвер включал кеширование - так вот оно на многопроцессорных системах иногда путало подключенные к нему диски и писало не на тот диск по случайным секторам, если в момент записи была одновременная активность по нескольким дискам.

P.S. С классами как раз все в порядке было, ЕМНИП. Т.к. обращения к обычным членам класса через ECX идут, который для каждого экземпляра класса различается.
   Loky9
 
102 - 05.10.16 - 12:29
(95) А в каких ситуациях применяются объекты синхронизации?
   spock
 
103 - 05.10.16 - 12:32
(102) Так я на это и намекал. Что если есть общие для потоков ресурсы, то без объектов синхронизации нельзя. Иначе будут гонки.
   Torquader
 
104 - 05.10.16 - 12:46
На самом деле, проблема многопоточного обращения появилась из того, что изначально регистры были 16-битными, а переменные 32-битными - в итоге, второй поток мог обращаться к переменной посреди операции.
Например, когда число переходит с 65535 в 65536 за несколько операций, то второй потом получает 0.
Не забываем, что оптимизатор кода может создавать копии значений в стеке, чтобы не обращаться к ним напрямую (особенно, если разыменовывается несколько указателей) и, в итоге, получается совсем не то, что хотел программист.
Опять же, если мы работаем с объектом и меняем его свойства, то желательно, чтобы второй поток нас ждал иначе будет каша.
Встроенных объектов для синхронизации в любой операционной системе предостаточно, так что всё можно сделать и решить, только получается, что если программист не очень хорошо думал, то все потоки друг друга ждут на объектах синхронизации, а программа работает медленнее чем однопоточная.
   SiMBa_R38
 
105 - 05.10.16 - 13:19
Структура/Неопределено.
Т.к считать параметры в каждом вызове - напрягает.
1. Возврат структуры
   KSergey1C
 
106 - 05.10.16 - 19:37
Как насчет такой задачи: происходит чтение из табличного файла и в нем разные данные(в разных колонках).

И это все надо преобразовать из текстового значения в строки(хотя бы лишние пробел обрезать или допустим в файле ратикул "00001", а в 1С "000000001"), числа, даты, справочники. Т.е. код, примерно такой

тзДанныеДляЗагрузки.Сумма = ПолучитьЧисло(стрФайла.Сумма); 
тзДанныеДляЗагрузки.Колво = ПолучитьЧисло(стрФайла.Колво); 
тзДанныеДляЗагрузки.ДатаДок = ПолучитьДату(стрФайла.Дата); 
тзДанныеДляЗагрузки.НомерДок = ПреобразоватьНомерДок(ПолучитьНомер(стрФайла.Номер)); 
тзДанныеДляЗагрузки.Контрагент = НайтиКонтрагента(стрФайла.ИНН); 
тзДанныеДляЗагрузки.ЕдИз= НайтиЕдИз(стрФайла.ЕдИз); 

Но в файле бывают ошибки. И ошибки разные, есть кртические после которых такую таблицу вообще нельзя загружать, есть те котоыре можно руками поправить, Желательно получить сообщения типа: "В строке Х, не заполнено поле Сумма". Так же допустим ИНН несколько раз встречается проблемный.
Выводить сообщения
НЕ найден контрагент с ИНН 1234567890
НЕ найден контрагент с ИНН 1234567890
НЕ найден контрагент с ИНН 1234567890
НЕ найден контрагент с ИНН 1234567890
НЕ найден контрагент с ИНН 1234567890

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

Конечно можно написать чере структуру
струкКонтрагент = НайтиКонтрагента(стрФайла.ИНН); 

тзДанныеДляЗагрузки.Контрагент = струкКонтрагент .Значение; 
БылаОшибка = струкКонтрагент .Ошибка;
БылаКритическаОшибка= струкКонтрагент.БылаКритическаОшибка;

струкСумма = = ПолучитьЧисло(стрФайла.Сумма);; 

тзДанныеДляЗагрузки.Сумма= струкСумма .Значение; 
БылаОшибка = струкСумма.Ошибка;
БылаКритическаОшибка = струкСумма .БылаКритическаОшибка;
 и  т.д.

Получается засорение кода.
   Провинциальный 1сник
 
107 - 06.10.16 - 03:05
(96) А разве локальные переменные не в стеке хранятся?
   Провинциальный 1сник
 
108 - 06.10.16 - 03:33
(106) "Получается засорение кода."
А вы не засоряйте. Со структурой можно писать красиво и понятно. Придумывайте осмысленные имена переменных и функций, не дублируйте поля структуры переменными без необходимости.
   vi0
 
109 - 06.10.16 - 07:38
(77) > отстойная конструкция этот отказ
почему?
   KSergey1C
 
110 - 06.10.16 - 07:40
(108) В том тои  дело, что разные  функции должны выдавать одинаковые переменные.

Я, например, такое сделал через глобальные переменные.
 
 Рекламное место пустует
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует