Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182

Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций

13.03.2023, 12:07. Показов 2405. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это крах ассемблерной оптимизации в Lazarus - быть точнее крах компилятора, или что-то тут не так. Почему? Потому что нажатие на кнопку ничем не отличается от нажатия на кнопку. То есть всё переменные, всё-всё-всё что моё - объявлено у меня внутри
procedure TForm1.Button1Click(Sender: TObject);

Но увы - практика показала, что нажатие на кнопку в корне отличается от нажатия на кнопку, и причём - в коде причин этому - я не обнаружил никаких.

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

Добавил, и опишу как теперь это стало работать.
Делаете первый запуск программы, размер поля по умолчанию 10 на10, угол 15, обратите внимание на правый столбец, первые верхние ячейки
https://www.cyberforum.ru/blog... 1678659824

не закрывая программы измените размер поля на 20 на 20, вы уидите уползшие влево по таблице результаты работы, не закрывая программы измените размер таблицы снова 10 на 10, результаты снова уползут влево - вы это увидите обратив внимание на верхние ячейки правого столбца.

И всё это происходит при том что все переменные объявляются снова при каждом нажатии кнопки.
То есть становится совершенно очевидно, что даже если ошибка моя, то шансы её отловить при столь некорректной работе чего-то важного но явно не мной сделанного - нулевые.
Очень жаль.
И вот его вот эта реализация что работает с ошибкой, описанной в теме
Кликните здесь для просмотра всего текста
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
    procedure steps1;
  var
    Edge,altHead,altTail,logic,p:pointer;
    y,x, xf,yf, TracerX, TracerY, steps, stepsInString, stepRare, stepFrequent, stepsBig, StringDivTrunc, StringFinish, StringStart,Punctir, Nechto:integer;
    px,py:^integer;
     Biger, countPix, Ostatok, CaTanDegP, RazmerX, xRazmerX, RazmerY,yRazmerY,bigStep, runTime,steps1:integer;
    CaTanDeg,TanDeg, TracerYDiv, deg:Extended;
    TracBool:boolean;
    //вторичный блок переменных
    StringDiv, StringDiv1:Extended;
    znak:integer;
    label p1,p2,p3,p4;
      label logic1,logic2,logic3,logic4;
            label Edge1, Edge2,Edge3,Edge4;
              label altHead1, altHead2, altHead3;
                label alttail1,altTail2;
          procedure Vstavka;
          begin
           //CaTanDegP:=round(CaTanDeg);
           //StringDiv:=RazmerX / (CaTanDeg);
           stepFrequent:=round(CaTanDeg);//кол-во пикселей в частом штрихе
           StringDiv:=frac(CaTanDeg);//выборка дробной части катангенса
           znak:=sign(0.5-StringDiv)*sign(StringDiv);//указывает на увеличение или уменьшение результата суммирования этой дробной части при повторе частых штрихов
           stepsBig:=round(1/StringDiv)+1;//!!!!!!!!увеличил на единицу только потому что в коде применяется только в таком виде
           stepRare:=stepFrequent+znak;//количество пикселей в редком штрихе. промежуточный, пока не нужен.
           bigStep:= stepsBig*stepFrequent;//поправил
           if bigStep=0 then begin
           bigStep:=stepRare;
           stepRare:=0;
 
           end;
           end;
          begin
      deg:= StrToInt(Edit1.Text);
      RazmerX:= StrToInt(Edit2.Text);
      RazmerY:= StrToInt(Edit3.Text);
      StringGrid1.RowCount:= RazmerY+2;  { Установка количества строк компонента StringGrid}
      StringGrid1.ColCount:= RazmerX+2;
         TanDeg := Tan(DegToRad(deg));
         {%REGION 'ttt'}
         if TanDeg = 0 then begin
           CaTanDeg:=RazmerX;
           CaTanDegP:=Trunc(CaTanDeg);
           px:=@x;
           py:=@y;
           StringFinish:=0;
           Ostatok:=0;
           Vstavka;
           end
         else begin
         CaTanDeg:= 1/TanDeg;
         if CaTanDeg>=TanDeg then begin
           px:=@x;
           py:=@y;
           Vstavka;
          if CaTanDegP>28 then CaTanDegP:=27;
           end
         else begin
           px:=@y;
           py:=@x;
           Vstavka;
           if CaTanDegP>28 then CaTanDegP:=27;
            end;
                  end;
         if CaTanDegP=0 then begin
           StringFinish:=0;
           Ostatok:=0;
           end else begin
            StringDivTrunc:=Trunc(RazmerX div CaTanDegP);
          //StringFinish:=28-steps*CaTanDegP;
            Ostatok:=28-StringDivTrunc*CaTanDegP;
 
              end;
            Label1.Caption:=IntToStr(CaTanDegP);
            Label2.Caption:=FloatToStr(StringDiv);
            {%ENDREGION}
 
 x:=RazmerX-1;
 xRazmerX:=x;
 StringStart:=x;
 yRazmerY:=RazmerY-1;
 y:=0;
TracerY:=0;
TracerX:=0;
steps:=0;
logic:=@logic1;
p:=@p1;
Edge:=@Edge1;
steps1:=0;
xf:=0;
yf:=y+1;
// для отладки первой фазы--------------------------------------------------------------------------------------------------------
 runTime:=gettickcount64;
 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)));//
   if TracerX<0 then TracerX:=0;
   TracerY:=0;
 end;
 logic4:
 altHead:=@altHead1;
 steps:=stepsBig;
 Biger:=x-stepFrequent+1;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    repeat ///////////////////////////////////////////////////////////////////////////////////////
 dec(steps);
 repeat
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 altHead:=@altHead1;
 altHead3:
 if Biger<0 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
 asm
 jmp Edge
 end;
 Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
 inc(steps1);
 Goto Edge3;
 Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
  dec(steps1);
 TracerY:=y-steps1;
 TracerX:=0;
 p:=@p1;
 Goto Edge4;
 Edge3:
 p:=@p2;
 Edge4:
 until steps=0;
  Biger:=x-stepRare+1;
 steps:=stepsBig;
  altHead:=@altHead2;
   until x<0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
inc(y);
yf:=y+1;
p:=@p1;
x:=xRazmerX;
until y>yRazmerY-1;
Edge:=@Edge2;
until y>yRazmerY;
             runTime:=gettickcount64-runTime;
             Label5.Caption:=IntToStr(runTime);
         end;
    begin
 steps1;
end;
end.



Ссылка на код работающий без ошибок
https://www.cyberforum.ru/blog... g7996.html

Ну вы понимаете что тут я ничего сочинять не могу, и нажатие от кнопки для среды совершенно одинаково с нажатием этой-же кнопки, если всё перменные объявлены при этом с ним-же снова.
Как я могу искать при условии что нажатие на кнопку не равно нажатию на кнопку - какую-то ошибку.
Дайте совет если можете - как я могу сделать это если код работает как хочет, а не так как его писали.
Я не писал так, чтобы одно и то-же было разным, я пишу так, что одно и то-же оно - одинаковое.

В общем спаисбо за внимание, вряд-ли мне кто-то чем-то поможет. Но думаю, что может ... когда нибудь...ведь свистел уже раз рак на горе... вдруг ещё...
Миниатюры
Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций   Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2023, 12:07
Ответы с готовыми решениями:

Два события Click Button
Доброго времени суток. Есть приложение, в котором есть приличное количество кнопок, которые все в начале выполняют одни и те же действия...

События Click для Button
Создаю в цикле кнопки. В конце каждого прохода цикла добавлю созданную кнопку в таблицу. К кнопке привязываю событие. for (....) ...

Событие click() по элементу button
&lt;button class=&quot;ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only&quot; role=&quot;button&quot; aria-disabled=&quot;false&quot;...

27
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 13:44  [ТС]
В общем ладно, вдруг кто-то заинтересуется этим интересным фактом.

Добавлено через 1 час 2 минуты
И после такого ещё меня будут учить выскочки всякие, я не имею ввиду участников этого форума, как надо правильно программировать. Мне кажется что кое кому нужно для начала научиться проектировать процессоры, чтобы заикаться там ещё о чём-либо.
Видите-ли мой код, критика с другого сайта, мешает процессору угадывать. Пусть идёт подальше этот предсказываюший-угадывающий процессор, пусть он лучше теперь предскажет судьбу своего создателя склонного к алхимии, магии и чародейству.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
13.03.2023, 15:53
Вряд ли дело в процессоре. delphi тащит много зависимостей, начиная с библиотеки визуальных компонентов и пр.. Т.е проблема скорее всего либо в самом delphi либо в вас Асм вставки даже на Си делают когда точно понимают что делают, а в дельфях и подавно. Смотрите в отладчике.
1
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,461
13.03.2023, 15:59
CoderHuligan, у него lazarus.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 16:50  [ТС]
Вот и я делал вставки точно понимая что делаю, так как перед ними гонял код без них чисто на паскале, и потихонечку ими заменял код.
И на каком-то этапе среда отказалась работать адекватно, хотя код был проверен сначала в высокоуровневом ЯП - паскале.
Делал делал, а потом оно вдруг просто начало с просто так не то что работать с ошибками, а работать вообще рандомно. Тут на среду тоже как-бы что сказать можно? Ошибка появилась с интеграцией очередных прыжков, проверенных на паскале, и скорее всего это вина именно процессора...потому что ассемблер.
Паскаль тут не при делах: ошибка рандомной работы появилась при очередной интеграции ассемблерной вставки.

Не по теме:

Не хотят-ли наши власти вложить не в рутуб, а в производство своей вычислительной техники - в смылсе отечественной? Рутуб по логике должен появится потом, по достижению каких-то успехов в этом деле. А то вроде получается что успехов никаких абсолютно, а радости полные штаны- что срочно требуется канал для её излияния. Или что, я в качестве программирования должен изучать процессоры интелкоре какие-то, зачем они мне, кто знает что в них? Я думаю что те кто их делает не знают этого сами. Там у них гадания какие-то , чревовещания, предсказывания, магия - зачем мне этот бред?


Цитата Сообщение от CoderHuligan Посмотреть сообщение
Асм вставки даже на Си делают когда точно понимают что делают
Причём тут я? Переменные инециализируются только после нажатия кнопки и все разом - ничего на потом не откладывается, для следующего цикла работы.
Вот доказательство
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  public
 
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
 
  var
Добавлено через 7 минут
До очередной ассмблерной вставки никаких похожих эффектов не наблюдалось.

Добавлено через 9 минут
Я могу понять всё, но понять почему один и тот-же код работает по разному - не могу, при том, что в нём полностью заново происходит инициализация всего что есть в нём.

Добавлено через 3 минуты
А одна мелочь - при возвращении размеров код работает правильно, тут да, скорее дело в том, что вставки сделаны не правильно.
Хотя если честно - я не вижу ошибку.

Добавлено через 2 минуты
Да скорее ошибка у меня. Надо её искать. Ну если внимательно изучить таблицу - то ошибка у меня.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33414 / 21523 / 8237
Регистрация: 22.10.2011
Сообщений: 36,923
Записей в блоге: 12
13.03.2023, 16:56
Hretgir, собственно, взял оба эти кода, скопировал себе в проект на разные кнопки, и что? Ничего. Совершенно идентичный результат при запуске и выполнении, могу скрин показать. (угол задал 45, размер грида - 10*10, поскольку других инструкций по пользованию кодом не было приведено - делаю так, как удобно мне)...

OS : Debian 10 Xfce
Lazarus : 2.2.4

Так что не надо искать ошибки в компиляторе (тем более - в процессоре)...
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 17:33  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Hretgir, собственно, взял оба эти кода, скопировал себе в проект на разные кнопки, и что? Ничего. Совершенно идентичный результат при запуске и выполнении. (угол задал 45, размер грида - 10*10, поскольку других инструкций по пользованию кодом не было приведено - делаю так, как удобно мне)...
нет, я ведь приводил пример как отловить ошибку - нужно размер грида ввести в форме икс игрик.
если сделать 20 на 20 , то ошибка будет, а от 10*10 и до 15*15 - ошибки не будет.

Добавлено через 4 минуты
20*20 угол 45 - ошибки нет...

Добавлено через 2 минуты
значит вновь созданный цикл не может оборваться при каких-то условиях. Странно как-то.

Добавлено через 11 минут
А...ну это фича такая при программировании ассемблерных вставок - не получается писать код типа аля-приблизительно.
И вот что нужно было, правда я испугавшись перенёс немного
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
    repeat ///////////////////////////////////////////////////////////////////////////////////////
 dec(steps);
 repeat
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 Biger:=x-stepRare+1;
 steps:=stepsBig;
 altHead:=@altHead1;
 altHead3:
 if Biger<1 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
 asm
 jmp Edge
 end;
 Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
 inc(steps1);
 Goto Edge3;
 Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
  dec(steps1);
 TracerY:=y-steps1;
 TracerX:=0;
 p:=@p1;
 Goto Edge4;
 Edge3:
 p:=@p2;
 Edge4:
 until steps=0;
 
 
  altHead:=@altHead2;
 
 
   until x<0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Если программировать ассемблер, то аля приблизительно не катит, но я что-то не вижу теперь профита от своей этой вставки.

Добавлено через 3 минуты
Вот в чём прикол
if Biger<1 then begin
без вставки и от сравнения с нулём срабатывало, вот так
if Biger<0 then begin
.
Одни и те-же почти условия, но ассемблер требовательнее- требует более точного их описания.

Добавлено через 7 минут
Профит есть, если код зациклить без вывода в грид при размерах таблицы 1000 на 1000, то из 10-9 миллисекунд расчёта данных на грид выигрывается около 2 милисекунд. Но это не существенно. Блин.

Добавлено через 3 минуты
А нееееет, просто фишка в том, что условия проверяться стали в другом месте, соответствено потребовало изменения проверки условия на единицу. Вот так. Проверка условия сместилась на until steps=0;

Добавлено через 2 минуты
Вот такая магия без магии.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
13.03.2023, 17:35
Вот у вас:
Pascal
1
jmp altHead
А через строчку:
Delphi
1
goto altHead3;
Вы этим что хотели сказать? Это такая оптимизация? Вы точно уверены, что jmp сработает быстрее goto? Зачем такая жуткая смесь jmp и goto? Так быстрее? Вы проверяли?

Добавлено через 53 секунды
Цитата Сообщение от AzAtom Посмотреть сообщение
у него lazarus.
Почти то же самое.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 18:05  [ТС]
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Почти то же самое.
эта структура точно такого типа как и эта, все этим мои метки имеют структуру одного и того-же типа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 //StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
Понимаете? там тоже точно так-же, только вот в этом примере больше пунктов. Структура та-же, любую другую структуру я просто посчитаю лишённой смысла сам.

Добавлено через 3 минуты
Да точно оптимизация, я выиграл около 2 милисекунд из 9.
Я хотел вернуть проверку условия, но решил продолжать тот-же путь каким и шёл.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Зачем такая жуткая смесь jmp и goto? Так быстрее? Вы проверяли?
Научите меня делать переход по переменной, и я сделаю так.

Как иначе вы сделает переход по переменной? Case? Вы полагаете что перебирание списка для получения адреса перехода и с переходом после - быстрее просто перехода сразу по указанному адресу?

Добавлено через 5 минут
Почему получается ускорение? Представьте себе мототрек, и вот есть трамплины, и есть кочки, проверка условий - это езда по кочками, а ассемблерные прыжки - прыжки по трамплинам над этими кочками. Ну я это так себе представляю.

Добавлено через 8 минут
Вот конкретно создав новый цикл и сделав это вверху
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
repeat
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 Biger:=x-stepRare+1;
 steps:=stepsBig;
 altHead:=@altHead1;
 altHead3:
 if Biger<1 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
и это внизу
Pascal
1
2
3
4
5
6
7
 until steps=0;
 
 
  altHead:=@altHead2;
 
 
   until x<0;
я выиграл 2 милисекунды из 9.

Полный код теперь выглядит у меня так
Кликните здесь для просмотра всего текста
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
 unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
    procedure steps1;
  var
    Edge,altHead,logic,p:pointer;
    y,x, xf,yf, TracerX, TracerY, steps, stepsInString, stepRare, stepFrequent, stepsBig, StringDivTrunc, StringFinish, StringStart,Punctir, Nechto:integer;
    px,py:^integer;
     Biger, countPix, Ostatok, CaTanDegP, RazmerX, xRazmerX, RazmerY,yRazmerY,bigStep, runTime,steps1:integer;
    CaTanDeg,TanDeg, TracerYDiv, deg:Extended;
    TracBool:boolean;
    //вторичный блок переменных
    StringDiv, StringDiv1:Extended;
    znak:integer;
    label p1,p2,p3,p4;
      label logic1,logic2,logic3,logic4;
            label Edge1, Edge2,Edge3,Edge4;
              label altHead1, altHead2, altHead3;
 //               label alttail1,altTail2;
          procedure Vstavka;
          begin
           //CaTanDegP:=round(CaTanDeg);
           //StringDiv:=RazmerX / (CaTanDeg);
           stepFrequent:=round(CaTanDeg);//кол-во пикселей в частом штрихе
           StringDiv:=frac(CaTanDeg);//выборка дробной части катангенса
           znak:=sign(0.5-StringDiv)*sign(StringDiv);//указывает на увеличение или уменьшение результата суммирования этой дробной части при повторе частых штрихов
           stepsBig:=round(1/StringDiv)+1;//!!!!!!!!увеличил на единицу только потому что в коде применяется только в таком виде
           stepRare:=stepFrequent+znak;//количество пикселей в редком штрихе. промежуточный, пока не нужен.
           bigStep:= stepsBig*stepFrequent;//поправил
           if bigStep=0 then begin
           bigStep:=stepRare;
           stepRare:=0;
 
           end;
           end;
          begin
      deg:= StrToInt(Edit1.Text);
      RazmerX:= StrToInt(Edit2.Text);
      RazmerY:= StrToInt(Edit3.Text);
      StringGrid1.RowCount:= RazmerY+2;  { Установка количества строк компонента StringGrid}
      StringGrid1.ColCount:= RazmerX+2;
         TanDeg := Tan(DegToRad(deg));
         {%REGION 'ttt'}
         if TanDeg = 0 then begin
           CaTanDeg:=RazmerX;
           CaTanDegP:=Trunc(CaTanDeg);
           px:=@x;
           py:=@y;
           StringFinish:=0;
           Ostatok:=0;
           Vstavka;
           end
         else begin
         CaTanDeg:= 1/TanDeg;
         if CaTanDeg>=TanDeg then begin
           px:=@x;
           py:=@y;
           Vstavka;
          if CaTanDegP>28 then CaTanDegP:=27;
           end
         else begin
           px:=@y;
           py:=@x;
           Vstavka;
           if CaTanDegP>28 then CaTanDegP:=27;
            end;
                  end;
         if CaTanDegP=0 then begin
           StringFinish:=0;
           Ostatok:=0;
           end else begin
            StringDivTrunc:=Trunc(RazmerX div CaTanDegP);
          //StringFinish:=28-steps*CaTanDegP;
            Ostatok:=28-StringDivTrunc*CaTanDegP;
 
              end;
            Label1.Caption:=IntToStr(CaTanDegP);
            Label2.Caption:=FloatToStr(StringDiv);
            {%ENDREGION}
 
 x:=RazmerX-1;
 xRazmerX:=x;
 StringStart:=x;
 yRazmerY:=RazmerY-1;
 y:=0;
TracerY:=0;
TracerX:=0;
steps:=0;
logic:=@logic1;
p:=@p1;
Edge:=@Edge1;
steps1:=0;
xf:=0;
yf:=y+1;
// для отладки первой фазы--------------------------------------------------------------------------------------------------------
 runTime:=gettickcount64;
 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)));//
   if TracerX<0 then TracerX:=0;
   TracerY:=0;
 end;
 logic4:
 altHead:=@altHead1;
 steps:=stepsBig;
 Biger:=x-stepFrequent+1;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    repeat ///////////////////////////////////////////////////////////////////////////////////////
 dec(steps);
 repeat
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 Biger:=x-stepRare+1;
 steps:=stepsBig;
 altHead:=@altHead1;
 altHead3:
 if Biger<1 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 //StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 //StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
 asm
 jmp Edge
 end;
 Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
 inc(steps1);
 Goto Edge3;
 Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
  dec(steps1);
 TracerY:=y-steps1;
 TracerX:=0;
 p:=@p1;
 Goto Edge4;
 Edge3:
 p:=@p2;
 Edge4:
 until steps=0;
 
 
  altHead:=@altHead2;
 
 
   until x<0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
inc(y);
yf:=y+1;
p:=@p1;
x:=xRazmerX;
until y>yRazmerY-1;
Edge:=@Edge2;
until y>yRazmerY;
             runTime:=gettickcount64-runTime;
             Label5.Caption:=IntToStr(runTime);
         end;
    begin
 steps1;
end;
end.


Добавлено через 4 минуты
Так...ну теперь пришла часть оптимизации расчётов по меткам logic.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 18:18  [ТС]
А если тестить на расчётах для таблицы 10 000 на 10 000
внизу время расчёта без вывода таблицы, есть ли разница от оптимизацией всего одним ассемблерным трамплином?
Я лично считаю что это оптимизация.
Миниатюры
Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций   Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций  
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 18:22  [ТС]
Оптимизация-ли это? Всего одна ассемблерная вставка. Ну правда на фоне многих других понятное дело она так выделяется. Но всё-же.
Ну это конечно без вывода данных в таблицу разумеется, иначе долго
Миниатюры
Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций  
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 20:49  [ТС]
Ну и осталось математику оптимизировать, 10 000 ячеек правого столбца + и 10 000 последнй строки длительных расчётов и составляют в основном оставшуюся долю работы программы.

Добавлено через 5 минут
и ошибочка тут как раз в математике затерлась как-то...

Добавлено через 3 минуты
Точнее она не в математике, а вот в таком грубом измменении проверки условия. И надо посмотреть варианты исправить её.

Добавлено через 55 минут
тут исправил
Pascal
1
2
3
4
5
6
    repeat ///////////////////////////////////////////////////////////////////////////////////////
 repeat
  dec(steps);
 asm
 jmp altHead
 end;
в общем ладно, дел в во мне короче, ищу в чём суть преобразования кода в целом, так просто сразу не понять
есть смещение столбца одного в отличии от варианта без последней вставки ассемблерной. И так явно причину не увидеть
. Просто жалко терять треть производительности на проверку условия. Ну может это и мой предрасудок, но кажется потеря есть, лучшая проверка условия - циклы, быстрее всего и желательно на равенство нулю.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
13.03.2023, 21:45  [ТС]
Это тихий ужас. Мне пришлось раньше увеличить результат подсчёта больших шагов на единицу, а теперь мне пришлось его уменьшить на единицу.
Естественно в математических расчётах по метке logic я его на единицу увеличил.
как-то так
Кликните здесь для просмотра всего текста
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
    procedure steps1;
  var
    Edge,altHead,logic,p:pointer;
    y,x, xf,yf, TracerX, TracerY, steps, stepsInString, stepRare, stepFrequent, stepsBig, StringDivTrunc, StringFinish, StringStart,Punctir, Nechto:integer;
    px,py:^integer;
     Biger, countPix, Ostatok, CaTanDegP, RazmerX, xRazmerX, RazmerY,yRazmerY,bigStep, runTime,steps1:integer;
    CaTanDeg,TanDeg, TracerYDiv, deg:Extended;
    TracBool:boolean;
    //вторичный блок переменных
    StringDiv, StringDiv1:Extended;
    znak:integer;
    label p1,p2,p3,p4;
      label logic1,logic2,logic3,logic4;
            label Edge1, Edge2,Edge3,Edge4;
              label altHead1, altHead2, altHead3;
 //               label alttail1,altTail2;
          procedure Vstavka;
          begin
           //CaTanDegP:=round(CaTanDeg);
           //StringDiv:=RazmerX / (CaTanDeg);
           stepFrequent:=round(CaTanDeg);//кол-во пикселей в частом штрихе
           StringDiv:=frac(CaTanDeg);//выборка дробной части катангенса
           znak:=sign(0.5-StringDiv)*sign(StringDiv);//указывает на увеличение или уменьшение результата суммирования этой дробной части при повторе частых штрихов
           stepsBig:=round(1/StringDiv);//!!!!!!!!увеличил на единицу только потому что в коде применяется только в таком виде
           stepRare:=stepFrequent+znak;//количество пикселей в редком штрихе. промежуточный, пока не нужен.
           bigStep:= stepsBig*stepFrequent;//поправил
           if bigStep=0 then begin
           bigStep:=stepRare;
           stepRare:=0;
 
           end;
           end;
          begin
      deg:= StrToInt(Edit1.Text);
      RazmerX:= StrToInt(Edit2.Text);
      RazmerY:= StrToInt(Edit3.Text);
      StringGrid1.RowCount:= RazmerY+2;  { Установка количества строк компонента StringGrid}
      StringGrid1.ColCount:= RazmerX+2;
         TanDeg := Tan(DegToRad(deg));
         {%REGION 'ttt'}
         if TanDeg = 0 then begin
           CaTanDeg:=RazmerX;
           CaTanDegP:=Trunc(CaTanDeg);
           px:=@x;
           py:=@y;
           StringFinish:=0;
           Ostatok:=0;
           Vstavka;
           end
         else begin
         CaTanDeg:= 1/TanDeg;
         if CaTanDeg>=TanDeg then begin
           px:=@x;
           py:=@y;
           Vstavka;
          if CaTanDegP>28 then CaTanDegP:=27;
           end
         else begin
           px:=@y;
           py:=@x;
           Vstavka;
           if CaTanDegP>28 then CaTanDegP:=27;
            end;
                  end;
         if CaTanDegP=0 then begin
           StringFinish:=0;
           Ostatok:=0;
           end else begin
            StringDivTrunc:=Trunc(RazmerX div CaTanDegP);
          //StringFinish:=28-steps*CaTanDegP;
            Ostatok:=28-StringDivTrunc*CaTanDegP;
 
              end;
            Label1.Caption:=IntToStr(CaTanDegP);
            Label2.Caption:=FloatToStr(StringDiv);
            {%ENDREGION}
 
 x:=RazmerX-1;
 xRazmerX:=x;
 StringStart:=x;
 yRazmerY:=RazmerY-1;
 y:=0;
TracerY:=0;
TracerX:=0;
steps:=0;
logic:=@logic1;
p:=@p1;
Edge:=@Edge1;
steps1:=0;
xf:=0;
yf:=y+1;
// для отладки первой фазы--------------------------------------------------------------------------------------------------------
 runTime:=gettickcount64;
 repeat
  dec(steps);
 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:
 altHead:=@altHead1;
 steps:=stepsBig;
 //Biger:=x-stepFrequent+1;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    repeat ///////////////////////////////////////////////////////////////////////////////////////
    repeat
    dec(steps);
//  if steps=0 then   altHead:=@altHead2;
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 altHead:=@altHead1;
 altHead3:
 if Biger<1 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
 asm
 jmp Edge
 end;
 Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
 inc(steps1);
 Goto Edge3;
 Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
  dec(steps1);
 TracerY:=y-steps1;
 TracerX:=0;
 p:=@p1;
 Goto Edge4;
 Edge3:
 p:=@p2;
 Edge4:
    until steps=0;
    altHead:=@altHead2;
     Biger:=x-stepRare+1;
     steps:=stepsBig;
   until x<0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
inc(y);
yf:=y+1;
p:=@p1;
x:=xRazmerX;
until y>yRazmerY-1;
Edge:=@Edge2;
until y>yRazmerY;
             runTime:=gettickcount64-runTime;
             Label5.Caption:=IntToStr(runTime);
         end;
    begin
 steps1;
end;
end.

тем не менее скрин отработавшего вот этого кода, исправление ошибки изменения скорости не повлекло
Миниатюры
Чем событие Button Click отличается от события Button Click или крах компилятора ассемблерных оптимизаций  
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
14.03.2023, 01:03  [ТС]
Если я делал проверку условия - то от меня требовалось писать какие-то кривые под них заточенные выражений.
например вот это
Pascal
1
 steps:=stepsBig+1;
я начинаю делать оптимизацию, и всё - компьютер требует чтобы я все выражения переписал на правильные.
Это просто мозг выносяще.

Добавлено через 3 минуты
я думаю, что если volvo захочет вникнуть - он сможет найти в коде то, о чём я, у удивится сам наверное.
Хотя...мб это просто совпадение какое-то...в конце концов зачем ему это...да и мне собственно- ну так значит так.
Теперь математика.

Добавлено через 7 минут
То есть получается что когда я пишу на высокоуровневом ЯП - тот требует от меня писать всякую фигню,
И я её пишу эту фигню, хоть и понимаю что она как чёрт в табакерке какой-то. Как только я начинаю переводить код на низкий уровень - он всех этих чертей сразу травит на меня и код не работает, мне приходится долго и нудно этих чёртиков кикать по одному. Я не знаю почему так, но это так.
Но это всё так - абстракция, к слову.

Добавлено через 1 час 28 минут
Работа честная, никакой халтуры.
Мне пока нечего больше сказать. В общем я дальше оптимизирую расчёты под метками logic. Всё по честному.

Добавлено через 1 час 33 минуты
Единственное что, что я показал ну максимальную почти разбежку в показаниях таймера, от клика до клика они разнятся, но в среднем почти диапазон держится разрыва.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
14.03.2023, 09:04  [ТС]
Но так или иначе без высокоуровнего ЯП сложнее. Просто нужно усвоить некоторые правила низкоуровневой оптимизации программы написанной на высокоуровневом языке программирования.
Гораздо проще проводить оптимизацию в высокоуровневом языке программирования, но низкоуровневую, а потом переводить всё на низкоуровневыйязык, если изначально планировался именно он.
Тут всё есть для отладки алгоритмов - визуальные компоненты, это очень важно. Простота создания графических компонентов - важно для отладки низкоуровневой оптимизации приложений, может не как сам отладчик, но тем не менее.

Ну это всё конечно моё личное мнение. Мнение скорее не как айтишника, потому что там в основном одно и то-же мнение, а как DIY, которому просто захотелось создать эффективное ПО, хотя наверное чаще говорят в таких случаях хакер - любитель. Опыт просто любителя наверное отличался-бы... но тут ещё тяга к лайфхакам - поломать голову над какой-нибудь задачкой - это интересно, потому что в случае провала можно списать всё на размышления, а занести результаты в архивы личной памяти.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
14.03.2023, 13:12
Цитата Сообщение от Hretgir Посмотреть сообщение
и это внизу
until steps=0;
altHead:=@altHead2;
until x<0;
Будет тоже самое:
Delphi
1
2
3
until steps=0;
goto altHead2;
until x<0;
В чём преимущество?

Добавлено через 1 минуту
К стати, в на Дельфи такой номер не прокатывает. Попробую в Lаzarus.
0
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
14.03.2023, 13:54  [ТС]
Цитата Сообщение от CoderHuligan Посмотреть сообщение
until steps=0;
goto altHead2;
until x<0;
к сожалению не будет, вы заблуждаетесь, потому что не отработает своё проверка условия на выход из цикла, которую кстати вы процитировали.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В чём преимущество?
в том что код работать будет, а Ваше то-же самое - нет.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
К стати, в на Дельфи такой номер не прокатывает. Попробую в Lаzarus.
не пробуйте, не сработает.
Это слишком очевидно.
volvo я немного описал совсем другие странности, но те действительно можно назвать такими.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
14.03.2023, 14:08
Цитата Сообщение от Hretgir Посмотреть сообщение
к сожалению не будет, вы заблуждаетесь,
Да, вы правы. Тогда вот так:
Delphi
1
2
164 repeat
 goto altHead2;
И убрать
Delphi
1
altHead:=@altHead2;
на 219 строке.
Будет тоже самое.
1
 Аватар для Hrethgir
319 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,254
Записей в блоге: 182
14.03.2023, 15:55  [ТС]
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Будет тоже самое.
этот код не будет работать без ассемблерных прыжков. Там всё взаимосвязано, там целая цепочка причин и следствий. Вы пробуйте, не получится, а если получится - напишите и мы попробуем тоже.

Добавлено через 1 час 29 минут
Всё, я что-то не подумал, больше ассемблерными вставками я не могу увеличить быстродействие. Это финиш.
Ну расчёт трассировки на поле 10 000 на 10 000 за 0,25 секунды (без сохранения) я считаю не плохой результат. Ну тут конечно ещё хитрость в коде самом, но то не в счёт, там я ничего не замерял, просто прикрутил что-то, а что-то убрал. В конце концов ассемблерные метки я измерил, последнюю и 30 процентов придатка скорости от неё - эффект. Математику я не смог ассемблером улучшать - нет смысла вообще никакого, немного улучшил математику, но сказать что чтобы это как-то выразилось - не могу.
Вот так вот, угол до 0- 45 градусов, вход в карту нижняя левая ячейка
, пока так
, ну и слава богу, надоело уже улучшать
Кликните здесь для просмотра всего текста
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
    procedure steps1;
  var
    Edge,altHead,logic,p:pointer;
    y,x, xf,yf, TracerX, TracerY, steps, stepsInString, stepRare, stepFrequent, stepFrequentD, stepsBig, StringDivTrunc, StringFinish, StringStart,Punctir, Nechto:integer;
    px,py:^integer;
     Biger, countPix, Ostatok, CaTanDegP, RazmerX, xRazmerX, RazmerY,yRazmerY,bigStep, runTime,steps1:integer;
    CaTanDeg,TanDeg, TracerYDiv, deg, stepsBigD:Extended;
    TracBool:boolean;
    //вторичный блок переменных
    StringDiv, StringDiv1:Extended;
    znak:integer;
    label p1,p2,p3,p4;
      label logic1,logic2,logic3,logic4;
            label Edge1, Edge2,Edge3,Edge4;
              label altHead1, altHead2, altHead3;
          procedure Vstavka;
          begin
           //CaTanDegP:=round(CaTanDeg);
           //StringDiv:=RazmerX / (CaTanDeg);
           stepFrequent:=round(CaTanDeg);//кол-во пикселей в частом штрихе
           StringDiv:=frac(CaTanDeg);//выборка дробной части катангенса
           znak:=sign(0.5-StringDiv)*sign(StringDiv);//указывает на увеличение или уменьшение результата суммирования этой дробной части при повторе частых штрихов
           stepsBig:=round(1/StringDiv);//
           stepRare:=stepFrequent+znak;//количество пикселей в редком штрихе. промежуточный, пока не нужен.
           bigStep:= stepsBig*stepFrequent;//поправил
           if bigStep=0 then begin
           bigStep:=stepRare;
           stepRare:=0;
 
           end;
           end;
          begin
      deg:= StrToInt(Edit1.Text);
      RazmerX:= StrToInt(Edit2.Text);
      RazmerY:= StrToInt(Edit3.Text);
      StringGrid1.RowCount:= RazmerY+2;  { Установка количества строк компонента StringGrid}
      StringGrid1.ColCount:= RazmerX+2;
         TanDeg := Tan(DegToRad(deg));
         {%REGION 'ttt'}
         if TanDeg = 0 then begin
           CaTanDeg:=RazmerX;
           CaTanDegP:=Trunc(CaTanDeg);
           px:=@x;
           py:=@y;
           StringFinish:=0;
           Ostatok:=0;
           Vstavka;
           end
         else begin
         CaTanDeg:= 1/TanDeg;
         if CaTanDeg>=TanDeg then begin
           px:=@x;
           py:=@y;
           Vstavka;
          if CaTanDegP>28 then CaTanDegP:=27;
           end
         else begin
           px:=@y;
           py:=@x;
           Vstavka;
           if CaTanDegP>28 then CaTanDegP:=27;
            end;
                  end;
         if CaTanDegP=0 then begin
           StringFinish:=0;
           Ostatok:=0;
           end else begin
            StringDivTrunc:=Trunc(RazmerX div CaTanDegP);
          //StringFinish:=28-steps*CaTanDegP;
            Ostatok:=28-StringDivTrunc*CaTanDegP;
 
              end;
            Label1.Caption:=IntToStr(CaTanDegP);
            Label2.Caption:=FloatToStr(StringDiv);
            {%ENDREGION}
 
 x:=RazmerX-1;
 xRazmerX:=x;
 StringStart:=x;
 yRazmerY:=RazmerY-1;
 y:=0;
TracerY:=0;
TracerX:=0;
steps:=0;
logic:=@logic1;
p:=@p1;
Edge:=@Edge1;
steps1:=0;
xf:=0;
yf:=y+1;
stepFrequentD:=stepFrequent;
stepsBigD:=1/(stepsBig+1);
// для отладки первой фазы--------------------------------------------------------------------------------------------------------
 runTime:=gettickcount64;
 repeat
  dec(steps);
 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-(stepFrequentD+znak*trunc(stepsBigD));//
    stepFrequentD:=stepFrequentD+stepFrequentD;
 stepsBigD:=stepsBigD+stepsBigD;
   if TracerX<0 then TracerX:=0;
   TracerY:=0;
 end;
 logic4:
 altHead:=@altHead1;
 steps:=stepsBig;
    repeat
    repeat
    dec(steps);
 asm
 jmp altHead
 end;
 altHead1:
   Biger:=x-stepFrequent+1;
   goto altHead3;
 altHead2:
 altHead:=@altHead1;
 altHead3:
 if Biger<1 then begin
 Biger:=0;
 steps:=0;
 end;
 repeat
  {%REGION 'Engine'}
  xf:=x+1;//если раскомментироваnm строки После jmp p  то начнётся вывод данных в таблицу
 asm
 jmp p
 end;
 p1:
 StringGrid1.Cells[xf,yf]:= IntToStr(TracerX)+','+IntToStr(TracerY) +','+'1';//запись правого столбца
 p:=@p3;
 goto p4;
 p2:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(yf)+',' +'0';//автоматическое забивание координат в местах скоса трассы
 p:=@p3;
 goto p4;
 p3:
 StringGrid1.Cells[xf,yf]:= IntToStr(xf)+','+IntToStr(y)+',' +'0';//автоматическое забивание координат трассы на прямых участках
 p4:
 dec(x);
 {%ENDREGION}
 until x<Biger;
 asm
 jmp Edge
 end;
 Edge1://подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки
 inc(steps1);
 Goto Edge3;
 Edge2://трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
  dec(steps1);
 TracerY:=y-steps1;
 TracerX:=0;
 p:=@p1;
 Goto Edge4;
 Edge3:
 p:=@p2;
 Edge4:
    until steps=0;
    altHead:=@altHead2;
     Biger:=x-stepRare+1;
     steps:=stepsBig;
   until x<0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
inc(y);
yf:=y+1;
p:=@p1;
x:=xRazmerX;
until y>yRazmerY-1;
Edge:=@Edge2;
until y>yRazmerY;
             runTime:=gettickcount64-runTime;
             Label5.Caption:=IntToStr(runTime);
         end;
    begin
 steps1;
end;
end.


Добавлено через 10 минут
Хотя был смысл, если длина карты значительно меньше ширины, но я уже откатил всё назад - протупил жаль. И несколько компиляций успел сделать, так что бэкап бесполезен.
нне хватит, харош. на этом и заканчиваю с ассемблером в этом коде.
0
 Аватар для vlisp
1067 / 988 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
20.03.2023, 09:44
Гпи, готу и асм в одном флаконе. Хретгир, что у тебя в голове? Все, что должен делать гуй—брать значения из одного компонента, передавать в функцию, которая делает расчет, брать результат и передавать его в другой компонент.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.03.2023, 09:44
Помогаю со студенческими работами здесь

Не вызывается событие Button.Click
Привет всем! Только начинаю изучать ASP.NET и вот столкнулся с проблемой... На Web-форме есть кнопка. При нажатии на нее должна...

Как определить обработчик события Button.Click
using System; using System.ComponentModel; using System.Drawing; using System.Security.Permissions; using System.Web; using...

Реализовать метод Гаусса для события button.Click
Всем доброго времени суток. Пишу программу по решению СЛАУ методом Гаусса. Матрица у меня состоит из textBox'ов, которые создаются...

Groupbox.BackColor=Transparent, не срабатывает событие click button
В Groupbox есть кнопка, заметил такую вещь - если его цвет поставить в прозрачный, то не срабатывает событие click у кнопки. Как исправить?

Элемент Label, поддерживающий событие Click как у Button
У меня возник вопрос: как реализовать метку (типа Label), но поддерживающую событие Click как в ButtonBase / Button ?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru