Передача ссылки на примитивные типы

1. PerlAmutor 129 27.01.17 11:14 Сейчас в теме
Почему платформа не передает ссылку на числовую переменную, хоть в ИТС и сказано, что по умолчанию должна передаваться именно ссылка?

Процедура Инициализация()
    ЧисловаяПеременная = 777;
    П = Новый Структура ("ЧисловаяПеременная", ЧисловаяПеременная);
    ЧисловаяПеременная = 888;
    Тест(П);
    Сообщить(СтрШаблон("%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
КонецПроцедуры

Процедура Тест(П)
    Сообщить("Внутри тест: " + П.ЧисловаяПеременная);
    П.ЧисловаяПеременная = 999;
КонецПроцедуры
Показать


Тут в качестве результата мы должны получить идентичные значения. Но они разные...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. spacecraft 27.01.17 11:43 Сейчас в теме
(1)
Тут в качестве результата мы должны получить идентичные значения. Но они разные...

А с чего они должны быть одинаковые?
Как раз работает передача по ссылке.
Смотрите:
1. Присваиваем переменной значение 777.
2. Сохраняет ссылку на переменную в структуру.
3. Присваиваем переменной значение 888. Тут это уже новая переменная с таким же именем. 1С это позволяет делать. Значение присваивания примитивных типов всегда делается по значению.
4. Передаем структуру по ссылке в другую процедуру.
5. В другой процедуре изменяем значение переменной 999. Фактически заменяем хранящуюся там переменную новым значением.
6. Возвращаемся обратно.
7. Выводим значение переменной и новое значение из структуры.

Тут главное понять, что в структуре хранится не ссылка, а туда передается значение по ссылке. Это разные операции.
5. PerlAmutor 129 27.01.17 11:53 Сейчас в теме
(4)
3. Присваиваем переменной значение 888. В структуре значение переменной так же 888.

Это не так. Там все так же 777. Проверь сам.

    ЧисловаяПеременная = 777;
    П = Новый Структура ("ЧисловаяПеременная", 0);
    П.ЧисловаяПеременная = ЧисловаяПеременная;
    ЧисловаяПеременная = 888;
    Сообщить(СтрШаблон("1:%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
    Тест(П);
    Сообщить(СтрШаблон("2:%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
Показать


Так как реализовать передачу ссылок на кучу переменных из одной процедуры в другую?
6. spacecraft 27.01.17 11:57 Сейчас в теме
(5) 3. Присваиваем переменной значение 888. Тут это уже новая переменная с таким же именем. 1С это позволяет делать. Значение присваивания примитивных типов всегда делается по значению.
7. PerlAmutor 129 27.01.17 12:03 Сейчас в теме
(6) Думал такое прокатит. Не прокатило... оператор "Новый" похоже не работает как в C++
ЧисловаяПеременная = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2,ДопустимыйЗнак.Любой)); 
8. spacecraft 27.01.17 12:06 Сейчас в теме
(7) а в 1С это не создание объекта, это все так же примитивный тип.
9. PerlAmutor 129 27.01.17 12:07 Сейчас в теме
(8) Такое тоже не прошло =(
 С помощью встроенной функции Новый (New) не могут создаваться значения примитивных типов (Число)
    ЧисловаяПеременная = Новый(Тип("Число"));
2. dmitrichenko.ivan 6 27.01.17 11:27 Сейчас в теме
А где на ИТС это сказано? Структура хранит значение, а не ссылку на переменную
3. PerlAmutor 129 27.01.17 11:34 Сейчас в теме
(2) там сказано действительно только про передачу параметров. Но насколько я понимаю, если в качестве значения ключа в структуру передать другую структуру, то все-таки будет передана ссылка, а не копия структуры. Или я не прав? Каким образом вообще можно взять ссылку на любой тип переменной и поместить в муссив или структуру?
10. herfis 499 27.01.17 12:08 Сейчас в теме
Вы путаете с передачей параметров процедур/функций. Там в самом деле по умолчанию передача параметров идет всегда по ссылке, даже примитивных типов (если не использовать Знач).
А в вашем примере аналог простого присваивания одной переменной примитивного типа другой. Оно всегда делается по значению.
Даже не знаю, в каких языках это иначе.
11. PerlAmutor 129 28.01.17 22:10 Сейчас в теме
Стало быть вопрос должен решаться следующим образом:
Процедура Обработка(Объекты)
    Перем1 = 0; 
    Перем2 = "Старое значение";
    Перем3 = Ложь;
    Перем4 = Новый Массив;
    Перем4.Добавить("Неизбежность светлого будущего");
    Перем5 = Неопределено;
	Перем6 = Перем1;

    Контекст = ПолучитьКонтекст(Перем1, 
                                Перем2,
                                Перем3,
                                Перем4,
                                Перем5,
                                Перем6);

    Если Объекты.Количество() > 0 Тогда
        Если ТипЗнч(Объекты[0]) = Тип("ТаблицаЗначений") Тогда
            Перем1 = 10;
            ИзменениеПеременных(Контекст);
        ИначеЕсли ТипЗнч(Объекты[0] = Тип("Структура") Тогда
            Перем5 = ТекущаяДата();
            ИзменениеПеременных(Контекст);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура ИзменениеПеременных(Контекст)
    Контекст.Перем1 = Контекст.Перем1 + 1;
    Контекст.Перем2 = "Новое значение";
    Контекст.Перем3 = Истина;
    Контекст.Перем4 = Новый Массив;
    Если Не ЗначениеЗаполнено(Контекст.Перем5) Тогда
        Контекст.Перем5 = глЗначениеПоУмолчанию;
    КонецЕсли;
    Контекст.Перем6.Удалить(0);
КонецПроцедуры

Процедура ПолучитьКонтекст(Перем1, 
                           Перем2,
                           Перем3,
                           Перем4,
                           Перем5,
                           Перем6)
// Перем100)
    Возврат Новый Структура("Перем1
                            |Перем2,
                            |Перем3,
                            |Перем4,
                            |Перем5,
                            |Перем6",
                            Перем1, 
                            Перем2,
                            Перем3,
                            Перем4,
                            Перем5,
                            Перем6);
КонецПроцедуры
Показать
12. herfis 499 30.01.17 11:17 Сейчас в теме
(11) Глаза слезятся, если честно, на это смотреть. Весь программистский мир движется в сторону максимума immutability, а вы тут лишние контексты на ровном месте изобретаете.
13. PerlAmutor 129 30.01.17 19:59 Сейчас в теме
(12) У меня тоже слезятся. Все потому, что разработчики 1С используют ООП, С++ и все богатые возможности этого языка, но не позволяют ничего подобного в синтаксисе их языка, намеренно ограничивая реальные возможности не только языка С++, но и GPLных библиотек, которые они используют. Очень надеюсь, что в ближайшем будущем основным скриптовым языком в 1С станет стандарт EcmaScript или V8.
14. kasper076 105 31.01.17 08:20 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот