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

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Yufil
Ветеран движения
Сообщения: 1123
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 17 Апрель 2019, 15:36

А точно копия делается? Я почему-то думал, что это намёк для компилятора, чтобы программист внутри программы никто не испортил константных данных. И, возможно, слегка оптимизировать код, если точно известно, что переменная заведомо не изменяется.

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

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

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

Yufil писал(а):
17 Апрель 2019, 15:36
А точно копия делается?
Неа. Кто же знает, как это реализовано на самом деле ...
«V» значит Вендетта !

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

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

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

Игорь Столяров писал(а):
17 Апрель 2019, 18:15
Неа. Кто же знает, как это реализовано на самом деле ...
Ну так отправьте по ссылке гигабайтную строку и посмотрите память.
Вот ещё, от нечего делать:

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

   Program
   
   Map
      Module('fbDLL.dll')
         test_dll(const *long any_input), Pascal, dll, name('test_dll') 
         !----------------- dll-библиотека на fb --------------------------------------
         ! Public sub test_dll Pascal Alias "test_dll" (ByRef any_input As Long) Export
         !        any_input = any_input * 2
         ! End Sub
      End

      test(const *long)
   End  

cnst long(111)

  Code
  test(cnst)

! ------------------------------  
test Procedure(constanta) 
a long(444)
b long, over(constanta)

  Code
    any# = constanta              ! any#=111
    !constanta = 222              ! ругается компилятор, правильно
    !peek(address(a), constanta)  ! ругается компилятор, правильно
    b = 333                       ! constanta=333, обошли через over
    test_dll(constanta)           ! constanta=666, внешней библиотеке по барабану
    poke(address(constanta), a)   ! constanta=444, и poke по барабану
C10, Win10x64

Yufil
Ветеран движения
Сообщения: 1123
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 17 Апрель 2019, 22:00

Игорь Столяров писал(а):
17 Апрель 2019, 18:15
Yufil писал(а):
17 Апрель 2019, 15:36
А точно копия делается?
Неа. Кто же знает, как это реализовано на самом деле ...
Дебуггер + ассемблерный код - можно посмотреть, если интересно, но вопрос создания копии для многих данных далеко не тривиален.
Не так давно в программе пришлось делать копию несложного объекта на JavaScript, несколько часов провозился. Потом плюнул, написал что-то вида Obj2 = JSON.parse( JSON.stringify(Obj1) - потом допилю, если будет нужно :)

На Хабре несколько дней назад была статья https://habr.com/ru/post/447478/, где сравнивалось использование const в разных языках.

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

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

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

Yufil писал(а):
17 Апрель 2019, 22:00
Потом плюнул, потом допилю, если будет нужно
Видимо также думали и творцы Clarion … :)
Поэтому CONST работает для базовых типов данных и не работает для GROUP.
Наверно не было нужно ? ;)
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1123
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 18 Апрель 2019, 9:38

Скорее всего, дело не в этом. Группа может в себе содержать самые разнообразные объекты, в том числе массивы, ссылки, в том числе другие группы и объекты классов. Следует ли при копировании создавать также копии всех вложенных объектов ( массивы, очереди...), надо ли при копировании объектов класса выполнять их создание ( с вызовом конструктора - с какими параметрами ) и уничтожение ( в том числе вызов деструктора ). В общем, тут целая теория....

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

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

Сообщение Игорь Столяров » 18 Апрель 2019, 10:08

Yufil писал(а):
18 Апрель 2019, 9:38
Группа может в себе содержать самые разнообразные объекты
Я бы в этом месте всё-таки разделил бы понятия: "массивы, группы" и "ссылки, объекты классов (по сути - те же ссылки)".

Для первых - на момент использования предопределён SIZE() и никто не мешает создать область памяти (например строку),
и сохранить в неё целиком GROUP не вникая в её структуру. Что в общем-то я сейчас и делаю.

Для вторых - CONST должен запрещать изменение самой ссылки, а не объекта на который указывает ссылка.
И задача сводится к предыдущему абзацу.

Т.е. нет каких-то видимых причин почему не может работать параметр (const *Group) … но он ведь не работает. :(
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz » 18 Апрель 2019, 11:14

А зачем это все нужно? Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре. Если речь про строки большого размера, то это довольно специфическая задача, которую лучше оформить в виде класса. НЕ?
Рязань решает.

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

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

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

finsoftrz писал(а):
18 Апрель 2019, 11:14
Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
«V» значит Вендетта !

PavelNK
Старожил
Сообщения: 225
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK » 18 Апрель 2019, 11:42

Игорь Столяров писал(а):
18 Апрель 2019, 11:37
finsoftrz писал(а):
18 Апрель 2019, 11:14
Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
Делаешь копию сам, с копированием всех элементов, которые нужно защитить, а не перекладываешь на плечи разработчиков Клариона, которые понятия не имеют, что передается в группе и что нужно защищать, а что не нужно :D :D :D

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

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

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

PavelNK писал(а):
18 Апрель 2019, 11:42
Делаешь копию сам,
Сделав ещё один круг, пришли-таки к очевидному костылю. :)
А вот только на вопрос: напс тогда в синтаксисе есть параметр (const *Group) ? - никто ответить не может. ;)
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz » 18 Апрель 2019, 12:33

Игорь Столяров писал(а):
18 Апрель 2019, 11:37
finsoftrz писал(а):
18 Апрель 2019, 11:14
Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
Зачем тогда передавать по адресу? Для простых типов.
Рязань решает.

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

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

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

finsoftrz писал(а):
18 Апрель 2019, 12:33
Зачем тогда передавать по адресу? Для простых типов.
Для простых типов данных с CONST проблем нет, а передавать их по адресу иногда приходится что бы не гонять большие
объёмы через стек (big string) и потому, что иначе низя (*decimal). Но это, так сказать, для поддержания приятной беседы … ;)
Вопрос по существу остаётся с (const *Group) и что-то мне подсказывает, что здесь есть какое-то непонимание, не может быть такой ляп … :(
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1123
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 18 Апрель 2019, 14:50

Вообще-то Group это слегка сокращённый Class, а в нём можем спрятать данные и давать доступ через открытые методы класса...

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

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

Сообщение Игорь Столяров » 18 Апрель 2019, 15:26

Yufil писал(а):
18 Апрель 2019, 14:50
Вообще-то Group это слегка сокращённый Class
Так можно договориться до того, что и LONG - это тоже указатель на класс, просто сейчас болеет … ;)
Вопрос ребром: то что компилятор пропускает, а runtime игнорит выполнение параметра (const *Group) -
это очередной косяк или таки высокая идея, не доступная в понимании юзерам #basevalue (т.е. мне) ?! :)
«V» значит Вендетта !

Ответить