Страница 2 из 3

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

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

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

Добавлено: 17 Апрель 2019, 18:15
Игорь Столяров
Yufil писал(а): 17 Апрель 2019, 15:36А точно копия делается?
Неа. Кто же знает, как это реализовано на самом деле ...

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

Добавлено: 17 Апрель 2019, 18:29
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 по барабану

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 18 Апрель 2019, 12:00
Игорь Столяров
PavelNK писал(а): 18 Апрель 2019, 11:42Делаешь копию сам,
Сделав ещё один круг, пришли-таки к очевидному костылю. :)
А вот только на вопрос: напс тогда в синтаксисе есть параметр (const *Group) ? - никто ответить не может. ;)

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

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

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

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

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

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

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

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