Имя: Пароль:
1C
1С v8
"Знач" в параметре функции
,
0 alexei366
 
01.11.13
17:12
Есть у меня кусок кода который создает массив, набивает его несколькими элементами, потом передает в функцию в которой входящий параметр написан со "Знач". В этой функции идет обработка массива в процессе которой может происходить удаление некоторых его элементов (собственно для этого и нужно было "Знач" чтобы в главной функции массив оставался не измененным).
Корочь как вы поняли после выхода из функции массив отличается.

Так и должно работать? или как? Выполняется с директивой НаСервере
1 fisher
 
01.11.13
17:14
"Знач" кажись только для примитивных типов работает.
Оно и правильно. Нефиг всякую мегахрень в стек пихать.
2 alexei366
 
01.11.13
17:21
(1) Ну возможно, яж уточнить хочу
3 Serg_1960
 
01.11.13
17:21
Открой для себя Америку - прочти на ИТС статью "Передача параметров по ссылке и по значению при вызове процедур и функций"

:)
4 alexei366
 
01.11.13
17:21
(1) У меня просто ещё и платформа последняя, я чот ей не доверяю.
5 alexei366
 
01.11.13
17:22
(3) Думал об этом, из того что читал помню вродь написано было что значение переданное со "Знач" останеться неизменным.
А на ИТС у меня подписки нет.
6 fisher
 
01.11.13
17:26
(3) Там как-то совсем расплывчато.
"Передача переменных различных типов данных по значению имеет свои особенности. Они заключаются в том, что при работе с методами и свойствами контекста формальных параметров может изменяться состояние фактического параметра, передаваемого при вызове процедуры или функции."
И пример с ТЗ приводится.
7 Лефмихалыч
 
01.11.13
17:27
(0) в переменной не примитивного типа хранится не значение, а ссылка. Ссылка передается по значению, все, как полагается. Только меняешь ты в функции не ссылку, а данные, на которые она указывает. Так что "Знач" для массивов и прочих агрегатных объектов ни фига толком не значит.
8 Infsams654
 
01.11.13
17:32
(0) но содержимое элементов массива может меняться - тут Знач то уж никак не поможет. Или все таки меняется сам массив (состав) ?
9 fisher
 
01.11.13
17:35
(7) "Значение" и "Ссылка" тут понятия относительные. Одинэсовские примитивные типы "Число" и "Строка" - на самом деле являются не такими уж примитивными классами.
10 Serg_1960
 
01.11.13
17:39
Эээ... позвольте вас всех уточнить :) "Знач" всегда работает и работает - корректно... но не всегда так, как некоторые ожидают этого.

(9) Мне кажется, употребляя термин "ссылка", Лефмихалыч несколько об другом говорил - об идентификаторе на область памяти(если так допустимо выразиться)
11 alexei366
 
01.11.13
17:43
(10) Понял понял я, Знач не катит, надо копировать массив
12 Darth Anyan
 
01.11.13
17:44
(7) только одно уточнение - Знач блокирует возврат параметра из другого контекста.

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

Для проверки можно создать внешнюю обработочку с командой и вот таким кодом модуля формы:

[code]
&НаКлиенте
Процедура Команда1(Команда)
    Массив = Новый Массив;
    Массив.Добавить(1);
    Массив.Добавить(2);
    ОбработатьМассивНаСервере(Массив);
    
    Для каждого Эл из Массив Цикл
        Сообщить(Эл);
    КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ОбработатьМассивНаСервере(Массив)
    Массив.Удалить(0);
КонецПроцедуры [/code]

А потом в серверной процедуре поставить слово Знач перед параметром.
13 fisher
 
01.11.13
17:44
(10) Я о том, что при передаче по значению числа или строки, фактически происходит копирование не такой уж примитивной динамической структуры данных. Теоретически ничего не мешало реализовать это и для массивов.
Разделение, я думаю, чисто политическое. Лично я с ним согласен.
14 Поросенок Петр
 
01.11.13
17:47
Если хорошенько накуриться, а потом почитать раздел книги Элджера C++ for real programmers про использование в С++ ключевого слова "const", то слово "знач" станет для вас песец как очевидным.
15 fisher
 
01.11.13
17:52
(14) Накуриться нужно чрезвычайно сильно, потому что это разные вещи.
16 Лефмихалыч
 
01.11.13
17:55
етить вы зануды...
17 Поросенок Петр
 
01.11.13
17:57
(15) Спасибо, кэп. Но обе эти вещи лежат в одном холодильнике ключевых слов, если раскурил const, то раскуришь знач, в этом их сходство.
18 Serg_1960
 
01.11.13
17:58
(13) В принципе, согласен. Но разработчики 1С накрутили с массивом так, что он в "примитивные", при всём желании, ну ни как уже не влазит :)
19 fisher
 
01.11.13
18:02
(18) Я думаю, основная причина - не провоцировать копирование в стек больших структур данных. Это чревато.
20 Поросенок Петр
 
01.11.13
18:03
Пилят!!! Выносим в отдельный кусок памяти переданный параметр. Копируем этот с*ый е*й о*ый кусок памяти. Число скопировалось в число, ссылка на массив в памяти скопировалась в ссылку на массив в памяти. Вы чо хотите?
21 fisher
 
01.11.13
18:17
(20) Попей чайку. Лучше сладкого. Потом подумай о том, что не обязательно ты умный, а вокруг одни дураки. Можешь припомнить также, что происходит при передаче объекта параметром функции в С++
22 Torquader
 
01.11.13
21:40
В данном случае, лучше почитать статьи про JavaScript, так как там передается только копия переменной (то есть всегда подразумевается знач).
Самое главное, что присвоение А=Б создаёт копию объекта только в Си++, где это предусмотрено конструктором.
В остальных языках мы просто копируем ссылку на объект в другую переменную. Если бы этого не было, то работать, скажем, с таблицей значений было бы нельзя - при копировании её в другую переменную создавалась бы копия.

Другими словами вызов функции с параметром Знач равносилен коду:
ВремПараметр=ПереданныйНамМассив;
// уже внутри функции
ВремПараметр.ДобавитьЭлемент(123);
ВремПараметр="Не знаю что";
// теперь в параметре что-то совершенно другое, но массив мы успели поменять.
23 rozer76
 
03.11.13
21:16
(12) >> но и все параметры
примитивных типов вроде это не касается
24 ДенисЧ
 
03.11.13
21:21
опять тупые 1сники обсуждают константные сслыки?
25 rozer76
 
03.11.13
21:21
(23) сорри... не так прочел :(
26 Лефмихалыч
 
03.11.13
21:31
третий день спорите, у кого 22 сантиметра длиннее и все ни как не найдете чемпиона?..
27 GANR
 
03.11.13
21:59
(0) Да уж... А в Турбо Паскаль 7.0 и массив не менялся.
(1) Так какого лысого 1С глотает это??? Вываливало бы сразу исключение - лучше уж пусть программа не работает вообще и предупреждает, чем молча работает неправильно.
28 hhhh
 
03.11.13
22:10
(27) так оно ведь правильно работает, о чем предупреждать?
29 ДенисЧ
 
03.11.13
22:13
(27) в паскакале это был тупой объём памяти. В 1с не так.
30 Classic
 
03.11.13
23:32
(27)
почему неправильно?
Если ты сделаешь
Процедура МояПроц(Знач МассивИсключений)
   МассивИсключений = Новый Массив;
КонецПроцедуры

то ничего с массивом не случится
31 Rie
 
03.11.13
23:52
(30) +100
Вот этот пример, IMHO, и есть объяснение.
Только надо, чтобы читатель понимал, что есть "мутабельное" и "иммутабельное" (или как оно там называется).
32 alexei366
 
04.11.13
02:14
Да все пацаны забейте, я уже алгоритм переписал без удаления элементов массива (удалял я их чтобы в в процессе выполнения обработки поиск по массиву был быстрее и быстрее, но в принципе забить на эти десятые знаки после запятой секунды)
33 Rie
 
04.11.13
08:15
(32) Так... С алгоритмами поиска - товарисч не знаком. Есть также предположение, что и с таблицами значений не до конца разобрался...
34 alexei366
 
04.11.13
13:05
(33) Поведуй в кратце (да не знаком наверно)
35 Rie
 
04.11.13
13:11
(34) Насчёт алгоритмов поиска - если массив отсортируешь, то можно будет искать двоичным поиском за логарифмическое время. А можешь вместо массива использовать Соответствие - там хеш-таблица, поиск - за константное время.
Что касается таблиц значений - у них есть Индексы. Обеспечивают поиск за логарифмическое время. Причём ничего и делать не надо - просто укажи индекс, 1С сама всё сделает.
Ну а пихать в таблицу значений или в соответствие - не сильно сложнее, чем в массив.