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

Clarion, Clarion 7

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

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

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

Сообщение Yufil »

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

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

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

Yufil писал(а): 17 Апрель 2019, 15:36А точно копия делается?
Неа. Кто же знает, как это реализовано на самом деле ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Игорь Столяров писал(а): 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
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

На Хабре несколько дней назад была статья https://habr.com/ru/post/447478/, где сравнивалось использование const в разных языках.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Yufil писал(а): 17 Апрель 2019, 22:00Потом плюнул, потом допилю, если будет нужно
Видимо также думали и творцы Clarion … :)
Поэтому CONST работает для базовых типов данных и не работает для GROUP.
Наверно не было нужно ? ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

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

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

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

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

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

Т.е. нет каких-то видимых причин почему не может работать параметр (const *Group) … но он ведь не работает. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

А зачем это все нужно? Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре. Если речь про строки большого размера, то это довольно специфическая задача, которую лучше оформить в виде класса. НЕ?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

finsoftrz писал(а): 18 Апрель 2019, 11:14Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
За теми кто отстал - не возвращаться. (С) Кодекс
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

Игорь Столяров писал(а): 18 Апрель 2019, 11:37
finsoftrz писал(а): 18 Апрель 2019, 11:14Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
Делаешь копию сам, с копированием всех элементов, которые нужно защитить, а не перекладываешь на плечи разработчиков Клариона, которые понятия не имеют, что передается в группе и что нужно защищать, а что не нужно :D :D :D
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

PavelNK писал(а): 18 Апрель 2019, 11:42Делаешь копию сам,
Сделав ещё один круг, пришли-таки к очевидному костылю. :)
А вот только на вопрос: напс тогда в синтаксисе есть параметр (const *Group) ? - никто ответить не может. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Игорь Столяров писал(а): 18 Апрель 2019, 11:37
finsoftrz писал(а): 18 Апрель 2019, 11:14Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
Зачем тогда передавать по адресу? Для простых типов.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

finsoftrz писал(а): 18 Апрель 2019, 12:33Зачем тогда передавать по адресу? Для простых типов.
Для простых типов данных с CONST проблем нет, а передавать их по адресу иногда приходится что бы не гонять большие
объёмы через стек (big string) и потому, что иначе низя (*decimal). Но это, так сказать, для поддержания приятной беседы … ;)
Вопрос по существу остаётся с (const *Group) и что-то мне подсказывает, что здесь есть какое-то непонимание, не может быть такой ляп … :(
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

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

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

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