Так и должно быть (const *Group) ?!
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Так и должно быть (const *Group) ?!
А точно копия делается? Я почему-то думал, что это намёк для компилятора, чтобы программист внутри программы никто не испортил константных данных. И, возможно, слегка оптимизировать код, если точно известно, что переменная заведомо не изменяется.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Неа. Кто же знает, как это реализовано на самом деле ...
За теми кто отстал - не возвращаться. (С) Кодекс
Так и должно быть (const *Group) ?!
Ну так отправьте по ссылке гигабайтную строку и посмотрите память.Игорь Столяров писал(а): ↑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
Так и должно быть (const *Group) ?!
Дебуггер + ассемблерный код - можно посмотреть, если интересно, но вопрос создания копии для многих данных далеко не тривиален.Игорь Столяров писал(а): ↑17 Апрель 2019, 18:15Неа. Кто же знает, как это реализовано на самом деле ...
Не так давно в программе пришлось делать копию несложного объекта на JavaScript, несколько часов провозился. Потом плюнул, написал что-то вида Obj2 = JSON.parse( JSON.stringify(Obj1) - потом допилю, если будет нужно
На Хабре несколько дней назад была статья https://habr.com/ru/post/447478/, где сравнивалось использование const в разных языках.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Видимо также думали и творцы Clarion …
Поэтому CONST работает для базовых типов данных и не работает для GROUP.
Наверно не было нужно ?
За теми кто отстал - не возвращаться. (С) Кодекс
Так и должно быть (const *Group) ?!
Скорее всего, дело не в этом. Группа может в себе содержать самые разнообразные объекты, в том числе массивы, ссылки, в том числе другие группы и объекты классов. Следует ли при копировании создавать также копии всех вложенных объектов ( массивы, очереди...), надо ли при копировании объектов класса выполнять их создание ( с вызовом конструктора - с какими параметрами ) и уничтожение ( в том числе вызов деструктора ). В общем, тут целая теория....
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Я бы в этом месте всё-таки разделил бы понятия: "массивы, группы" и "ссылки, объекты классов (по сути - те же ссылки)".
Для первых - на момент использования предопределён SIZE() и никто не мешает создать область памяти (например строку),
и сохранить в неё целиком GROUP не вникая в её структуру. Что в общем-то я сейчас и делаю.
Для вторых - CONST должен запрещать изменение самой ссылки, а не объекта на который указывает ссылка.
И задача сводится к предыдущему абзацу.
Т.е. нет каких-то видимых причин почему не может работать параметр (const *Group) … но он ведь не работает.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Так и должно быть (const *Group) ?!
А зачем это все нужно? Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре. Если речь про строки большого размера, то это довольно специфическая задача, которую лучше оформить в виде класса. НЕ?
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
За теми кто отстал - не возвращаться. (С) Кодекс
Так и должно быть (const *Group) ?!
Делаешь копию сам, с копированием всех элементов, которые нужно защитить, а не перекладываешь на плечи разработчиков Клариона, которые понятия не имеют, что передается в группе и что нужно защищать, а что не нужноИгорь Столяров писал(а): ↑18 Апрель 2019, 11:37А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Сделав ещё один круг, пришли-таки к очевидному костылю.
А вот только на вопрос: напс тогда в синтаксисе есть параметр (const *Group) ? - никто ответить не может.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Так и должно быть (const *Group) ?!
Зачем тогда передавать по адресу? Для простых типов.Игорь Столяров писал(а): ↑18 Апрель 2019, 11:37А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Для простых типов данных с CONST проблем нет, а передавать их по адресу иногда приходится что бы не гонять большие
объёмы через стек (big string) и потому, что иначе низя (*decimal). Но это, так сказать, для поддержания приятной беседы …
Вопрос по существу остаётся с (const *Group) и что-то мне подсказывает, что здесь есть какое-то непонимание, не может быть такой ляп …
За теми кто отстал - не возвращаться. (С) Кодекс
Так и должно быть (const *Group) ?!
Вообще-то Group это слегка сокращённый Class, а в нём можем спрятать данные и давать доступ через открытые методы класса...
- Игорь Столяров
- Ветеран движения
- Сообщения: 7372
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Так и должно быть (const *Group) ?!
Так можно договориться до того, что и LONG - это тоже указатель на класс, просто сейчас болеет …
Вопрос ребром: то что компилятор пропускает, а runtime игнорит выполнение параметра (const *Group) -
это очередной косяк или таки высокая идея, не доступная в понимании юзерам #basevalue (т.е. мне) ?!
За теми кто отстал - не возвращаться. (С) Кодекс