|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
Delphi 6-7 Теоретический пробел в TObject.Create01.09.2023, 13:00. Показов 7152. Ответов 180
Метки нет (Все метки)
Приветствую!
Возник у меня некий теоретический пробел по поводу конструктора TObject.Create. C одной стороны, он ведет себя, как функция, возвращающая указатель на созданный экземпляр. С другой стороны, сам Delphi считает его процедурой. В хелпе указано, что TObject.Create выделяет память, но не инициализирует данные. Но память выделяет. А в исходниках все тело конструктора состоит из begin/end. Правильно ли я понимаю, что этот конструктор - что-то типа разновидности команды для препроцессора, где компилятор Delphi, встречая этот вызов, сам организовывает выделение памяти и возвращение адреса созданного экземпляра?
0
|
|
| 01.09.2023, 13:00 | |
|
Ответы с готовыми решениями:
180
Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
TFilestream.create [cannot create file] |
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 20.09.2023, 20:18 [ТС] | ||
|
Exit procedure Exits from the current procedure. Unit System Category flow control routines Delphi syntax: procedure Exit; Description In Delphi, the Exit procedure immediately passes control away from the current procedure. If the current procedure is the main program, Exit causes the program to terminate. Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called.
1
|
||
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
||
| 20.09.2023, 20:19 | ||
|
Только вот какая штука, когда эти "слова" только появились у Борланда (был ещё паскаль), они действительно позиционировались не как имена процедур, а как зарезервированные слова. Delphi 7 в хелпе они процедуры, Подсветка синтаксиса с этим согласна. И главное, в паскале описать свою процедура, например, Exit, вам бы не удалось. В Дельфи - пожалуйста. Так что, былая строгость куда-то ушла. (Ну, в этом вопросе.)))))
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 20.09.2023, 20:21 [ТС] | ||
|
Это тот самый первоисточник/мануал, который все гуру снисходительно рекомендуют/советовать читать/изучать новичкам. Вот новичок и прочитает, что Abort/Break/Continue/Exit/Halt - это процедуры.
0
|
||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 20.09.2023, 20:24 | |
|
А вот вру. https://ru.wikipedia.org/wiki/... _—_Якопини
Хотя у меня в книге Свердлова С. З. "Языки программирования и методы трансляции" она сводится к цепочке и циклу с предусловием.
0
|
|
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
||
| 20.09.2023, 20:48 | ||
|
А товарища Свердлова тоже можно понять. Потому что циклом с предусловием вполне можно заменить if. А также любой другой цикл. А вот чтоб наоборот, уже потребуется goto, который, в свою очередь сильно раздражал Дейкстру, но, как ни крути, является составной частью этого самого цикла (ну, где-то там в глубине души). Отсюда, наверное, и выкладки Свердлова.
0
|
||
|
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
|
||||
| 20.09.2023, 21:01 | ||||
|
Добавлено через 2 минуты Добавлено через 7 минут
1
|
||||
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
|||
| 20.09.2023, 23:22 | |||
|
Ну, а с магией, вообще, нужно поаккуратнее. Ведь и Write/Read, и Ord с Chr-ом, и многое другое, что указано и не указано в 18-ой строчке, это то, что появилось очень давно, до появления первого компилятора (прям хтонические сущности))), и останутся пока будет существовать паскаль. Поэтому-то компиляторописатели и изгаляются (в хорошем смысле) при реализации подобных штучек. Более того, со временем в эту магию будет затягивать всё больше и больше, например, class-ы, с которых здесь всё началось. Так что, магия магией, Write - процедура, а Chr - функция, и останутся ими, независимо от наших споров. )))
0
|
|||
|
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
|
|||
| 21.09.2023, 02:50 | |||
|
Добавлено через 9 минут
1
|
|||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 21.09.2023, 08:44 [ТС] | ||
|
В Delphi переопределен термин "базовый класс". И это никого не удивляет (кроме нескольких демагогов, типа меня и XpomAI), у которых это вызвало определенные вопросы.)))) Почему же тогда остальных удивляет, что Delphi определяет Exit, Break, Continue, как процедуры? Равно, как и то, что тот же Delphi считает Create процедурой, несмотря на то, что ее можно вызвать, как функцию?
0
|
||
|
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
||
| 21.09.2023, 09:29 | ||
|
процедура станет функцией, если её описать как функцию. Но тут уже присказку про бабушку и дедушку можно вспомнить. не надоело из пустого в порожнее переливать?
0
|
||
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
|||
| 21.09.2023, 13:43 | |||
|
При чём здесь бабушка с дедушкой, и кого, где и как описывать? Была поставлена чёткая задачу - поместить имя процедуры в выражение. Constcat это сделал. Нет, пришёл Что не так?! Вы уж, с крестиком и трусами разберитесь, а то невозможно работать! Это, как его, волюнтаризьм!
0
|
|||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 21.09.2023, 14:02 | |
|
Конструктор - это по функциональности своей статический метод. В самом деле, нельзя же вызвать метод на несозданном еще объекте.
Однако грузить программиста выделением памяти под объект - это было бы как-то слишком уж. Потому тут применили Compiler Magic, поэтому и нет явного выделения памяти в конструкторе TObject. И таких Compiler Magic функций в Delphi - далеко не одна. Inc() вас не удивляет, например?
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 21.09.2023, 14:14 [ТС] | |||
|
Более того, изначально оно так и работало. Object по умолчанию создавался в статической памяти и никаких вопросов не возникало. Нужно в динамике - создавай через new. Не нужно - просто описывай экземпляр и сразу же можно вызывать конструктор. Или вообще не вызывать - если нет виртуальных или динамических методов. И разработчики толпой пытаются спасти несчастного программиста?
0
|
|||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 21.09.2023, 14:28 | |||
|
Или это про какой язык? Добавлено через 10 минут Просто конструктор - в любом случае "особый метод", как ни крути. Взять С++ - там тоже конструктор же не вызывается как таковой синтаксически. Никогда. Есть особый синтаксис создания объекта, в результате которого вызывается конструктор. Так что именно "конструирование объекта" (которое вовсе не есть вызов конструктора!) - это всегда "конструкция языка", т.е. Compiler Magic. Хотя синтаксически в Delphi создание объекта в самом деле эквивалентно вызову статического метода. Думаю из-за этого и возник исходный вопрос. Но за счет слова constructor компилятор включает в этом месте свою магию.
0
|
|||
|
Айлурофил
|
||
| 21.09.2023, 14:36 | ||
|
Но если ты призываешь
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||||||||||||||||
| 21.09.2023, 15:17 [ТС] | ||||||||||||||||
В С++ конструктор вызывается разными способами, и синтаксически - в том числе.
![]() Я уже давно на нем сижу. И на Delphi, и на Python. И считаю, что попытки облегчить жизнь программистам за счет того, чтобы отобрать у них контроль за тем, что они делают - путь к деградации программистов. В С++ полно своей магии компилятора и магии препроцессора, которые добавляют своей головной боли. Если уже идти в пещеры - так это к чистому C. Либо к тому же Borland Pascal, где еще нужно было писать "^" после указателей. ![]() Добавлено через 8 минут Ну и попутно возникли различные вопросы, типа невозможности создать экземпляр класса при помощи new Т.е., этот тип (class), несмотря на то, что сам тип давно существует в ООП, имеет определенные внеязыковые признаки, в Delphi стоит особняком. 1. Его экземпляр нельзя создать в статической памяти (на самом деле получилось, но с привлечением хакерских приемов). 2. Его экземпляр нельзя создать в динамике при помощи new - хотя любой другой тип можно. 3. Его конструктор Delphi позиционирует, как "процедуру" (это видно в хинте), но используется он, как функция. Добавлено через 18 минут 4. В Delphi переопределили даже понятие "базовый класс". Теперь "базовый класс" - это TObject.
0
|
||||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||||
| 21.09.2023, 16:07 | |||||||||
|
ну и где вы в вашем примере видите вызов метода? метод должен вызываться int.int(5);или скорее int::int(5);Так что int(5) - чистая магия синтаксиса и компилятора, подразумевающая неявный вызов конструктора. Вот что я имел ввиду.Добавлено через 4 минуты Добавлено через 2 минуты Ну в таком случае тут тоже с вами сложно согласиться, ибо: - функция объявляется словом functoin - процедура объявляется словом procedure - конструктор объявляется совершенно отдельным словом constructor, так что никакой процедурой не является. Добавлено через 9 минут Не особо много знаю языков особенно в части создания объектов, но перебрав в памяти несколько - вроде такой фичи в них нет. Даже там, где объекты были изначально типа C# и Java; к PHP их прикрутил много позже, поэтому как уж получилось. (Вроде есть создание на стеке в новомодном расте, но тут скорее вынудила погоня за производительность с++) А вы какие примеры приведета, помимо С++, где на стеке создаются объекты? Или вы именно про статическую память говорите, а не стек? Объекты в дельфи создаются только в динамике. Да, не при помощи new, но здесь в самом деле нет синтаксического единения, но, думаю, это как раз вырастает из философии языка: с разными объектами языка работает своими методами, не смешивая, умышленно. Да, С++ показал, что единство синтаксиса вовсе не мешает, хотя при обучении как раз мешает, часто видно, как у начинающих каша в голове из-за того, что одни и те же символы в языке С++ означают абсолютно и сильно разное в зависимости от контекста. Добавлено через 31 секунду Добавлено через 1 минуту А вызов в C# методов для тривиальных типов вроде int вас не смущает?
0
|
|||||||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||||||||
| 21.09.2023, 16:08 [ТС] | ||||||||
0
|
||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||
| 21.09.2023, 16:14 | ||||
Спасибо что напомнили. Добавлено через 3 минуты ![]() Напишите пример вызова метода и сравните. Я же привел это уже. Сравните. Добавлено через 1 минуту Картинку про procedure увидел Считаю это скорее интерфейсная недоработка. Кстати, где-то её уже исправили по-моему (а может это в Lazarus я видел явное написание constructor в таком же хинте? но не уверен)
0
|
||||
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
||
| 21.09.2023, 16:20 | ||
|
Даже если это недоработка, нет дыма без огня, кто-то же в своё время определил конструктор именно так. )))
0
|
||
| 21.09.2023, 16:20 | |
|
how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style? CREATE SEQUENCE - ошибка синтаксиса в "CREATE"
В строке заменить пробел между слов на запятую и пробел Заменить неразрывный пробел NBSP на обычный пробел в файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|