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

Clarion, Clarion 7

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

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

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

Сообщение Игорь Столяров »

Привет всем !

Или я чего-то не понимаю или что-то оно совсем не того … :(
Пробую передать в процедуру группу по адресу:

Код: Выделить всё

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) … :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

Игорь Столяров писал(а): 16 Апрель 2019, 9:31Или я чего-то не понимаю или что-то оно совсем не того …
очевидно первое.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Дед Пахом писал(а): 16 Апрель 2019, 12:31очевидно первое.
А можно пояснить в чём причина, для тех кто в танке ? ;)
Я то уже выкрутился, но хотелось бы понять … :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

CONST запрещает изменять переданный параметр, в данном случае ссылку на группу. Правда, я не знаю, как её можно изменить и без CONST, но это другой вопрос.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

Тут, что-то связанное с тем, что параметр-группа всегда передаётся по адресу.
Т.е. объявление TestProc(*Group) и TestProc(Group) - по сути одинаковы, в обоих случаях передаётся ссылка.
Но тогда непонятно зачем в синтаксисе языка описания TestProc(const *Group) и TestProc(Group) которые по сути
не работают и создают путаницу … Что здесь снова нечисто. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

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

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

Сообщение Игорь Столяров »

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

Видимо описания TestProc(const *Group) и TestProc(Group) нужно считать морской свинкой (ни свинки, ни моря). :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

А какой смысл вообще использовать const?
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

Безусловно, рукастый программист может легко контролировать тысячи строк своего кода и классы. ;)
Но ведь иногда бывает, что эти данные потом ещё передаются во внешние DLL и чужие классы которые обновляются ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Игорь Столяров писал(а): 17 Апрель 2019, 6:53Му, например, защита передаваемых в процедуру по адресу данных от изменений.
А как собираетесь контролировать?
Попытку изменить передаваемую по ссылке переменную пытается отследить компилятор, т.е. лишь подспорье в написании текста кода.
В рантайме любой poke не глядя изменит значение этой переменной по адресу.
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

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

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

Опять таки, могу только предполагать, но параметр-переменная с CONST может быть весьма удобен при рекурсивном
вызове процедуры с изменением этого параметра внутри процедуры.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Игорь Столяров писал(а): 17 Апрель 2019, 11:02 Как я понимаю, перед вызовом процедуры делается копия параметра с CONST и в процедуру
передаётся уже адрес копии.
Какая ещё копия? const используется при передаче переменной по ссылке, экземпляр будет один.
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

vic7tar писал(а): 17 Апрель 2019, 11:11const используется при передаче переменной по ссылке, экземпляр будет один
Чуть ниже по тексту посмотрите - там Дед Пахом на эту тему говорил …
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Игорь Столяров писал(а): 17 Апрель 2019, 11:02CONST - не запрещает изменение параметра переданного по адресу, а блокирует попадание этих изменений
в вызывающую процедуру. Разное это …
Вот это да? А где об этом можно повнимательнее почитать? :idied:
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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