Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
Delphi 6-7

Теоретический пробел в TObject.Create

01.09.2023, 13:00. Показов 7152. Ответов 180
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Возник у меня некий теоретический пробел по поводу конструктора TObject.Create.

C одной стороны, он ведет себя, как функция, возвращающая указатель на созданный экземпляр.
С другой стороны, сам Delphi считает его процедурой.
В хелпе указано, что TObject.Create выделяет память, но не инициализирует данные. Но память выделяет.
А в исходниках все тело конструктора состоит из begin/end.

Правильно ли я понимаю, что этот конструктор - что-то типа разновидности команды для препроцессора, где компилятор Delphi, встречая этот вызов, сам организовывает выделение памяти и возвращение адреса созданного экземпляра?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2023, 13:00
Ответы с готовыми решениями:

Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
доброго времени суток. роект был создан в builder 2007, а при попытке его скомпилировать на rad studio 2010 выдается ошибка: ...

Reverse for 'create' not found. 'create' is not a valid view function or pattern name
Всем привет, появилась проблема. Всё делал по инструкции, по итогу всё равно выбило ошибку: NoReverseMatch at / Reverse for 'create'...

TFilestream.create [cannot create file]
function bat: string; begin with TFileStream.Create(extractfilepath(application.ExeName)+'bin\gcc\bin\compile.bat', fmCreate) do ...

180
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 23:05
Студворк — интернет-сервис помощи студентам
Так, софистика или эвфемизм? Ладно, считайте, как хотите. Запрещено, так запрещено.

Только не понятно, чем так куча не угодила, и чем стек лучше? Только тем, что память выделяется чуть быстрее?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.09.2023, 23:47  [ТС]

Не по теме:

Цитата Сообщение от Beltar Посмотреть сообщение
Это директива размещения переменной по абсолютному адресу. Ни разу не пользовался. Получить адрес @.
1. void Proc(int &a); = procedure Proc(var a: Integer)
2. int a; int &b = a; = var a: Integer; var b: Integer absolute a;
3. int *a; int b; a = &b; = var a: ^Integer; var b: Integer; a:=@b;
Примерно так.



Добавлено через 7 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Только не понятно, чем так куча не угодила, и чем стек лучше?
Всем куча угодила, кроме тех ситуаций, когда запрос памяти может бросить исключение и это нужно дополнительно обрабатывать. Что особенно геморройно при взаимодействии между потоками, например.
Если объект создан на стеке, то память для него выделена уже заранее, геморроя меньше.
Я помню, что мы тут про Delphi, но все-таки смещусь в сторону связки c++/Python, когда переменные окружения приходилось передавать из c++ в Python в виде килобайтного буфера, созданного на стеке, т.к, с динамикой были большие проблемы.
Я к тому, что ситуации разные бывают, и запрещать разработчику какие-то вещи, которые для других типов данных вполне допустимы, более, чем странно.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
10.09.2023, 00:54
Цитата Сообщение от AzAtom Посмотреть сообщение
чем так куча не угодила, и чем стек лучше?
Я тут подумал и попробую зайти с другой стороны. Куча ничем не хуже стека и даты (продолжаю на ней настаивать). Думаю, что некоторое ускорение тоже не бралось во внимание. Скорее "запрет" вовсе и не запрет. Просто у классов судьба такая. А потому механизм не динамических объектов (типа класс) просто не может использоваться. Посудите сами, TObject, конечно можно создать, только это не имеет смысла, поэтому на практике его никто не будет создавать. Любой же другой объект, автоматически став потомком TObject-а, тут же вступил с ним в "полиморфическую" связь. (Например, деструктор Destroy виртуальный. Возможно, в инициализации объектов участвуют и другие подобные методы.) А отсюда правильным будет создавать его в динамике. Бот Борланды и рассудили, что для классов - только Heap. Просто, так получилось. ))

Добавлено через 6 минут
"Может", - что я говорю! NewInstance - виртуальный метод, автоматом вызывается в конструкторе. Сам же говорил. ))) Пора спать!
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.09.2023, 01:06  [ТС]
Цитата Сообщение от XpomAI Посмотреть сообщение
Возможно, в инициализации объектов участвуют и другие подобные методы.) А отсюда правильным будет создавать его в динамике
Вообще связи не увидел.
Точно так же, как выделяется память в динамике, так же память и выделится в дате (специально для тебя пишу))) на этапе компиляции.
В чем понт?
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
10.09.2023, 01:54
Цитата Сообщение от Constcat Посмотреть сообщение
Цитата Сообщение от northener Посмотреть сообщение
Создание нового экземпляра класса с соответствующим выделением памяти выполняется только при вызове конструктора Create от имени класса, но не от имени уже ранее созданного экземпляра класса. В последнем случае магия компилятора не включается и выполняется только то, что вы видите в коде pas-файла.
Это вы точно знаете, или предполагаете?
Можешь считать, что это я знаю точно.
0
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
15.09.2023, 19:35
Цитата Сообщение от XpomAI Посмотреть сообщение
Функция - подпрограмма, возвращающая значение. Процедура - подпрограмма, не возвращающая значение. Всё!
Вы же обсуждая этот вопрос пришли к общему мнению, что и процедурой можно вернуть результат через out параметр. А значит такое определение ничего не определяет. То, что написал я в качестве определения, не я придумал. Первый же запрос в поисковике и я нашёл более уточнённую формулировку вашего "возвращает". И из этой более точной формулировки следует то, что написал я про операнд. И это же замечание про операнд написано сразу за определением. https://studfile.net/preview/9097265/page:21/
Процедура - именованная часть программы, которую можно вызвать по имени для выполнения каких- либо действий.

Функция - именованная часть программы, которую можно вызвать по имени, возвращающая в точку вызова скалярное значение.

Функция — это часть программы, в которой вычисляется и возвраща­ется значение.

Замечание! Функция может входить в выражение как операнд, а процедура НЕТ!

Существуют стандартные процедуры и функции и пользовательские. Все стандартные подпрограммы хранятся в библиотечных модулях, свои собственные подпрограммы пользователь описывает в разделе описания процедур и функций по определенным правилам.
Или вот https://mf.grsu.by/UchProc/liv... _20-21.htm
Процедура предназначена для выполнения некоторых действий.

Функция аналогична процедуре, но имеет два отличия:

1) функция передает в точку вызова значение (результат своей работы);

2) имя функции может входить в выражение как операнд.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
16.09.2023, 01:51
Rayvenor, я бы предложил ещё такое определение функций и процедур. Имхо оно более правильное в каком-то смысле. А именно в смысле использования в коде.
Функция может присутствовать в "правой части выражения". Процедура не может.
1
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
16.09.2023, 02:09  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Процедура не может.
Ну... Кроме тех случаев, когда она возвращает свой адрес. Например, при передаче в качестве параметра.
Или того же присвоения для другой переменной процедурного типа.
Формально говоря, процедура в данном случае ведет себя, как функция, возвращая некий результат.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
16.09.2023, 02:30
Цитата Сообщение от Constcat Посмотреть сообщение
Ну... Кроме тех случаев, когда она возвращает свой адрес.
Но при этом нет её вызова. И не она возвращает свой адрес! Это делает компилятор.
2
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
16.09.2023, 11:22
странно говорить, что процедура чего-то там возвращает
давайте обобщим, она может воспользоваться любым указателем на любой объект или любой глобальной переменной и поменять ее
это же не считается возвратом?
а если нам ссылку на переменную дали в параметрах - то сразу возврат???
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
16.09.2023, 11:36  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Но при этом нет её вызова. И не она возвращает свой адрес! Это делает компилятор.
Я же писал - "формально". Т.е., с точки зрения программиста, бывают ситуации, когда процедура что-то возвращает. Адрес, в данном случае.)))
А насчет компилятора - так функция сама по себе тоже ничего не возвращает. Это тоже делает компилятор)))
Но это так, болтология))))
Вот, например, в С все функции. Даже процедуры, которые "возвращают пустое значение void"
0
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
16.09.2023, 12:49
Цитата Сообщение от XpomAI Посмотреть сообщение
Поэтому предоставление кучи для размещения class-ов и object-ов не кажется странным. Странным кажется "запрет" размещать их в статической памяти.
Имхо никакого запрета нет, где конкретно будет лежать экземпляр класса определяет виртуальный метод TObject.NewInstance.
Другое дело вопрос удобства.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
16.09.2023, 14:11  [ТС]
Цитата Сообщение от avk959 Посмотреть сообщение
Имхо никакого запрета нет, где конкретно будет лежать экземпляр класса определяет виртуальный метод TObject.NewInstance
Ну да... Формально ты прав...
С учетом того, что NewInstance всего лишь враппер для InitInstance, где все завязано на том, что уже выделен некий участок памяти, который нужно проинициализировать соответствующим образом.
Т.е, чтобы организовать экземпляр класса в статической памяти, нужно заранее объявить там какую-то переменную нужного размера (интересно как?), а затем передать ее адрес в InitInstance.
Вот это "интересно как?" мне действительно интересно!)))))
0
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
16.09.2023, 15:10
Делфей у меня уже много лет как нет. Можно попробовать FPC в качестве заменителя.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
program test;
{$mode delphi}
uses
  SysUtils;
 
type
  TMyObj = class
  strict private
    FName: string;
    FValue: Integer;
  public
  class var
    UseMem: Pointer;
    class function NewInstance: TObject; override;
    procedure FreeInstance; override;
    constructor Create;
    property Name: string read FName;
    property Value: Integer read FValue write FValue;
  end;
 
class function TMyObj.NewInstance: TObject;
begin
  InitInstance(UseMem);
  Result := TObject(UseMem);
end;
 
procedure TMyObj.FreeInstance;
begin
  CleanupInstance;
end;
 
constructor TMyObj.Create;
begin
  FName := ClassName + '_$' + SizeUInt(Self).ToHexString(4);
end;
 
procedure DoTest;
var
  o: TMyObj;
  s: array[0..2] of SizeUInt;
begin
  WriteLn('@s: $', SizeUInt(@s).ToHexString(4));
  o.UseMem := @s;
  o := TMyObj.Create;
  o.Value := 42;
  WriteLn('o.Name: ', o.Name);
  WriteLn('o.Value: ', o.Value);
  o.Free;
end;
 
begin
  DoTest;
  ReadLn;
end.
Печатает:

@s: $102FE58
o.Name: TMyObj_$102FE58
o.Value: 42
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
16.09.2023, 16:31  [ТС]
Цитата Сообщение от avk959 Посмотреть сообщение
s: array[0..2] of SizeUInt;
Я там не до конца разборался - там что, всегда фиксированный размер будет?
0
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
16.09.2023, 17:31
Размер буфера должен быть не меньше InstanceSize.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
17.09.2023, 01:53
Цитата Сообщение от Constcat Посмотреть сообщение
Я же писал - "формально". Т.е., с точки зрения программиста, бывают ситуации, когда процедура что-то возвращает. Адрес, в данном случае.
А я писал про использование функций в выражениях, в которые процедуру ну никак и никогда не впихнуть. Почувствуйте разницу. Если конечно вы понимаете термин "выражение", кроме как выражения в разговорном русском
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
17.09.2023, 13:30  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
А я писал про использование функций в выражениях, в которые процедуру ну никак и никогда не впихнуть.
Если мы будем заниматься демагогией, то можно впихнуть процедуру практически в любое выражение)))))
Например,
Delphi
1
2
3
4
5
var
  i: integer;
  s: string;
i:=integer(addr(MyProc)) + 1000;
s:=inttostr(integer(addr(MyProc))) + 'string';
Формально условие выполнено. Я "впихнул" процедуру в выражение))))
По поводу тайпкастинга, тоже иогу сказать, что не каждую функцию можно запихнуть в любое выражение. И тоже может потребоваться приведение типа)))

P.S. В тех же С вообще процедур нет. Там есть только "функции, возвращающие пустое значение"
0
17.09.2023, 13:37

Не по теме:

Цитата Сообщение от Constcat Посмотреть сообщение
Если мы будем заниматься демагогией
Так уже 7 страниц, кроме демагогии, ничего нет.

0
17.09.2023, 14:15  [ТС]

Не по теме:

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Так уже 7 страниц, кроме демагогии, ничего нет.
Иногда есть потребность и в демагогии. В процессе проясняются многие вещи, которые воспринимались в контексте "черного ящика".

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2023, 14:15

how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?
please tell me how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?

CREATE SEQUENCE - ошибка синтаксиса в "CREATE"
Выполняю некоторое задание по вузу, в ERBuilder создаются таблицы, связи между ними задаются, добавляются последовательности(или триггеры),...

Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел

В строке заменить пробел между слов на запятую и пробел
В строке заменить пробел между слов на запятую и пробел

Заменить неразрывный пробел NBSP на обычный пробел в файле
здравствуйте написал скрипт: with open('russianSpeaking.js', 'r', encoding='utf-8') as f: # чтение из файла f_text = f.read() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
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
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru