|
"Знач" в параметре функции | ☑ | ||
---|---|---|---|---|
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С сама всё сделает. Ну а пихать в таблицу значений или в соответствие - не сильно сложнее, чем в массив. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |