Имя: Пароль:
LIFE
 
OFF: Зачем нужны Процедуры, если есть Функции
0 Сергиус
 
27.10.11
12:26
Интересует не вообще в программировании, а именно в 1с. Почему сделали и то и то, хотя таже функция вполне может ничего не возвращать(по сути быть процедурой)?
1 Маленький Вопросик
 
27.10.11
12:27
(0) тупой вопрос... удалите
2 Megas
 
27.10.11
12:28
Для логического разделения.
3 jsmith82
 
27.10.11
12:29
4 DrShad
 
27.10.11
12:29
(1) вот сейчас согласен с тобой
5 trambalda
 
27.10.11
12:30
6 Ненавижу 1С
 
гуру
27.10.11
12:30
(0) в 1С функция не может ничего не возвращать, по-умолчанию Неопределено вернет
7 Сергиус
 
27.10.11
12:30
(1) интересно..чем он тупой?) Вы делаете заявление, но не обосновываете его)
8 Ненавижу 1С
 
гуру
27.10.11
12:31
(7) они тут такие, тупые и жадные... дятлы одним словом
9 mm_84
 
27.10.11
12:33
(7) иди учи основы программирования
10 Сергиус
 
27.10.11
12:33
Вот, в (6) человек ответил четко и лаконично. Респект!)
11 Сергиус
 
27.10.11
12:34
(9)здесь вопросы могут задавать только гуру программирования, которые знают всё, всё?)
12 Ненавижу 1С
 
гуру
27.10.11
12:35
(9) я фигею...
13 izekia
 
27.10.11
12:35
(0) а процедура может возвращать значения, причем с точки зрения реализации работать аналогично функции
14 DrShad
 
27.10.11
12:36
(11) любой человек может задавать вопрос, но ты сам не написал почему тебя это так волнует и что по этому поводу тебе сказал БГ?
15 DJ Anthon
 
27.10.11
12:36
(0) мне уже объяснили. а тебе еще нет... каждый чел на этом форуме рано или поздно задает этот вопрос.
16 izekia
 
27.10.11
12:36
(!5) я не задавал и не буду
17 Phace
 
27.10.11
12:37
(11) Просто твой вопрос - древнейший баянище. Эта тема уже обсуждалась неоднократно. Каждый сишник считает своим долгом поинтересоваться.
18 Сергиус
 
27.10.11
12:38
(13)хм..интересно, и как же она может непосредственно что-то возвращать?
19 aka AMIGO
 
27.10.11
12:39
(13) - только возвращать в виде параметров

а вообще - имхо - надо не заморачиваться "что и для чего есть в языке" - надо применять..
а что применять - сообразить самому.
20 VladZ
 
27.10.11
12:40
(0) У нас свободная страна! Не нужны тебе процедуры - не используй! Никто не заставляет.
21 НЕА123
 
27.10.11
12:41
(0)
в частности, из-за отсутствия типизированности.
функция типа void = процедура.
22 ДенисЧ
 
27.10.11
12:41
(20) Хочу к вам в страну...
23 Nallama
 
27.10.11
12:41
(0) не мешай 1С притворяться нормальной средой разработки.
24 aka AMIGO
 
27.10.11
12:41
+19
НоваяПеременная = МояКрутаяФункция(пар1, пар2...);

согласны?

а вот процедуру так использовать нельзя :)
25 Сергиус
 
27.10.11
12:43
(21)это применительно к си говоришь? в 1с то это как мешает?
26 Сергиус
 
27.10.11
12:43
(24) согласен)
27 mm_84
 
27.10.11
12:43
(24) но результат получить можно)
МояКрутаяПроцедура(пар1, пар2...,НоваяПеременная)
куда и засунешь результат)
28 mm_84
 
27.10.11
12:44
(27) правда надо инициализировать заранее)
29 izekia
 
27.10.11
12:44
да, причем так же все через стек передастся
30 aka AMIGO
 
27.10.11
12:45
(28) вот, и видишь наглядно разницу :)
31 izekia
 
27.10.11
12:45
вот если бы у 1С были бы зачатки функционального программирования, тогда бы не возникало таких вопросов, и с функциями можно было бы столько сделать
32 izekia
 
27.10.11
12:45
(30) в случае с функцией создание переменной откладывается до возвращения из нее
33 izekia
 
27.10.11
12:46
надо признать, что в 1С понятие различия между функциями и процедурами практически стерты
34 Сергиус
 
27.10.11
12:47
(32) и что это дает в плане выигрыша?..
35 Сергиус
 
27.10.11
12:48
+(34) если только память не сразу занимается..но это скорее плюс функции, чем процедуре.
36 НЕА123
 
27.10.11
12:49
(25)
эээ...
>это применительно к си говоришь?
только синтаксис сишный употребил.
>в 1с то это как мешает?
мешает что? если про отсутствии типизации то да, зачастую сильно.
непонятно с чем работаешь, непонятно, что можно давать в качестве фактического параметра.
37 izekia
 
27.10.11
12:49
(зато функция под возврат место в стеке занимает, когда можно параметром обойтись ... в общем по сути это одно и то же если откинуть идеологические соображения
38 Ненавижу 1С
 
гуру
27.10.11
12:50
чему равно А?

Функция Тест(А)
 А = А+1;
 Возврат 2*А;
КонецФункции

А = 5;
А = Тест(А);
39 izekia
 
27.10.11
12:51
12 вроде ... 1С же все по ссылке передает
40 izekia
 
27.10.11
12:51
а не 6
41 izekia
 
27.10.11
12:51
нет 12
42 Рэйв
 
27.10.11
12:51
(12)
43 Рэйв
 
27.10.11
12:51
(38)12
44 Рэйв
 
27.10.11
12:52
(39)А так?

Функция Тест(Знач А)
А = А+1;
Возврат 2*А;
КонецФункции

А = 5;
А = Тест(А);
45 Рэйв
 
27.10.11
12:53
Или так

Функция Тест(Знач А)
А = А+1;
Возврат 2*А;
КонецФункции

А = 5;
В = Тест(А);
46 Ненавижу 1С
 
гуру
27.10.11
12:53
(44) 12
47 GROOVY
 
27.10.11
12:53
(30) Все переменные "создаются" на этапе инициализации модуля, даже те что неявно объявлены в модуле.
48 НЕА123
 
27.10.11
12:54
Функция Тест(Знач А)
А = А+1;
Возврат 2*А;
КонецФункции

А = ИСТИНА;
А = Тест(А);
49 izekia
 
27.10.11
12:54
(47) ты имел в виду объвлены в методах или в модуле?
50 izekia
 
27.10.11
12:55
(48)4
51 Рэйв
 
27.10.11
12:56
(19)
Перем А; - явное объявление
А=1 - неявное объявление
52 GROOVY
 
27.10.11
12:56
Объявлены в методах это как?
53 Рэйв
 
27.10.11
12:56
(51)->(49)
54 izekia
 
27.10.11
12:57
есть переменные модуля, есть метода
55 izekia
 
27.10.11
12:58
(53) и что?
56 GROOVY
 
27.10.11
12:58
(54) Пример приведи.
57 izekia
 
27.10.11
12:58
+ (49) что понимается под словом "создаются"?
58 GROOVY
 
27.10.11
13:00
(57) То же что в (32)
59 izekia
 
27.10.11
13:00
(56)

Перем ПеременнаяМодуля;

Процедура Процедура1()
   Перем ПеременнаяМетода;
КонецПроцедуры
60 GROOVY
 
27.10.11
13:01
(59)  Понятно. Терминология у нас разная. Сути это не меняет. Ответ на (49) все.
61 izekia
 
27.10.11
13:02
(58) то есть введение некоего имени ссылающегося на Неопределено?
62 izekia
 
27.10.11
13:02
(60) ясно
63 dmpl
 
27.10.11
13:03
(29) Нифига, результат возвращается в EAX/RAX или в ST(0), а не в стэк.

(37) Садись, 2. Ничего она не занимает под возврат. Результат возвращается в регистре.
64 НЕА123
 
27.10.11
13:03
(61)
речь об этом, что-ли.

Функция Тест(А)
 Если Ложь Тогда
   В="ё12ё123ё1";
 КонецЕсли;
 Сообщить("авправп"+В);
КонецФункции
65 izekia
 
27.10.11
13:06
(63) в 1С результат возвращается в регистре? как ссылка?
66 Ненавижу 1С
 
гуру
27.10.11
13:09
вот 1С и заморочила своими терминами, контекст понятия слова "ссылка"
67 Волесвет
 
27.10.11
13:12
всех одеть в шапки-ушанки, телогрейки, ватные штаны и валенки
68 dmpl
 
27.10.11
13:22
(65) Результат возврата любой функции содержится в регистре (это определяется компилятором). 1С тут не властна ни над чем. Просто если результат не умещается в регистре, то возвращается указатель на объект, переданный в качестве неявного параметра (т.е. в стек помещается только указатель, а не весь объект). Место в стеке под неявный параметр указателя на область памяти для результата возврата выделяется только если функция возвращает объект, не умещающийся в регистре. Т.е., если возвращается объект размером больше 4(8) байт, а не указатель на него. Для возврата простых типов (целые/дробные числа и т.п.) результат требует только регистр.

Насчет того, как возвращает результат 1С. Вот, возьмем пример: возврат структуры или таблицы значений. Чтобы функции вернуть объект (а не указатель), она должна получить от вызывающей стороны указатель на область памяти под этот объект (в качестве неявного параметра в стеке). Чтобы дать такой указатель, вызывающий должен знать РАЗМЕР ВОЗВРАЩАЕМОГО ОБЪЕКТА. Очевидно, что для структуры и таблицы значений размер объекта в момент вызова неизвестен. Поэтому функция должна выделять память под такой объект сама и возвращать указатель на него. Т.е., можно сделать вывод, что результат возврата функции либо значение простого типа, либо указатель на объект.
69 izekia
 
27.10.11
13:31
(68) ну в 1С все возвращается по ссылке, соответственно я мог бы согласиться с тобой, но 1С не компилирует код, а за интерпретатор я бы не стал так определенно утвержать
70 izekia
 
27.10.11
13:33
(68) если посмотреть нетовский IL, то там для возврата используется стек как раз
может потом уже для конкретной реализации хранение в стеке заменяется на регистры
это просто как пример
71 dmpl
 
27.10.11
13:37
(69) Про интерпретатор что-то конкретное можно сказать только проанализировав его код. Но он явно напрямую со стеком не работает.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший