Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 163 164 [165] 166 167 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2461
,
|
|
|
|
А, ну тогда понятно, почему не припомню. Я-то понимаю, откуда глюк. Потому что представляю, в какой код это компилируется. Но мы ж о Дельфи, а не Ассемблере, ведь так? Вот это ИМХО правильное "исправление" ситуации - незаконная с точки зрения языка конструкция.
Тогда вопрос звучит ещё жёстче. Если в Дельфи это теперь компилируемая конструкция, то на каком основании? И на каком основании она при своей законности не работает? |
|
Сообщ.
#2462
,
|
|
|
|
Цитата Qraizer @ Эта конструкция запрещенная, и некомпилируемая: при установке Typed @ operator в True компилятор пошлет программиста, написавшего такое куда подальше. И правильно сделает. Если DoSomething требует параметр типа TProcedure, а получает Pointer - это чья проблема? Программиста или компилятора? Если в Дельфи это теперь компилируемая конструкция, то на каком основании? |
|
Сообщ.
#2463
,
|
|
|
|
Цитата volvo877 @ Цитата Qraizer @ Эта конструкция запрещенная, и некомпилируемая: при установке Typed @ operator в True компилятор пошлет программиста, написавшего такое куда подальше. И правильно сделает. Если DoSomething требует параметр типа TProcedure, а получает Pointer - это чья проблема? Программиста или компилятора?Если в Дельфи это теперь компилируемая конструкция, то на каком основании? Ну программист, работающий с другими языками, мог бы ожидать, что передача локальной процедуры - вполне законная и работоспособная конструкция. А реализация такой возможности - уже проблема компилятора |
|
Сообщ.
#2464
,
|
|
|
|
Цитата D_KEY @ Ты не понял. Передача локальной подпрограммы - это непрограммист, работающий с другими языками, вполне мог бы ожидать, что передача локальной процедуры вполне законная и работоспособная конструкция ![]() ![]() DoSomething(@UseLocalVar); ![]() ![]() DoSomething(UseLocalVar); |
|
Сообщ.
#2465
,
|
|
|
|
Цитата volvo877 @ Цитата D_KEY @ Ты не понял. Передача локальной подпрограммы - это непрограммист, работающий с другими языками, вполне мог бы ожидать, что передача локальной процедуры вполне законная и работоспособная конструкция ![]() ![]() DoSomething(@UseLocalVar); ![]() ![]() DoSomething(UseLocalVar); А, тогда спасибо за пояснения. И все-таки, почему нельзя передавать локальные подпрограммы? |
|
Сообщ.
#2466
,
|
|
|
|
Цитата D_KEY @ И все-таки, почему нельзя передавать локальные подпрограммы? "ниасилили" =) ты не забывай, что паскаль (и делфи, но в меньшей степени) -- очень примитивный язык. ибо Вирт любит примитивность =) |
|
Сообщ.
#2467
,
|
|
|
|
Цитата korvin @ Я бы попросил... ты не забывай, что паскаль (и делфи, но в меньшей степени) -- очень примитивный язык. Вот такая вот программа ![]() ![]() program pr_01; type TProcedure = procedure; procedure DoSomething(const AProc: TProcedure); var X: Integer; begin for X := 1 to 3 do AProc; end; function Test: Integer; var N: Integer; procedure UseLocalVar; begin Inc(N); end; begin N := 0; DoSomething(UseLocalVar); Test := N; end; begin writeln(Test); end. |
|
Сообщ.
#2468
,
|
|
|
|
Цитата volvo877 @ Цитата korvin @ Я бы попросил... ты не забывай, что паскаль (и делфи, но в меньшей степени) -- очень примитивный язык. Вот такая вот программа ![]() ![]() program pr_01; type TProcedure = procedure; procedure DoSomething(const AProc: TProcedure); var X: Integer; begin for X := 1 to 3 do AProc; end; function Test: Integer; var N: Integer; procedure UseLocalVar; begin Inc(N); end; begin N := 0; DoSomething(UseLocalVar); Test := N; end; begin writeln(Test); end. ![]() а лексические замыкания уже асилили? и как с другими компиляторами паскаля? |
|
Сообщ.
#2469
,
|
|
|
|
Цитата D_KEY @ Потому что в локальной подпрограмме доступен локальный контекст в точке её определения. Вне области видимости её определения этого локального контекста нет, а значит "все адреса вымышлены, все совпадения имён случайны". Это сравнимо с прыжком во вложенный цикл, минуя внешний, или с нашими локальными шаблонами в функциях.И все-таки, почему нельзя передавать локальные подпрограммы? В приведённом примере процедура UseLocalVar либо получает указатель на стековый фрейм окаймляющей процедуры, либо прямо указатель на локальную, тем не менее видимую в её точке определения, N. В точке использования может не быть ни того, ни другого. А может и быть, как в приведённом примере. ИМХО UB чистой воды. Добавлено volvo877, т.е. получается, что народ имел в виду, что компиляция прошла по причине нетипизированного указателя, возвращаемого @, и его совместимости с TProcedure, и это и есть та самая ошибка программиста? Ну, у нас void* совместим только в одну сторону, когда кастуешь к нему. А вот при касте из него - это даже в C варнинг, а в C++ эррор. Вообще, нетипизированность указателей для Addr() и @ мне никогда не нравилась. Всегда ставил в опциях галку. |
|
Сообщ.
#2470
,
|
|
|
|
Цитата Qraizer @ Цитата D_KEY @ Потому что в локальной подпрограмме доступен локальный контекст в точке её определения.И все-таки, почему нельзя передавать локальные подпрограммы? Ну и что? Лямбде, например, он тоже доступен Цитата Это сравнимо с прыжком во вложенный цикл, минуя внешний Не сравнимо, ибо в этом случае получаем нарушение структуры, чего нет в случае передачи локальной функции. Цитата или с нашими локальными шаблонами в функциях. В новом стандарте разрешили же, или передумали? Цитата Чувствую пора перечитывать "книгу Дракона", я помню, что там описан типовой механизм разрешения этой проблемы, но не помню, в чем он заключался... А голова уже плохо варит на сегодня, чтобы самому что-то напридумывать... В приведённом примере процедура UseLocalVar либо получает указатель на стековый фрейм окаймляющей процедуры, либо прямо указатель на локальную, тем не менее видимую в её точке определения, N. В точке использования может не быть ни того, ни другого. А может и быть, как в приведённом примере. ИМХО UB чистой воды. |
|
Сообщ.
#2471
,
|
|
|
|
кстати, что-то вспомнилось АОП. допустим нам нужно, чтобы для объектов какого-то класса (и его потомков) перед или после выполнения какого-то метода происходили какие-то действия (запись в лог или что-то такое). причем классы эти могут быть не наши (т.е. изменить их определение может быть невозможным). как поступить в топиковых языках? дополнительно: если это нужно добавить ко всем объектам (в делфи и C# корень один, а в его нет, потому и вопрос)?
|
|
Сообщ.
#2472
,
|
|
|
|
Цитата D_KEY @ Ну, во-первых, ламбде ты либо явно передаёшь по значению, что нужно захватить, и она получает себе копию, либо просто не используешь вне контекста, содержащего захваченное. В противном случае получишь то же UB, как и в случае ссылок на разрушенный объект. Не боись, народ ещё наломает себе мозг подобными ошибками, пока не привыкнет к технологии. Хотя, компиляторы, думаю, будут варнинговать, впрочем, вряд ли смогут отловить все случаи.Ну и что? Лямбде, например, он тоже доступен А вообще, я где-то говорил, что лямбды, которые не ограничиваются только собственным состоянием, но и что-то берут извне, это ИМХО косяк. Не стоило бы разрешать их в языке. Вот теперь будем получить ССЗБ себе с лоб. Цитата D_KEY @ В приведённом примере - нет. Контекст, содержащий N, доступен, только лежит на один фрейм в стеке глубже. Я говорил об общем случае, когда указатель может использоваться в программе, где угодно. Беда в том, что невалидность указателя, когда он покидает область видимости, в которой определена указываемая им сущность, тут очень неочевидна, и это общая проблема указателей и ссылок на локальные сущности. Не задумывался, почему компилятор может успешно диагностировать такие левые ссылки, но не указатели?Не сравнимо, ибо в этом случае получаем нарушение структуры, чего нет в случае передачи локальной функции. Та даже в этом случае не всё так шоколодно. Иначе откуда бы AV взялось. Думаю, компилятор вместо передачи указателя на фрейм внешней функции явно обращается ровно на один фрейм выше. Или заюзал оптимизацию "подавления указателей на стековые фреймы". Или ещё чего, мало ли причин можно придумать. Любопытно было бы посмотреть в листинг. Цитата D_KEY @ Э-э-э... не припомню. Помню, что обычные шаблоны разрешили конкретизировать локальными сущностями, а вот касательно локальных шаблонов... В новом стандарте разрешили же, или передумали? |
|
Сообщ.
#2474
,
|
|
|
|
Цитата Qraizer @ Цитата D_KEY @ Ну, во-первых, ламбде ты либо явно передаёшь по значению, что нужно захватить, и она получает себе копию, либо просто не используешь вне контекста, содержащего захваченное. В противном случае получишь то же UB, как и в случае ссылок на разрушенный объект. Не боись, народ ещё наломает себе мозг подобными ошибками, пока не привыкнет к технологии. Хотя, компиляторы, думаю, будут варнинговать, впрочем, вряд ли смогут отловить все случаи.Ну и что? Лямбде, например, он тоже доступен Что мешает "локальным функциям" действовать также, как лямбдам? Цитата А вообще, я где-то говорил, что лямбды, которые не ограничиваются только собственным состоянием, но и что-то берут извне, это ИМХО косяк. Если они не будут этого делать, то они перестанут быть лямбдами. Цитата Не стоило бы разрешать их в языке. Вот теперь будем получить ССЗБ себе с лоб. У меня тоже были мысли о том, что в С++ это обернется набором проблем, которые могут плохо сказываться на потенциальной надежности... Добавлено Хорошо. В многом верно(ошибки только в подпунктах, вроде как). Явный бред про превосходство С, исключения в конструкторах, управления памятью, медленную работу(исключений), некорректность кода в шаблонах. Ну и по ряду пунктов слишком сильная "паника". |
|
Сообщ.
#2475
,
|
|
|
|
Цитата D_KEY @ В многом верно(ошибки только в подпунктах, вроде как). Правда? ![]() Цитата 3. Никакого ABI 5. Дублирование функционала Си 6. Стандартная библиотека убога 8. Объектная система убога 9. Шаблоны 10. Исключения Ты, считаешь, что все эти пункты свидетельствуют против плюсов и нигде нет ошибок? |