Использовать процедурный тип при объявлении процедуры\функци

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение olegy123 » 22.04.2017 15:22:58

Мне пришлось для своего развития читать исходники. Так вот, каждого программиста существует свой почерк, свой стиль...
У одних все закладывается в одну процедуру.. длинная при длинная, лабиринт. Другие же любят все самую простую задачу расписать на двадцать файлов.. так им удобно..
Бывает все сжато-кратко, понятно и профессионально. И я думаю, что так думает компилятор.. Это синтаксис написание программ..

И закладывается идея, ради чего все пишется, её форма видна из элементов. Даже можно концовку разглядеть.. Писать разумеется можно по всякому.
- это все лирика..

Мне кажется, что у вас сейчас идея не до конца реализуется через синтаксис.. или вступило в противоречие..

Смотрите, у меня же тоже сходная была задача, также есть реализация событий:
есть 3D объекты, анимация, шейдеры.. и есть пространство скриптов - их как то надо объединить.
Так вот пришлось сделать два вида сообщения: Events(быстрые) - это уровня 3D объектов - они процедурные.. и Message(медленные) - уровень скриптов, они стековые.При этом Events могут порождать Message..
Последний раз редактировалось olegy123 22.04.2017 16:09:03, всего редактировалось 1 раз.
olegy123
энтузиаст
 
Сообщения: 674
Зарегистрирован: 25.02.2016 12:10:20

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Лекс Айрин » 22.04.2017 15:59:33

olegy123 писал(а):Так вот пришлось сделать два вида сообщения: Events(быстрые) - это уровня 3D объектов - они процедурные.. и Message(медленные) - уровень скриптов, они стековые. При этом Events могут порождать Message..


Интересное кино получается... то, что нужно сделать быстро, то делается медленней (пусть и не всегда), чем то, что делается медленно...

Хотя, что забавно, в кадах и пр программ этого класса скрипты нормальное дело. А вот развитое объектное дерево будет явно занимать много памяти, а значит требовать свопинга, а значит времени. При том, что программы этого класса в режиме полноценной визуализации (и при достаточно развитой сцене) способны подвесить графические фермы. (в частности, на это жалуются киношники)
Т. е. объектная модель хороша лишь для поделок.
Имхо, тот бы скорее подошли не объекты, а процессы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение olegy123 » 22.04.2017 16:01:29

У меня они посажены на разные трейды..
3D выполняется с частотой 30Гц.. скрипты 10Гц..

Добавлено спустя 13 минут 32 секунды:
Re: Использовать процедурный тип при объявлении процедуры\функци
Лекс Айрин писал(а):Т. е. объектная модель хороша лишь для поделок.

У меня Keyframe объект - правильнее сделать record. Может потом сделаю.
от Keyframe порождены Keyframe1D Keyframe2D Keyframe3D, KeyframeAlpha - при этом ими проще писать синтаксис.. если бы были Record-ы то с ними больше возни, хотя размер массива меньше в памяти.
Через Object проще управлять Child-ами.. в рекорд больше писанины в обслуживании их..
olegy123
энтузиаст
 
Сообщения: 674
Зарегистрирован: 25.02.2016 12:10:20

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Лекс Айрин » 22.04.2017 16:53:57

olegy123 писал(а):от Keyframe порождены Keyframe1D Keyframe2D Keyframe3D, KeyframeAlpha - при этом ими проще писать синтаксис.. если бы были Record-ы то с ними больше возни, хотя размер массива меньше в памяти.

Например, можно использовать ссылочный тип для дополнительных полей... да и, насколько я помню, есть записи с вариантами, для особо извращенных случаев... правда, побочные эффекты не очень приятные., так что лично я бы использовал ссылочный тип.
olegy123 писал(а):Через Object проще управлять Child-ами.. в рекорд больше писанины в обслуживании их..


Я бы так не сказал... особенно глядя на реализацию тех же стандартных компонентов.
К тому же, при использовании процедурного типа (или функции-переменной) вполне можно реализовать расширенную запись, на подобии того же объекта, но с меньшими накладными расходами. В любом случае, динамическая память требует всегда особой аккуратности на нижнем слое.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение olegy123 » 22.04.2017 17:11:02

Лекс Айрин писал(а):Например, можно использовать ссылочный тип для дополнительных полей... да и, насколько я помню, есть записи с вариантами, для особо извращенных случаев... правда, побочные эффекты не очень приятные., так что лично я бы использовал ссылочный тип.

Ссылочный тип кто то должен создать.. потом контролировать сложно..
Keyframe я сделал как объект просто потому, что он может быть при создании про инициализирован, и при удалении может вызван деструктор с удалением всех чилдов.. при рекорд - вся операция ложится на программиста..
На счет моего Keyframe - я до конца не вижу полную реализацию. Когда будет стадия оптимизации будут переводить в тип record-а.

Вообще то я хотел сказать что важно соблюсти баланс между реализации идеи, правильности написания кода и оптимизации.

Добавлено спустя 7 минут 6 секунд:
Re: Использовать процедурный тип при объявлении процедурыфункци
Лекс Айрин писал(а):Я бы так не сказал... особенно глядя на реализацию тех же стандартных компонентов.
К тому же, при использовании процедурного типа (или функции-переменной) вполне можно реализовать расширенную запись, на подобии того же объекта, но с меньшими накладными расходами. В любом случае, динамическая память требует всегда особой аккуратности на нижнем слое.


Была время когда я тыкал коллбэки везде где нужно и не нужно.. Есть что то в функции-переменной - надо выполнить.. быстро.. Но оно перестает работать при многопотоковости..
Там не всегда в это время поток готов принять.. Поэтому функции-переменные выгодны в основном потоке и не эффективны и опасны при многозадачности..

Добавлено спустя 5 минут 55 секунд:
Re: Использовать процедурный тип при объявлении процедуры\функци
На счет памяти - прошли те времена когда при 32кбайт оперативки люди писали игры которые проходили месяцами..
Сейчас когда в ноутубке можно поставить 32Гб.. думаю лишних пару мегабайт потерянных на обслуживание всех объектов в программе не такая великая проблема..
olegy123
энтузиаст
 
Сообщения: 674
Зарегистрирован: 25.02.2016 12:10:20

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Mirage » 22.04.2017 17:35:58

А зачем классу команды метод MouseMove()? Даже при событийной модели. Команда является слушателем событий чтоли?
По идее, ничего, кроме метода Execute() быть не должно.
И в 173 разных команды, которые нельзя реализовать в виде вменяемого количества (20-30) классов, как-то не верится. Что-то тут не то.

А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
Mirage
энтузиаст
 
Сообщения: 752
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Лекс Айрин » 22.04.2017 17:40:05

olegy123 писал(а):Ссылочный тип кто то должен создать.. потом контролировать сложно..


А объект, как будто сам возникает...

olegy123 писал(а):Keyframe я сделал как объект просто потому, что он может быть при создании про инициализирован, и при удалении может вызван деструктор.. при рекорд - вся операция ложится на программиста..

ой... вот только не смеши мои пятки... а кто запрещает создать деструктор/конструктор для записи?
Код: Выделить всё
Type
TDestroy = function(p:pointer):boolean;
TCreate = function(p:Pointer): Boolean;
Record= TestType
Destroy:TDestroy;
Create:TCreate;
Str:String;
End;
Procedure TestDestroy...;
...
Procedure TestCreate...;
....
Var
Test:TestType;
Begin
// Создание переменнной
Test.Create:= @TestCreate;
Test.Destroy:= @TestDestroy;
Test.Create();
////
......
////
End;


И не такие уж и накладные расходы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение olegy123 » 23.04.2017 12:26:39

Лекс Айрин писал(а):И не такие уж и накладные расходы.

шо, в уже в рекордах разрешили наследование и переопределение методов?
olegy123
энтузиаст
 
Сообщения: 674
Зарегистрирован: 25.02.2016 12:10:20

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Лекс Айрин » 23.04.2017 17:56:09

olegy123, ну ты хочешь совсем уж кучеряво жить... и рыбку съесть и шкурку сдать.

Если подумать, то кто запрещает тебе наследование имитировать?...
Впрочем, если ты сам назначаешь функции "псевдообъектам", то зачем тогда надобность в наследовании?

Насчет переопределения методов... все даже круче, чем в объектах -- можно менять "методы" в процессе работы "псевдообъектов". Вместе с самомодификацией структуры. Можно подобное сделать и для объектов, то тут методы те же, а ограничения строже.
Собственно, объект изначально само чем отличается от подобной записи "на стероидах".

В принципе, сама возможность создания процедурных типов это попытка обойти ограничения объектной модели. А возможно, и частично уйти от нее.

Возможно, стоит попробовать более продвинутые парадигмы... Например, процесс- или аспектно-ориентированное программирование. Правда, это потребует еще больших усилий... преимущественно на этапе проектирования программы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение zub » 23.04.2017 19:55:11

Mirage
>>Команда является слушателем событий чтоли?
Конечно, она интерактивная.
>>Что-то тут не то.
Что вы все вцепились в реализацю. Я не утверждаю что без этой фичи всё пропало.
Я лишь говорю что с ней будет надежнее.

>>А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
Очень аргументировано:
Код: Выделить всё
program Project1;
{$MODE DELPHI}
type
  TmySuperproc=procedure (blablabla:integer);

function mySuperproc(blablabla:string):string;
begin
  result:=blablabla+'blablabla';
end;

var
  pp:TmySuperproc;
begin
  pp:=@mySuperproc;
  pp(1);
end.

даже варнингов нету
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение vitaly_l » 23.04.2017 20:47:54

zub писал(а):даже варнингов нету

как это нет? Error на 15 строке.
Код: Выделить всё
Runtime error 216 at $004032C7
  $004032C7
  $00404634
  $004015DD  main,  line 15 of project1.lpr
  $00408A86

Там надо чуть поправить и всё зафурычит.
А разве это не то самое, искомое в теме?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3042
Зарегистрирован: 31.01.2012 16:41:41

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение zub » 23.04.2017 20:55:40

vitaly_l
Прошу гденить ознакомится что такое Runtime errors, что такое compiler warnings, hints, errors. И как последние 3 призваны защищать от первых
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение Лекс Айрин » 23.04.2017 20:57:40

vitaly_l писал(а): Error на 15 строке.


Речь об ошибках компиляции. Программа даже не должна была собраться.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение vitaly_l » 23.04.2017 21:03:49

Лекс Айрин писал(а):Речь об ошибках компиляции. Программа даже не должна была собраться.

zub писал(а):И как последние 3 призваны защищать от первых

директиву правильную пропишите и наступит релакс.
Код: Выделить всё
{$MODE objfpc}
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3042
Зарегистрирован: 31.01.2012 16:41:41

Re: Использовать процедурный тип при объявлении процедуры\фу

Сообщение zub » 23.04.2017 21:06:52

Директива стоит абсолютно правильная. релаксируй.
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru