![]() |
![]() |
![]() |
|
Забавно, чем это объясняется? | ☑ | ||
---|---|---|---|---|
0
MSensey
08.10.08
✎
10:40
|
Нука, что будет выведено на экран в процедуре2 ?
Процедура Процедура1(Знач Параметр1) Параметр1.Очистить(); КонецПроцедуры // Процедура Процедура2() Переменная1 = Новый Массив; Переменная1.Добавить(1); Переменная1.Добавить(2); Процедура1(Переменная1); Сообщить(Переменная1.Количество()); КонецПроцедуры |
|||
1
zbv
08.10.08
✎
10:43
|
нуль
|
|||
2
DeoxyS
08.10.08
✎
10:45
|
(1) эт почему?
|
|||
3
Adoff
08.10.08
✎
10:45
|
(0) ничего удивительного не вижу,
а что по вашему должно быть? |
|||
4
DeoxyS
08.10.08
✎
10:46
|
пля точно нуль
|
|||
5
Adoff
08.10.08
✎
10:46
|
Параметр1 - это ссылка на массив, она не изменяется
а сам массив естественно очищается |
|||
6
DeoxyS
08.10.08
✎
10:47
|
(3) Знач
Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра. |
|||
7
Господин ПЖ
08.10.08
✎
10:47
|
по идее должно быть 2. Т.к. передавалось byval
|
|||
8
DeoxyS
08.10.08
✎
10:47
|
(5) мы же передаем значение а не ссылку
|
|||
9
DeoxyS
08.10.08
✎
10:48
|
(7) во во
|
|||
10
Krom
08.10.08
✎
10:48
|
(0), ответ "2", параметр передается по значению а не по ссылке!
|
|||
11
MSensey
08.10.08
✎
10:48
|
(7) я тоже так думал, а вот получается не так. Вот думаю, толи я плохо учился, толи у 1С свои "понятия"
|
|||
12
Adoff
08.10.08
✎
10:48
|
+(5) на любом языке можете проверить (можно на С++), 0 получите
|
|||
13
DeoxyS
08.10.08
✎
10:49
|
(10) а ты проверь )))
|
|||
14
Krom
08.10.08
✎
10:49
|
(12), не получим
|
|||
15
MSensey
08.10.08
✎
10:49
|
(12) не гонии
|
|||
16
DeoxyS
08.10.08
✎
10:50
|
(12) тут вопрос возникает нах ЗНАЧ нужен
|
|||
17
Adoff
08.10.08
✎
10:50
|
(14) проверь
|
|||
18
zbv
08.10.08
✎
10:51
|
передал - массив, получил - массив, в чем проблема то...
|
|||
19
Adoff
08.10.08
✎
10:52
|
(18) конфигурасты, что с них взять?
|
|||
20
Господин ПЖ
08.10.08
✎
10:53
|
(18) передал то ты массив... А в Процедура1() работаешь с его копией
|
|||
21
DeoxyS
08.10.08
✎
10:53
|
(19) через один шоль посты читаешь???? "...т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры..."
|
|||
22
Adoff
08.10.08
✎
10:53
|
(20) Процедура1 работает с сылкой на массив
|
|||
23
Krom
08.10.08
✎
10:54
|
(17), тут и проверять нечего!
|
|||
24
Adoff
08.10.08
✎
10:54
|
(21) а параметр и не меняется
|
|||
25
DeoxyS
08.10.08
✎
10:55
|
(22)пля америку открыл ))))) тема и завелась из за этого
|
|||
26
Господин ПЖ
08.10.08
✎
10:57
|
(22) А как же "Знач" ? "Знач" = byVal
|
|||
27
DeoxyS
08.10.08
✎
10:57
|
(24) еслиб не менялся выдавал бы "2"
|
|||
28
Adoff
08.10.08
✎
10:58
|
(26) Знач означает, что сама ссылка не изменится, она и не меняется
|
|||
29
Adoff
08.10.08
✎
10:59
|
(27) дятел, ты вообще не понимаешь разницу между областью памяти и ссылкой на эту область?
|
|||
30
DeoxyS
08.10.08
✎
10:59
|
(26) а без Знач она менятется ?
|
|||
31
DeoxyS
08.10.08
✎
11:00
|
(29) ну так просвети раз башковитый такой
|
|||
32
Adoff
08.10.08
✎
11:01
|
(31) это в школе проходят на уроках информатики, вот туда и вали
|
|||
33
Господин ПЖ
08.10.08
✎
11:04
|
(28) странно все это.
Если заменить массив на числа: Процедура Процедура1(Знач Параметр1) Параметр1 = 0; КонецПроцедуры // Процедура Процедура2() Переменная1 = 2; Процедура1(Переменная1); Сообщить("" + Переменная1); КонецПроцедуры будет "2" |
|||
34
MSensey
08.10.08
✎
11:05
|
(32) Adoff разве ключевое слово рядом с параметром не указывает на то что надо передавать не по ссылке на по значению?
Да, 1С по умолчанию использует ссылки (указатели). Но я думал, что "Знач" указывает что надо передать сам объект. |
|||
35
DeoxyS
08.10.08
✎
11:05
|
(32) Способ передачи параметров в подпрограмму
Существует несколько способов передачи параметров в подпрограмму. Передача параметров по значению. Формальному параметру присваивается значение фактического параметра. В этом случае формальный параметр будет содержать копию значения, имеющегося в фактическом, и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических. Так, если в качестве фактического параметра будет использована переменная, и внутри подпрограммы значение соответствующего формального параметра будет изменено, то фактический параметр останется без изменений. int func1(int x) { x=x+1; return x; } Передача параметров по ссылке. В формальный параметр может быть помещён сам фактический параметр (обычно это реализуется путём помещения в формальный параметр ссылки на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре — оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение. void func2(int &x) { x=x+1; } |
|||
36
DeoxyS
08.10.08
✎
11:06
|
(32) +1 просветись дитё
|
|||
37
Krom
08.10.08
✎
11:07
|
(35), вообще на баг похоже
|
|||
38
Chin
08.10.08
✎
11:08
|
Переменная1 содержит значение в виде ссылки, сама ссылка и не меняется, но меняется объект-массив. Adoff прав на 100%... Эта хрень со всеми ссылочными объектами срабатывает. Если бы в процедуре прописать, например, Переменная1 = Массив2, вот тогда Знач сработало и после выполнения процедуры значение переменной осталось бы равно переданному массиву...
|
|||
39
Chin
08.10.08
✎
11:09
|
(34) Здесь подменяются понятия. Подразумевается ссылка на переменную, а не на объект содержащийся в ней.
|
|||
40
MSensey
08.10.08
✎
11:09
|
(36) как я понял Adoff говорит о том, что передается указатель по значению, т.е. создается копия указателя. Но копия указывает на один и тотже объект (класс). Поэтому такая фича
|
|||
41
DeoxyS
08.10.08
✎
11:19
|
ок, тогда объясните мне пожалуйста след поведение:
Процедура Процедура1(Знач Параметр1) Параметр1 = 3; КонецПроцедуры // Процедура КнопкаВыполнитьНажатие(Кнопка) Переменная1 = Новый Массив; Переменная1.Добавить(1); Переменная1.Добавить(2); Процедура1(Переменная1); Сообщить(Переменная1.Количество()); КонецПроцедуры |
|||
42
Chin
08.10.08
✎
11:22
|
Ответ 2
И что не так? |
|||
43
DeoxyS
08.10.08
✎
11:24
|
(42) не могу понять почему в (0) и (41) отрабатывает по разному...
|
|||
44
Chin
08.10.08
✎
11:30
|
в (0) применяют команду "очистить()" к ссылке на массив, соответственно изменяя объект-массив. В (41) ссылка на массив заменяется на число, при этом сам массив остается неизменным. Если не использовать Процедуру1, то тот же код можно написать так:
Процедура КнопкаВыполнитьНажатие(Кнопка) Переменная1 = Новый Массив; Переменная1.Добавить(1); Переменная1.Добавить(2); //Процедура1(Переменная1); Параметр1 = Переменная1; Параметр1 = 3; //естественно массив останется невридимым Сообщить(Переменная1.Количество()); КонецПроцедуры |
|||
45
DeoxyS
08.10.08
✎
11:32
|
ПППЛЛЯЯЯЯ сылка гришь
Процедура Процедура1(Знач Параметр1) Параметр1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000099") ; КонецПроцедуры // Процедура КнопкаВыполнитьНажатие(Кнопка) Переменная1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098"); //Переменная1.Добавить(1); //Переменная1.Добавить(2); Процедура1(Переменная1); Сообщить(Переменная1.Код); КонецПроцедуры |
|||
46
Krom
08.10.08
✎
11:34
|
(45), так уж ответ привел бы
|
|||
47
DeoxyS
08.10.08
✎
11:34
|
(46) ЦБД00000098
|
|||
48
DeoxyS
08.10.08
✎
11:35
|
(44) сам себе противоречишь уже )))
|
|||
49
MSensey
08.10.08
✎
11:37
|
(45) а ты что под ссылкой подразумеваешь?
|
|||
50
Serg_1960
08.10.08
✎
11:37
|
(0) Совет: <не могу понять...> - тогда остановись и подумай! Поставь на этом точку... останова и в Монитор "думать" :)
|
|||
51
DeoxyS
08.10.08
✎
11:38
|
я так понял 1С не отрабатывает только Коллекции типов, аля Масси список Тз и тд и тп, со всеми остальными типами работает как положено.
|
|||
52
Krom
08.10.08
✎
11:38
|
(48), не я понял так, что если в самом объекте произвести изменение, то оно останется в базе! Типа того...
Процедура Процедура1(Знач Параметр1) Параметр1.ПолучитьОбъект().Наименование = "123"; Параметр1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000099") ; КонецПроцедуры // Процедура КнопкаВыполнитьНажатие(Кнопка) Переменная1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098"); //Переменная1.Добавить(1); //Переменная1.Добавить(2); Процедура1(Переменная1); Сообщить(Переменная1.Код); КонецПроцедуры |
|||
53
MSensey
08.10.08
✎
11:38
|
(50) не учи отцаибаста
|
|||
54
Krom
08.10.08
✎
11:39
|
(52), то у элемента Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098") изменится наименование
|
|||
55
Krom
08.10.08
✎
11:39
|
(54), в то же время ссылка не изменится
|
|||
56
MSensey
08.10.08
✎
11:42
|
(55) какая ссылка?
|
|||
57
Krom
08.10.08
✎
11:46
|
(56), в процедуре мы меняем значение Параметр1, но на саму ссылку Переменная1 это не влияет! А вот если мы в объекте, полученному по ссылке Переменная1 что нибудь поменяем, то это останется!
|
|||
58
Adoff
08.10.08
✎
11:47
|
пля, как всё запущено :(
|
|||
59
Krom
08.10.08
✎
11:49
|
(58), что ругаешься? люди разобраться хотят!
|
|||
60
ptiz
08.10.08
✎
11:49
|
Уважаемые, специально для вас 1С на ИТС написала статью "Передача параметров по ссылке и по значению при вызове процедур и функций".
Пользуйтесь на здоровье. p.s. как же сложно было сдержаться от других слов... |
|||
61
Господин ПЖ
08.10.08
✎
11:49
|
однако как вам проперло...
|
|||
62
MSensey
08.10.08
✎
11:50
|
(58) неговори, совсем мозги закостенели от 1С
|
|||
63
Adoff
08.10.08
✎
11:50
|
загляните наконец в теорию ООП
нужно увидеть разницу между простыми типами, и указателями |
|||
64
HEKPOH
08.10.08
✎
11:51
|
все прочитал - все перепробовал :)
(60) теперь иду сюда Если останутся неясности, буду ругаццо на коллекции :) |
|||
65
MSensey
08.10.08
✎
11:51
|
(60) лучше бы нормально в СП написали
|
|||
66
Adoff
08.10.08
✎
11:54
|
(65) в СП всё правильно написано
|
|||
67
Chin
08.10.08
✎
11:59
|
(66) Там иногда так мудрено написано, что читать не хочется :)))
|
|||
68
MSensey
08.10.08
✎
11:59
|
(66) а и не говорю, что не правильно. Я говорю нормально.
|
|||
69
Torquader
08.10.08
✎
12:01
|
Если взять, например, язык JavaScript, то в нём нет управления передачей параметров. Все обычные переменные передаются по значению, а объекты передаются по ссылке (формально, объект - это адрес в памяти, где находятся данные самого объекта).
При передаче копии объекта надо специально его копировать оператором new. Поэтому, в 1С стоит запомнить одно - все объектные типы представляют собой указатель. И чтобы вы с ним не делали (по значению или по ссылке) он всё равно окажется указателям. |
|||
70
MSensey
08.10.08
✎
12:03
|
(69) точнее в 1С операции выполняются с указателями
|
|||
71
bahmet
08.10.08
✎
12:03
|
Вроде многие мистяне в прошлом Сишники и Паскальники...странно что на такой фигне пробуксовали...
|
|||
72
Serg_1960
08.10.08
✎
12:05
|
Открыватели Америки секрет Полишинеля узнали
|
|||
73
HEKPOH
08.10.08
✎
12:06
|
(60) респект и уважуха! послал куда надо :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |