Страница 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:37finsoftrz писал(а): ↑18 Апрель 2019, 11:14Я передаю параметры по адресу, если их надо модифицировать в вызываемой процедуре
А если наоборот: параметры передаваемые по адресу (в т.ч. GROUP) нужно защитить от случайной модификации в вызываемой процедуре ?
Делаешь копию сам, с копированием всех элементов, которые нужно защитить, а не перекладываешь на плечи разработчиков Клариона, которые понятия не имеют, что передается в группе и что нужно защищать, а что не нужно
Так и должно быть (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 (т.е. мне) ?!