Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195

Создать класс из процедуры так, чтобы в нём при вызове можно было менять направление отсчёта счётчика цикла

01.08.2023, 21:53. Показов 3283. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Могу-ли я создать класс из процедуры так, чтобы в нём при вызове можно было менять направление отсчёта счётчика цикла, и некоторые формулы расчёта результата работы этого класса?
Ранее я задавал вопрос по меткам и намекал на классы, но в общем стало ясно что там ответа не будет.
Но метки - не камень преткновения, проблему можно решить с помощью классов, я читал по ним но не знаю как создавать из в Lazarus.

Вот в этом коде
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    repeat
      repeat
        asm
                 JMP     logic
        end;
        logic1:
          logic := @logic2;
        goto logic4;
        logic2:
          Edge := @Edge3;
        logic := @logic3;
        logic3:
          TracerY := y - steps1;
        TracerX := 0;
        if TracerY < 0 then
        begin
          TracerX := RazmerX - (stepFrequent * y + znak *trunc(y / (stepsBig+1)));
          if TracerX < 0 then TracerX := 0;
          TracerY := 0;
        end;
        logic4:
          steps := stepsBig;
        repeat
          if steps = 0 then
          begin
            Biger := x - stepRare+1;
            steps := stepsBig+1;
          end
          else
          begin
            Biger := x - stepFrequent + 1;
          end;
          if Biger < 0 then Biger := 0;
          repeat
            //////////////////////////////////////////////////////////////////////////////////////////////////
            {%REGION 'Engine'}
            asm
                     JMP     p
            end;
            p1:
              StringGrid1.Cells[px^, py^] :=
                IntToStr(pTracerX^) + ',' + IntToStr(pTracerY^) + ',' + '1';
            //запись правого столбца
            p := @p3;
            goto p4;
            p2:
            x1:=x+1;
            y1:=y+1;
              StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0';
            //автоматическое забивание координат в местах скоса трассы
            p := @p3;
            goto p4;
            p3:
              x1:=x+1;
              y1:=y;
              StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0';
            //автоматическое забивание координат трассы на прямых участках
            p4:
              x:=x+xInc;
            {%ENDREGION}
          until x < Biger;
          asm
                   JMP     Edge
          end;
          Edge1:
            //подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
            Inc(steps1);
          goto Edge3;
          Edge2:
            //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
          if RazmerX > RazmerY then begin
                  Dec(steps1);
          TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(stepsBig+1))*(stepsBig+1)-steps)/2))) +  stepFrequent * y + znak * trunc(y / (stepsBig+1)))+1;
                                       if TracerX<1 then begin
                                       TracerY := y - steps1;
                                       TracerX := 0;
                                       if TracerY < 0 then TracerY := 0;
                                       end;
         end else begin
           Dec(steps1);
            TracerY := y - steps1;
            TracerX := 0;
          end;
          p := @p1;
          goto Edge4;
          Edge3:
            p := @p2;
          Edge4:
            Dec(steps);
        until x < 0;
        Inc(y);
        p := @p1;
        x := xRazmerX;
      until y > yRazmerY - 1;
      Edge := @Edge2;
    until y > yRazmerY;

мне нужно поменять будет для второго варианта вызова строки 17-19, аналогично 71-82. Кроме них мне нужно будет поменять направления отсчёта в двух циклах которые заканчиваются в строках 61 и 91, соответственно поменяв знак "<" на знак ">".
Что меня держит от простого копирования и модификации с увеличением кода? То что я не смогу используя тогда в будущем эффективно использовать своё рабочее время. Мне нужно освоить классы хоть немного. Очень буду благодарен за разъяснение моментов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2023, 21:53
Ответы с готовыми решениями:

Переопределить ввод\вывод класса так, чтобы при их вызове можно было указывать TextBox как источник
Здравствуйте, я хотел бы переопределить операторы ввода-вывода (&lt;&lt; и &gt;&gt;) моего класса так, чтобы в качестве источника данных можно было...

Как сделать так чтобы можно было менять путь к БД
OleDbConnection aConn = new OleDbConnection(&quot;Provider=Microsoft.ACE.OLEDB.12.0;&quot; + @&quot;Data Source = C:\Users\Компьютер\Desktop\ИС...

Можно ли сделать так, чтобы во время цикла можно было вводить какую нибудь символ?
Можно ли сделать так, чтобы во время цикла можно было вводить какую нибудь строку? Например идёт цикл и я могу ввести какой либо символ и...

52
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.08.2023, 08:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Hretgir Посмотреть сообщение
сделать быстренько это
И что это? Ни начала, ни конца, не понятно, откуда какие переменные берутся, как инициализируются. Нет примера входных данных. Если думаете, что кто-то будет просматривать все ваши темы и пытаться соединить воедино все эти обрывки кода, ориентируясь на запутанные тонны мыслей, чтобы попытаться вам что-то подсказать, то ошибаетесь. Почти всё, что тут написано больше подходит для личного блога, который можно создать тут же, на форуме. Как раз, будет, как повествование, или заметки для себя.
1
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
12.08.2023, 18:35  [ТС]
Это движок, когда я закончу - сделаю публикацию по нему. С картинками анимированными, для описания алгоритма.
Уже надоело делать записи каждый раз когда я сделаю хоть что-то ни как другие и когда на то чтобы сделать не так есть весомая причина. Будет готов движок - будет запись. Этот движок вообще не похож на те что делают другие, мне не делать-же записи через каждые 10 строк кода.

Если вы считаете что я каждые 10 строк кода должен делать запись в блоге - сами так тогда тоже занимайтесь программированием - 10 строк кода на запись в блоге. Я просто посмотрю что Вы бросите первым - программировать или делать записи.

Добавлено через 1 час 39 минут
Кроме того в движке много закономерных совпадений, и по каким причинам они получаются - мне вообще не понятно: там я это делал для того, а там то-же самое для другого, цели совершенно разные, а путь достижения один... для решения разных задач почему-то действия над одними и теми же переменными одинаковые.
Поэтому скорее всего я не знаю как правильно вести документацию, и вообще короче...я понял одно - написание движков (нормальных движков с максимально эффективными лайфхаками) неблагодарное занятие от которого реально ехать крыша начинает при вникании в код, а бонус только в быстродействии и компактности.

А вы думали у Вас только едет крыша при чтении этого кода? Мне самому не понятно почему порой возникает необходимость повтроения одного и того же действия для достижения совершенно разных целей. То что я хотел одним кодом решить много разных задач и избежать копирования процедур это понятно, но я не ожидал что там будут одинаковые действия для достижения разных целей внутри техпроцесса - совершенно не понятно, причём эти разные цели не являются следствием ветвления кода. Они с самого начала были, ещё до ветвления, а для их достижения нужно одно и то-же действие с одной и той-же переменной. И это закономерно и совершенно не понятно.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.08.2023, 18:45
Каждые 10 строк делать запись в блог или писать сообщение в тему - что выбрать?

А если серьёзно, то зачем так часто делать записи в тот же блог? Появился более-менее приличный результат - сделали запись. А промежуточные размышления кому интересны?

Цитата Сообщение от Hretgir Посмотреть сообщение
сами так тогда тоже занимайтесь программированием - 10 строк кода на запись в блоге. Я просто посмотрю что Вы бросите первым - программировать или делать записи.
Зачем нам это? Лично я просто делаю проект для себя. Вот один делал, делал, и пока приостановился, уже года 2 на паузе, но всё это время пользуюсь этой программой, но блогов по ней не делал - не вижу смысла.
А если у вас есть потребность поделиться со всеми своими мыслями - это уже другое дело. Блоги как раз для этого и созданы.
0
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
12.08.2023, 19:38  [ТС]
правка

Добавлено через 1 минуту
Цитата Сообщение от AzAtom Посмотреть сообщение
А промежуточные размышления кому интересны?
является ли промежуточным размыщлением следующее
Мне самому не понятно почему порой возникает необходимость повтроения одного и того же действия для достижения совершенно разных целей. То что я хотел одним кодом решить много разных задач и избежать копирования процедур это понятно, но я не ожидал что там будут одинаковые действия для достижения разных целей внутри техпроцесса - совершенно не понятно, причём эти разные цели не являются следствием ветвления кода. Они с самого начала были, ещё до ветвления, а для их достижения нужно одно и то-же действие с одной и той-же переменной. И это закономерно и совершенно не понятно по каким причинам.
?
Я боюсь что если я не уделю этому внимание, то потом забуду...

Добавлено через 5 минут
Мне не понятно по какой закономерности нужно делать stepsBig+1 притом, что это делается для достижения совршенно разных трёх целей, соврешенно разных, и причём stepsBig никогда равен нулю не бывает. Никогда, чтобы решить три разных задачи нужно сделать это. Это можно сделать сразу перед запуском движка - но тогда я забуду этот случай, а тот кто будет читать код - никогда его не поймёт. И поэтому у меня в теле движка везде этот stepsBig+1 маячит как бельмо перед глазами. И это закономерно. Это добавляет раздражительности.

Не цели определяют путь, а методы. Тогда появляется раздражающий фактор что цели накладываются друг на друга, иначе почему они разные но находятся в одной точке абстракций. Почему абстракции так накладываются закономерно? Этого вообще не должно быть в принципе, по определению абстракции. Но оно есть, и это раздражает. Раздражает по причине что я не могу объяснить причину существования этого факта.

Добавлено через 18 минут
Законы программирования и абстракций нужно изучать на программировании движков, только правильных движков, которые не сделаны "лишь-бы побыстрее написать, а работает пусть хоть как черепаха". В "движках" настоящие законы программирования и абстракций.

Добавлено через 13 минут
Точнее вру - один раз в цикле бывает равен нулю stepsBig, но это следствие строки размещённой в цикле
Pascal
1
            Dec(steps);
и тут в общем нужно сделать увеличение на единицу для организации безошибочной работы этого цикла, второй случай -следствие математики, третий - логики. Это жесть, я в общем залю сейчас на гиту, создам папку экспериментальную
тут проект опубликованный и сжатый в зиппапку
https://github.com/Andrei-Y/A-... al_law.zip
Если будет интересно - я поясню три случая необходимости инкримента stepsBig, они все три разные, я их не убрал и не заменил одной операцией перед запуском движка только чтобы обратить внимание и не забыть. Операция применяется в коде чаще, но причин только три, и они разные.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
12.08.2023, 20:13
Delphi
1
2
{Всё давно придумано - чтобы не забыть, можно делать комментарии и заметки прямо в исходном коде.
Фигурные скобки для многострочных комментариев.}
1
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
12.08.2023, 21:16  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
{Всё давно придумано - чтобы не забыть, можно делать комментарии и заметки прямо в исходном коде.
Фигурные скобки для многострочных комментариев.}
хорошо, спасибо. я это учту, зато снова скажут, увидев в комментариях, при публикации - что плохое техническое объяснение. И что тогда? Я должен написать вместо статьи по коротенькому и компактному движку описание с учебником или отчётом о исследовательских работах? Комментарии это не совсеме удобно, я их оставлю для себя, оставь я их там - скажут мало написал статью, и вообще я им выложу движок с повторяющимся stepsBig+1, те кто не очень умны - будут думаьб что я дурак, а те кому есть чем думать - попробуют отследить, разумеется для этой возможности я оставлю все пояснения. А stepsBig+1 оставлю типа я глупый, иначе прийдётся долго объяснять что я не дурак - только через написание учебника по программированию и логике. Пусть те кто с ЧСВ думают что спецы просто супер, а автор оставил stepsBig+1 так как глупее их. Это намного проще будет. И критики будет меньше.
0
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
13.08.2023, 10:48  [ТС]
Я могу это объяснить - во втором случае это последствия чередования частых шагов с одним редким , ну с логикой потом разберусь, с первым и вторым разобрано .
Добавляет нервов когда занимаешься чем-то урывками, так как нет возможности уделять больше времени.
Но всё равно как то странно совпадает - три случая, и все разные, а решение одно и то-же , так или иначе будет наводить на мысль о закономерностях.
Да в публикацию это нужно будет внести, описание трёх случаев, читатели могут самостоятельно заменить повторяющийся код, так он будет лучше виден.
Впрочем и циклы организованы соответственно чередованию. осталось рассмотреть один случай. В общем чередование потребовало величиный суммарной шагов, частых шагов с редким, и она применяется скорее всего во всех трёх случаях, когда пишешь все эти случаи отдельно - не особо берёшь во внимание.

И проблема ещё вызвана тем, что там много переменных схожих по названиям, которые можно посчитать ошибочными, но если присмотреться для чего они служат, то становится ясно что названия в принципе оправданные.

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

Добавлено через 1 час 10 минут
Уныло, с таким ветвлением упала скорость выполнения. Ассемблер реально тормозит. Но с ассемблером время выполнения становится стабильнее, если вызывать процедуру многократно - время выполнения не скачет. Скажет так лучшее время расчёта карты 10 000 на 10 000 без такого ветвления составляет 150 миллисекундм и вариаруется от клика к клику до 200, с ассемблером 230-260, почти не прыгает время выполнения: при первом клике 260, при последующих стабильно 230 . Видимо Pascal не заточен под написание движков компактных, ну зато я хоть отладку провёл нормально.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
13.08.2023, 12:04
Цитата Сообщение от Hretgir Посмотреть сообщение
Видимо Pascal не заточен под написание движков компактных, ну зато я хоть отладку провёл нормально.
А вы воспользуйтесь профайлером, он вам даст полную картину всех тормозных блоков кода. Бывает, что задержку получаешь, там где и предположить не мог.
1
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
13.08.2023, 12:26  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
А вы воспользуйтесь профайлером, он вам даст полную картину всех тормозных блоков кода. Бывает, что задержку получаешь, там где и предположить не мог.
я не умею им пользоваться...освоить то смогу быстро, но опыта нет и не знаю как.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
13.08.2023, 12:40
Цитата Сообщение от Hretgir Посмотреть сообщение
я не умею им пользоваться...освоить то смогу быстро, но опыта нет и не знаю как.
Достаточно просто. Установить, запустить ваш код с включенным профайлером, дождаться его завершения и по завершении вы получите статистику его выполнения для каждой функции, процедуры с привязкой к исходному коду. Это базовые вещи, которые вообще не требуют глубоких познаний в работе профайлера.
1
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
13.08.2023, 15:46  [ТС]
А если процедура одна, а в ней вложенные циклы, где внутренний за несколько вызовов суммарно выполняет 100 000 000 проходов за 230 миллисекунд?
И имеется два варианта кода исполнения этих циклов, а код один и тот-же в расчётах. В общем ассемблерная реализация циклов сделала стабильной скорость выполнения, но замедлила. Обычные циклы по скорости выполнения скачут, но вроде как выполняются быстрее.

И что-то не найду я нигде, где он включается - профайлер.
Хотя читаю
https://wiki.lazarus.freepascal.org/Profiling

Почитал, интересно, но не понятно как что делать. Тут читаю https://wiki.lazarus.freepascal.org/LazProfiler

У меня линукс, кажется это проблема для профайлера. Да, вроде как проблема...

В параметрах проекта в отладке установил галочку генерировать код для Valgrind (gv).
Это ничего не дало, больше ничего не нашёл.

Посмотрел на гитхабе, на там файл Readme пустой, написано только что установка в один клик. Ничего кликать не стал.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
13.08.2023, 16:05
Цитата Сообщение от Hretgir Посмотреть сообщение
В параметрах проекта в отладке установил галочку генерировать код для Valgrind (gv).
Это ничего не дало
Собственно, это и не должно ничего давать само по себе. Код под valgrind собран, потом он запускается под этим самым valgrind-ом из консоли. И да, для начала valgrind + callgrind должны быть установлены в системе.
1
Нарушитель
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,303
Записей в блоге: 195
13.08.2023, 18:48  [ТС]
На линукс я самостоятельно не установлю.

Добавлено через 1 час 41 минуту
Причём есть странный момент, если я сокращу высоту таблицы в 10 раз, и увеличу ширину в 10 раз - это не влияет на скорость расчётов абсолютно, в то время как начинает работать формула более сложная и время должно значительно увеличиться. Но, как ни странно время выполнения остаётся тем-же что и было

Вот это формула расчёта трассировки
это последнего столбца

последней строки карты
Pascal
1
  TracerX := RazmerX - (stepFrequent * y + znak *trunc(y / (SummSteps)));
а это последней строки карты
Pascal
1
                 TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(SummSteps))*(SummSteps)-steps)/2))) +  stepFrequent * y + znak * trunc(y / (SummSteps)))+1;
Но для машины они почему-то совсем одинаковы , и даже разница например как выполнить 10 000 или 100 000 ничего для неё не значат. Впрочем расчёт из первой нужно использовать во второй, чтобы не повторять. Только какая разница если машина её не видит...

Добавлено через 23 минуты
Сделал так
Pascal
1
2
          formula1:= stepFrequent * y + znak *trunc(y / (SummSteps));
          TracerX := RazmerX - formula1;
и так
Pascal
1
          TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(SummSteps))*(SummSteps)-steps)/2))) +  formula1)+1;
Теперь разница которую машина впрочем и не видела стала ещё менее ощутимой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2023, 18:48

Вывести палитру на форму так, чтобы можно было менять цвет объектов, нарисованных в PictureBox
Итак, товарищи! Подскажите пожалуйста как вывести палитру на форму так, чтобы можно было менять цвет объектов, нарисованных в PictureBox

Как сделать так,чтобы количество строк и столбцов массива можно было менять через меню?
как сделать так,чтобы количество строк (n) и столбцов(m) массива можно было менять через меню? весь код #include...

Создать массив строк, чтобы их можно было менять в процессе работы программы
Как сделать массив из 5 строк, чтобы их можно было менять в процессе работы программы?

Есть идеи как можно адекватно переписать запрос так, чтобы в нём не было подзапросов?
SELECT O.*, C.CNAME, 'MAX' MAX_MIN FROM ORDERS O INNER JOIN CUSTOMERS C ON O.CNUM = C.CNUM WHERE AMT = (SELECT...

Получить переменную типа Control из цикла foreach так, чтобы ей можно было присвоить значение
Вот есть код обработки контролов на Главном Меню игры: private void MainMenu_Load(object sender, EventArgs e) { ...


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

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru