Так и должно быть (const *Group) ?!

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (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) … :(
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2212
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Так и должно быть (const *Group) ?!

Сообщение Дед Пахом » 16 Апрель 2019, 12:31

Игорь Столяров писал(а):
16 Апрель 2019, 9:31
Или я чего-то не понимаю или что-то оно совсем не того …
очевидно первое.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 16 Апрель 2019, 12:39

Дед Пахом писал(а):
16 Апрель 2019, 12:31
очевидно первое.
А можно пояснить в чём причина, для тех кто в танке ? ;)
Я то уже выкрутился, но хотелось бы понять … :)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2212
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Так и должно быть (const *Group) ?!

Сообщение Дед Пахом » 16 Апрель 2019, 12:49

CONST запрещает изменять переданный параметр, в данном случае ссылку на группу. Правда, я не знаю, как её можно изменить и без CONST, но это другой вопрос.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 16 Апрель 2019, 13:04

Дед Пахом писал(а):
16 Апрель 2019, 12:49
CONST запрещает изменять переданный параметр, в данном случае ссылку на группу. Правда, я не знаю, как её можно изменить
Несогласный я с обоими утверждениями !
В этом случае TestProc(const *string) должно запрещать изменять ссылку на STRING, но запрещает-то изменять ЗНАЧЕНИЕ строки …
Изменить можно присвоив адрес группы с аналогичным типом …

Тут, что-то связанное с тем, что параметр-группа всегда передаётся по адресу.
Т.е. объявление TestProc(*Group) и TestProc(Group) - по сути одинаковы, в обоих случаях передаётся ссылка.
Но тогда непонятно зачем в синтаксисе языка описания TestProc(const *Group) и TestProc(Group) которые по сути
не работают и создают путаницу … Что здесь снова нечисто. :(
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2212
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Так и должно быть (const *Group) ?!

Сообщение Дед Пахом » 16 Апрель 2019, 13:12

Игорь Столяров писал(а):
16 Апрель 2019, 13:04
должно запрещать изменять ссылку на STRING, но запрещает-то изменять ЗНАЧЕНИЕ строки
Нет, тут происходит изменение ссылки. Есть 2 строки в памяти: 'ABC' и 'DEF'. Сначала ссылка указывает на первую, потом на вторую. Вобщем, я так это понимаю, хотя эта тема для меня мутная. В c/c++ всё гораздо проще для понимания.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 16 Апрель 2019, 13:20

Дед Пахом писал(а):
16 Апрель 2019, 13:12
Сначала ссылка указывает на первую, потом на вторую.
Да, при объявлении с CONST для базовых типов данных похоже, что делается копия переменной и передаётся адрес копии.
Заметил, когда стал обрабатывать огромные строки в цикле передавая их через (Const *String).
Почему так не делается для GROUP - непонятно ...

Видимо описания TestProc(const *Group) и TestProc(Group) нужно считать морской свинкой (ни свинки, ни моря). :)
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 160
Зарегистрирован: 09 Февраль 2017, 20:12

Так и должно быть (const *Group) ?!

Сообщение vic7tar » 17 Апрель 2019, 0:31

А какой смысл вообще использовать const?
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 17 Апрель 2019, 6:53

vic7tar писал(а):
17 Апрель 2019, 0:31
А какой смысл вообще использовать const?
Му, например, защита передаваемых в процедуру по адресу данных от изменений.
Ведь некоторые типы данных передаются только по адресу (*decimal, *group и т.д.) или иначе не эффективно (big string).

Безусловно, рукастый программист может легко контролировать тысячи строк своего кода и классы. ;)
Но ведь иногда бывает, что эти данные потом ещё передаются во внешние DLL и чужие классы которые обновляются ...
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 160
Зарегистрирован: 09 Февраль 2017, 20:12

Так и должно быть (const *Group) ?!

Сообщение vic7tar » 17 Апрель 2019, 10:45

Игорь Столяров писал(а):
17 Апрель 2019, 6:53
Му, например, защита передаваемых в процедуру по адресу данных от изменений.
А как собираетесь контролировать?
Попытку изменить передаваемую по ссылке переменную пытается отследить компилятор, т.е. лишь подспорье в написании текста кода.
В рантайме любой poke не глядя изменит значение этой переменной по адресу.
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 17 Апрель 2019, 11:02

vic7tar писал(а):
17 Апрель 2019, 10:45
А как собираетесь контролировать?
Наоборот. Не хочу (или не могу - см. предыдущее сообщение) контролировать изменение переменной в процедуре.
В этом случае CONST обещает, что возможные изменения не попадут в вызывающую процедуру.

Предположение ! Как я понимаю, перед вызовом процедуры делается копия параметра с CONST и в процедуру
передаётся уже адрес копии. Поэтому не надо искать высокотехнологичных путей внесения изменений, т.к.
эти изменения никто не запрещал делать и бытовым способом через простое присваивание и т.д.

CONST - не запрещает изменение параметра переданного по адресу, а блокирует попадание этих изменений
в вызывающую процедуру. Разное это … ;)

Опять таки, могу только предполагать, но параметр-переменная с CONST может быть весьма удобен при рекурсивном
вызове процедуры с изменением этого параметра внутри процедуры.
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 160
Зарегистрирован: 09 Февраль 2017, 20:12

Так и должно быть (const *Group) ?!

Сообщение vic7tar » 17 Апрель 2019, 11:11

Игорь Столяров писал(а):
17 Апрель 2019, 11:02
Как я понимаю, перед вызовом процедуры делается копия параметра с CONST и в процедуру
передаётся уже адрес копии.
Какая ещё копия? const используется при передаче переменной по ссылке, экземпляр будет один.
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 17 Апрель 2019, 11:14

vic7tar писал(а):
17 Апрель 2019, 11:11
const используется при передаче переменной по ссылке, экземпляр будет один
Чуть ниже по тексту посмотрите - там Дед Пахом на эту тему говорил …
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 160
Зарегистрирован: 09 Февраль 2017, 20:12

Так и должно быть (const *Group) ?!

Сообщение vic7tar » 17 Апрель 2019, 11:47

Игорь Столяров писал(а):
17 Апрель 2019, 11:02
CONST - не запрещает изменение параметра переданного по адресу, а блокирует попадание этих изменений
в вызывающую процедуру. Разное это …
Вот это да? А где об этом можно повнимательнее почитать? :idied:
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3910
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Так и должно быть (const *Group) ?!

Сообщение Игорь Столяров » 17 Апрель 2019, 12:24

Понял ... Нет, вот это место. Надо будет потом самому проверить - в общем-то несложно ...
Дед Пахом писал(а):
16 Апрель 2019, 13:12
Нет, тут происходит изменение ссылки. Есть 2 строки в памяти: 'ABC' и 'DEF'. Сначала ссылка указывает на первую, потом на вторую.
«V» значит Вендетта !

Ответить