Страница 1 из 3
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 9:31
Игорь Столяров
Привет всем !
Или я чего-то не понимаю или что-то оно совсем не того …
Пробую передать в процедуру группу по адресу:
Код: Выделить всё
Main Procedure
TypeData Group,Type
Str String(20)
end
Map
TestStr(const *TypeData)
end
MyData Group(TypeData)
end
Code
TestStr(MyData)
Message(MyData.Str) ! = "ПРИВЕТ !" ПОЧЕМУ ?!!!
TestStr Procedure(xGroup_)
Code
xGroup_.Str = "ПРИВЕТ !"
Почему изменяется значение MyData.Str ? Ведь группа передаётся в процедуру с запретом на изменение (CONST) …
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 12:31
Дед Пахом
Игорь Столяров писал(а): ↑16 Апрель 2019, 9:31Или я чего-то не понимаю или что-то оно совсем не того …
очевидно первое.
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 12:39
Игорь Столяров
Дед Пахом писал(а): ↑16 Апрель 2019, 12:31очевидно первое.
А можно пояснить в чём причина, для тех кто в танке ?
Я то уже выкрутился, но хотелось бы понять …
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 12:49
Дед Пахом
CONST запрещает изменять переданный параметр, в данном случае ссылку на группу. Правда, я не знаю, как её можно изменить и без CONST, но это другой вопрос.
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 13:04
Игорь Столяров
Дед Пахом писал(а): ↑16 Апрель 2019, 12:49CONST запрещает изменять переданный параметр, в данном случае ссылку на группу. Правда, я не знаю, как её можно изменить
Несогласный я с обоими утверждениями !
В этом случае TestProc(const *string) должно запрещать изменять ссылку на STRING, но запрещает-то изменять ЗНАЧЕНИЕ строки …
Изменить можно присвоив адрес группы с аналогичным типом …
Тут, что-то связанное с тем, что параметр-группа всегда передаётся по адресу.
Т.е. объявление TestProc(*Group) и TestProc(Group) - по сути одинаковы, в обоих случаях передаётся ссылка.
Но тогда непонятно зачем в синтаксисе языка описания TestProc(const *Group) и TestProc(Group) которые по сути
не работают и создают путаницу … Что здесь снова нечисто.
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 13:12
Дед Пахом
Игорь Столяров писал(а): ↑16 Апрель 2019, 13:04должно запрещать изменять ссылку на STRING, но запрещает-то изменять ЗНАЧЕНИЕ строки
Нет, тут происходит изменение ссылки. Есть 2 строки в памяти: 'ABC' и 'DEF'. Сначала ссылка указывает на первую, потом на вторую. Вобщем, я так это понимаю, хотя эта тема для меня мутная. В c/c++ всё гораздо проще для понимания.
Так и должно быть (const *Group) ?!
Добавлено: 16 Апрель 2019, 13:20
Игорь Столяров
Дед Пахом писал(а): ↑16 Апрель 2019, 13:12Сначала ссылка указывает на первую, потом на вторую.
Да, при объявлении с CONST для базовых типов данных похоже, что делается копия переменной и передаётся адрес копии.
Заметил, когда стал обрабатывать огромные строки в цикле передавая их через (Const *String).
Почему так не делается для GROUP - непонятно ...
Видимо описания TestProc(const *Group) и TestProc(Group) нужно считать морской свинкой (ни свинки, ни моря).
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 0:31
vic7tar
А какой смысл вообще использовать const?
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 6:53
Игорь Столяров
vic7tar писал(а): ↑17 Апрель 2019, 0:31А какой смысл вообще использовать const?
Му, например, защита передаваемых в процедуру по адресу данных от изменений.
Ведь некоторые типы данных передаются только по адресу (*decimal, *group и т.д.) или иначе не эффективно (big string).
Безусловно, рукастый программист может легко контролировать тысячи строк своего кода и классы.
Но ведь иногда бывает, что эти данные потом ещё передаются во внешние DLL и чужие классы которые обновляются ...
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 10:45
vic7tar
Игорь Столяров писал(а): ↑17 Апрель 2019, 6:53Му, например, защита передаваемых в процедуру по адресу данных от изменений.
А как собираетесь контролировать?
Попытку изменить передаваемую по ссылке переменную пытается отследить компилятор, т.е. лишь подспорье в написании текста кода.
В рантайме любой poke не глядя изменит значение этой переменной по адресу.
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 11:02
Игорь Столяров
vic7tar писал(а): ↑17 Апрель 2019, 10:45
А как собираетесь контролировать?
Наоборот. Не хочу (или не могу - см. предыдущее сообщение) контролировать изменение переменной в процедуре.
В этом случае CONST обещает, что возможные изменения не попадут в вызывающую процедуру.
Предположение ! Как я понимаю, перед вызовом процедуры делается копия параметра с CONST и в процедуру
передаётся уже адрес копии. Поэтому не надо искать высокотехнологичных путей внесения изменений, т.к.
эти изменения никто не запрещал делать и бытовым способом через простое присваивание и т.д.
CONST - не запрещает изменение параметра переданного по адресу, а блокирует попадание этих изменений
в вызывающую процедуру. Разное это …
Опять таки, могу только предполагать, но параметр-переменная с CONST может быть весьма удобен при рекурсивном
вызове процедуры с изменением этого параметра внутри процедуры.
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 11:11
vic7tar
Игорь Столяров писал(а): ↑17 Апрель 2019, 11:02 Как я понимаю, перед вызовом процедуры делается копия параметра с CONST и в процедуру
передаётся уже адрес копии.
Какая ещё копия? const используется при передаче переменной по ссылке, экземпляр будет один.
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 11:14
Игорь Столяров
vic7tar писал(а): ↑17 Апрель 2019, 11:11const используется при передаче переменной по ссылке, экземпляр будет один
Чуть ниже по тексту посмотрите - там Дед Пахом на эту тему говорил …
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 11:47
vic7tar
Игорь Столяров писал(а): ↑17 Апрель 2019, 11:02CONST -
не запрещает изменение параметра переданного по адресу, а
блокирует попадание этих изменений
в
вызывающую процедуру. Разное это …
Вот это да? А где об этом можно повнимательнее почитать?
Так и должно быть (const *Group) ?!
Добавлено: 17 Апрель 2019, 12:24
Игорь Столяров
Понял ... Нет, вот это место. Надо будет потом самому проверить - в общем-то несложно ...
Дед Пахом писал(а): ↑16 Апрель 2019, 13:12Нет, тут происходит изменение ссылки. Есть 2 строки в памяти: 'ABC' и 'DEF'. Сначала ссылка указывает на первую, потом на вторую.