Имя: Пароль:
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) Про интерпретатор что-то конкретное можно сказать только проанализировав его код. Но он явно напрямую со стеком не работает.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн