Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/33: Рейтинг темы: голосов - 33, средняя оценка - 4.70
Заблокирован

Цикл с параметром

11.10.2023, 21:06. Показов 8541. Ответов 108
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если ставится
Pascal
1
2
3
for BFCount := variable1 downto 0 do begin  
...
end;
, то выполнится один раз при BFCount=0. Хорошо, я не против, но тогда мне интересно как далеко в зашли разработчики в этой логике. А именно - проверяется ли условие ещё раз по окончанию цикла, чтобы не джампать в начало. Вопрос чисто по реализации в Lazarus, логике, ассемблеру. Просто я подумал, что раз так, то не стоит удивляться, а нужно проверить это на причины. Ну а с разработчиками я не могу разговаривать, да ещё и по ассемблеру, поэтому решил просто задать вопрос про двойную проверку условия. Просто раз выполнилось на нуле, то какой смысл идти в начало цикла, если можно сразу выйти. Будь я разрабом, то при использовании аппаратной проверке числа (именно ноль), я так и сделал-бы.
Схему прикрепляю. Тут всё не просто и ей конечно нужно описание, но она вполне себе полная. Над описанием я буду работать сегодня-завтра. Это к публикации на хабре по реорганизованным циклам к движку генератора карт трассировок.
Миниатюры
Цикл с параметром  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2023, 21:06
Ответы с готовыми решениями:

Цикл с параметром
Если в процессе цикла содержимое списка (List) не изменяется, то я бы рекомендовал инвариантное вычисление (List.Count-1) вынести за...

цикл с параметром for
1)Составить таблицу перевода суток (от 1 до 7) в часы, минуты, секунды.

Цикл с параметром
Приветствую всех!!! Дали много заданий...вот одно из них!помогите"......Нужно вычислить A(A+1)(A+2)...(A+T), для A и T введенных с...

108
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,533
29.10.2023, 21:18
Студворк — интернет-сервис помощи студентам
Hretgir, ну, озвучили. Однако, я не о том спрашивал. Я спрашивал о ВСЕЙ задаче, а не о её части.

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

Насчёт флага ZF - Ваши опасения не напрасны. В паскале значение счётчика цикла for после выполнения цикла не определено, поэтому при компиляции очень часто значение переменной цикла копируется в регистр, и подсчёт итераций происходит уже в этом регистре. Естественно, в этом случае значение флага ZF никак не зависит от счётчика цикла.

Ваша эмуляция цикла for вполне достойная.
0
Заблокирован
29.10.2023, 21:28  [ТС]
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Hretgir, ну, озвучили. Однако, я не о том спрашивал. Я спрашивал о ВСЕЙ задаче, а не о её части.
А мне и не нужна помощь по всей задаче. Тема про цикл с параметром и его компиляцию. Схема приведена для понимания для чего мне нужна такая компиляция, и сутью темы - не является.

Добавлено через 1 минуту
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Ваша эмуляция цикла for вполне достойная.
ну в ней-же у меня проверка флага Zero происходит?
Про это ведь ассемблер?

Pascal
1
2
3
4
5
6
7
count:=myVariable;
if Not (count = 0) Then begin
label1:
 
dec(count);
if Not (count = 0) then goto label1;
end;
[
if Not (count = 0) Then begin
00000000004644AB 85C0 test eax,eax
00000000004644AD 7410 jz +$10
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,533
29.10.2023, 21:35
AzAtom, насчёт реализации цикла for не всё так просто. Не обязательно, что значение флага ZF после цикла for соответствует (неопределённому по определению!) значению счётчика цикла, и (очень часто) даже не обязательно, что значение флага ZF соответствует реально используемому счётчику цикла (например, какому-то регистру), поскольку для выхода из for иногда применяется не ZF, а CF. Всё зависит как от самого компилятора так и от конкретного алгоритма оптимизации компилятора.
0
Заблокирован
29.10.2023, 21:41  [ТС]
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
AzAtom
так а что с моим кодом?
У меня ведь проверка флага?
Pascal
1
2
3
4
5
6
7
count:=myVariable;
if Not (count = 0) Then begin
label1:
 
dec(count);
if Not (count = 0) then goto label1;
end;
if Not (count = 0) Then begin
00000000004644AB 85C0 test eax,eax
00000000004644AD 7410 jz +$10
dec(count);
00000000004644AF 83AD14FFFFFF01 sub dword ptr [rbp-$000000EC],$01
if Not (count = 0) then goto label9;
00000000004644B6 83BD14FFFFFF00 cmp dword ptr [rbp-$000000EC],$00
00000000004644BD 75F0 jnz -$10
Я вижу что так. Но точно знать не могу.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
29.10.2023, 21:53
Cyborg Drone, да, согласен. В теме ТС Осуществление установки флага Zero была речь про цикл for n := x downto 0 do, потому я и пишу про флаг Z.

Цитата Сообщение от Hretgir Посмотреть сообщение
У меня ведь проверка флага?
Да. Тут явно задано count = 0, так что, проверяется именно флаг Z. Я не проверял, но уверен в этом. Если есть желание, посмотри, во что компилируется твой код.
0
Заблокирован
29.10.2023, 21:55  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Если есть желание, посмотри, во что компилируется твой код.
вроде как в проверку флага
Цитата Сообщение от Hretgir Посмотреть сообщение
if Not (count = 0) Then begin
00000000004644AB 85C0 test eax,eax
00000000004644AD 7410 jz +$10
dec(count);
00000000004644AF 83AD14FFFFFF01 sub dword ptr [rbp-$000000EC],$01
if Not (count = 0) then goto label9;
00000000004644B6 83BD14FFFFFF00 cmp dword ptr [rbp-$000000EC],$00
00000000004644BD 75F0 jnz -$10
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,533
29.10.2023, 22:05
Лучший ответ Сообщение было отмечено Hretgir как решение

Решение

Цитата Сообщение от Hretgir Посмотреть сообщение
А мне и не нужна помощь по всей задаче.
Как очень всё плохо. Вы что, истина в последней инстанции? И Вы уверены, что для решения всей задачи Вы выбрали лучший вариант решения? Так я Вам скажу, что это, скорее всего, не так. Вполне возможно, что Вы пошли не в том направлении. Если так, то ладно, что Вы просчитались, Бог с Вами. Но нам-то зачем делать то, что Вам на самом деле не нужно? За что нам такое наказание? Только за Ваше упорство решить задачу именно Вашим (вполне возможно) не оптимальным методом? А потом, если удастся выяснить, в чём состояла Ваша задача, жалеть, что зря Вам помогали, и что вовремя Вас не образумили?

(Ещё раз) Ваша эмуляция цикла for вполне достойная. Это - не возражение, это - похвала. И да, проверка флага ZF в ней происходит (jz, jnz). Ну, происходит, и шут с ней.
1
Заблокирован
29.10.2023, 22:33  [ТС]
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
И Вы уверены, что для решения всей задачи Вы выбрали лучший вариант решения?
я выбрал оптимальный вариант - в этом я уверен точно.
Спасибо.
Осталось переписать небольшой код по вечерам и тогда я дам ссылку в блоге на публикацию на Хабре.
Ну могу схему доработанную дать.
Не думаю что это как-то что-то прояснит...нужна публикация, а она пока в черновике, пока код не переписал.
Если опубликую тут - теряет оригинальность и не пройдёт модерацию. Там в правилах - статья должна быть оригинальной.
Схема.
Предудыщая публикация, но там много чего переработано по генератору карт, и код пока в общем тот-же почти, и будет всё по схеме, на вот этих моих циклах.
https://habr.com/ru/articles/743758/
Миниатюры
Цикл с параметром  
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,533
30.10.2023, 00:52
А, перцептрон, вот это что на самом деле... Компьютерное зрение, так его растак... В своё время эта тема мне мозг сломала, но, правда, ничего хорошего я не добился. Да и давно это было.

Да, Вы правы, какие-либо свёртки изображения (Фурье, Тейлора, Z-преобразование и иже с ними) - штуки достаточно громоздкие, хотелось бы сделать как-нибудь попроще и побыстрее. Всё, что предлагается для этой цели - не слишком-то и продуманная, да ещё и громоздкая матричная математика. Типа, фигня вопрос, современный числогрыз быстро считает, не имеет смысла оптимизировать.

Пока я всё-таки не уверен, что Ваш алгоритм так уж и оптимален. По сути, это упрощённая свёртка по пространственным частотам для поиска контуров. Особенно не вникал, но. Пока что мне видится из достоинств - простота, из недостатков - низкая фильтрация помех, даже по сравнению с алгоритмом Брезенхема. Наверняка Ваш алгоритм будет спотыкаться о "не слишком" вертикальные и горизонтальные линии, и о разрывы линий. Но это только первое моё впечатление, может быть, это и не так, либо, может быть, это и не важно.

Однако, спасибо. Задача Ваша не такая уж и простая, я бы даже сказал, непдъёмная. Зато я теперь в теме, буду думать, может быть, чем-то действительно помогу. Но особо не обещаю: наелся я этого досыта.

Чем я наелся
Задача была создать эффективный алгоритм сжатия изображений с потерями. Если бы задача была решена, то jpeg бы нервно курил в сторонке.

Я пытался использовать БПФ по гармоникам пространственных частот по четырём направлениям (горизонталь, вертикаль, две диагонали). Это была попытка моделирования системы "глаз-зрительная кора мозга".

В глазе человека примерно 180 миллионов "пикселей", а количество нервных волокон в глазном нерве - "всего лишь" примерно миллион. "Мало кто знает", почему это так. Вообще, это действительно мало кто знает. На самом деле, в ганглиозных клетках сетчатки происходит то самое упомянутое мной БПФ по гармоникам пространственных частот (я не шучу), и результат передаётся по нервным волокнам глазного нерва, которые являются аксонами этих самых ганглиозных клеток сетчатки. При этом БПФ происходит, естественно, с потерями, что объясняет, в частности, всеразличные оптические иллюзии. В общем, глаз - это часть мозга, вынесенная "на периферию", обладающая собственными (жёстко заданными) вычислительными возможностями.
3
Заблокирован
30.10.2023, 20:23  [ТС]
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Типа, фигня вопрос, современный числогрыз быстро считает, не имеет смысла оптимизировать.
это не оптимизация, это - свой путь, и так-же подойду своим путёми к нейросети, если конечно повезёт.
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Наверняка Ваш алгоритм будет спотыкаться о "не слишком" вертикальные и горизонтальные линии
расстояние между слоями - угол, а отношение углов к длине образующих их отрезков - радиус дуги, нейросеть это поймёт, просто надо обучить её.
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Задача Ваша не такая уж и простая, я бы даже сказал, непдъёмная.
эта - вполне подъёмная, а вот создать новый концепт обычной нейросети - это уже посложнее, но начало положено (зрение) что-то может и получится.
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Зато я теперь в теме, буду думать, может быть, чем-то действительно помогу.
хорошо, спасибо.
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Но особо не обещаю: наелся я этого досыта.
форматы данных жестко привязаны к техпроцессу, и тут напрямую зависит не от приложения усилий, а от архитектур.
Хотя было дело тоже пытался над форматами "поколдовать", но как-то остановился, понял что знаний техпроцессов и архитектур не хватит у меня.
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,533
30.10.2023, 23:28
Задача всё же тяжёлая, и, возможно, неподъёмная. Нейросеть - всего лишь САУ, параметры которой подбираются в процессе обучения. Достоинство: адекватная реакция на большинство внешних воздействий (после обучения). Недостаток "тот же самый": неадекватная реакция на аномальное воздействие. Приходится расширять нейросеть и проводить дополнительное обучение. Замкнутый круг получается. Да ещё и увеличиваются объём использованной памяти и время реакции системы на внешнее воздействие. Куда не кинь - везде клин. Так что, получается либо ИИ / МИ (та же нейросеть), мощность которого (которой) позволяет решить поставенные задачи, либо поиск алгоритмов, позволяющих быстрее и точнее получить приемлемое решение.

Ну вот, не хотел писать общими фразами, и на тебе... Написал.
0
Заблокирован
31.10.2023, 21:55  [ТС]

Не по теме:

Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Нейросеть - всего лишь САУ
не согласен, нейросеть - результат эволюции (если обощённо). ИМХО. Идущий да обрящет: роляет навык систематизации.
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Ну вот, не хотел писать общими фразами, и на тебе... Написал.
всегда приходится обобщать если нет опыта систематизации решения конкретной проблемы. Поэтому и был у меня сначала генератор карт с ассемблером. А теперь я заменяю ассемблер, и снова проблема успешной замены решается через системный подход. Только так.
Рассказывать об этом легко, но чтобы сделать малейший шаг в сложных структурах - приходится прилагать большие усилия, и систематизация - всего лишь небольшой костылик. В общем это подъёмно, но мозговзрывательно, усилия не маленькие, но без систематизации - не подъёмно.



А вот схема да - неподъёмная, для постороннего человека в ней есть самопересечения, и он их поймёт не так. Зря я её выложил, но в двух измерениях...процифровать стрелки...есть такая возможность в редакторе. Да - это надо сделать, иначе статья на Хабре будет провальной. На двумерной схеме нужно их процифровать, раз нет возможности многомерную схему выложить. Пишу код по сземе и понял, что для постороннего человека сзема ни о чём не говоряща (мне то она понятна, а вот другим - точно нет).
Да и мелкие недоработки всплывают в схеме, в процессе написания кода.
0
Заблокирован
01.11.2023, 21:03  [ТС]
Каскад циклов. У меня всё расчитывается до их выполнения (количество повторений каждого известно до запуска движка).
Не доделал, но выложу, мне это нравится, уже в своих шаблонах.
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
          count1:=finishY;//111
          if Not (count1 = 0) Then begin
          marking1:
 
                   count2:=remainderCicles;
                   if Not (count2 = 0) Then begin
                   marking2:
 
                            count3:=myVariable;
                            if Not (count3 = 0) Then begin
                            marking3:
 
                                     count4:=myVariable;
                                     if Not (count4 = 0) Then begin
                                     marking4:
 
                                             count5:=myVariable;
                                             if Not (count5 = 0) Then begin
                                             marking5:
 
                                                     count6:=myVariable;
                                                     if Not (count6 = 0) Then begin
                                                     marking6:
 
                                                             count7:=myVariable;
                                                             if Not (count7 = 0) Then begin
                                                             marking7:
 
                                                             dec(count7);
                                                             if Not (count7 = 0) then goto marking7;
                                                             end;
 
                                                     dec(count6);
                                                     if Not (count6 = 0) then goto marking6;
                                                     end;
 
                                             dec(count5);
                                             if Not (count5 = 0) then goto marking5;
                                             end;
 
                                     dec(count4);
                                     if Not (count4 = 0) then goto marking4;
                                     end;
 
                            dec(count3);
                            if Not (count3 = 0) then goto marking3;
                            end;
 
                   dec(count2);
                   if Not (count2 = 0) then goto marking2;
                   end;
 
          dec(count1);
          if Not (count1 = 0) then goto marking1;
          end;
семь циклов, это на одной строке, без смещения по оси Y.
Схема.
Думаю теперь кому-то, кто критиковал меня за применение не имён, а числовых идентификаторов, более-менее понятно откуда у меня в некоторых ситуациях предпочтения к числам.
На этом пока ухожу в работу.
Миниатюры
Цикл с параметром  
0
Заблокирован
01.11.2023, 22:14  [ТС]
Циклы обозначены черными стрелками сверху вниз с правой стороны, 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
          count1:=finishY;//111
          if Not (count1 = 0) Then begin
          marking1:
                  BremainderstepsFrequentCicles:=remainderstepsFrequentCicles;
                   count2:=remainderCicles;
                   if Not (count2 = 0) Then begin
                   marking2:
 
                            count3:=BremainderstepsFrequentCicles;
                            if Not (count3 = 0) Then begin
                            marking3:
 
                                     count4:=myVariable;
                                     if Not (count4 = 0) Then begin
                                     marking4:
 
                                             count5:=myVariable;
                                             if Not (count5 = 0) Then begin
                                             marking5:
 
                                                     count6:=myVariable;
                                                     if Not (count6 = 0) Then begin
                                                     marking6:
 
                                                             count7:=myVariable;
                                                             if Not (count7 = 0) Then begin
                                                             marking7:
 
                                                             dec(count7);
                                                             if Not (count7 = 0) then goto marking7;
                                                             end;
 
                                                     dec(count6);
                                                     if Not (count6 = 0) then goto marking6;
                                                     end;
 
                                             dec(count5);
                                             if Not (count5 = 0) then goto marking5;
                                             end;
 
                                     dec(count4);
                                     if Not (count4 = 0) then goto marking4;
                                     end;
 
                            dec(count3);
                            if Not (count3 = 0) then goto marking3;
                            end;
                       BremainderstepsFrequentCicles:=1;
                   dec(count2);
                   if Not (count2 = 0) then goto marking2;
                   end;
 
          dec(count1);
          if Not (count1 = 0) then goto marking1;
          end;

Код конечно на много сложнее будет, но это я так - чтобы организацию циклов показать.
0
Заблокирован
18.11.2023, 20:54  [ТС]
Закончил отладку циклов, без последней строки, ну и конечно проверки автоматической, визуальные недоработки исправил.
Если интересно - весь код тут. Пока что по прежнему это всё до 90 градусов, просто прежде чем приступить к второму варианту формул решил реорганизаовать циклы, чтобы не было ассемблера.
Лишнего ассемблера теперь нет, но вряд-ли кто поймёт когда просто так что этот код делает...но это ничему не мешает. И всё-же недоработки ещё нахожу в использовании буферных переменных. Всё сложно
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
          count1:=yRazmerY;////кроме последней строки
          if Not (count1 = 0) Then begin //2
          marking1:
          Inc(y);
          p := @p1;
          x := xRazmerX;
                  BremainderstepsFrequentCicles:=remainderstepsFrequentCicles;//3
                  BstepsSetapInLine:=stepsSetapInLine;
                  Balternation:=alternation;
                  BstepsFrequentCicles:=stepsBig;
                  BstepFrequent:=stepFrequent;///3
                  count2:=remainderCicles;//4
        TracerY := y - steps1;
        formula1:= stepFrequent * y + znak *trunc(y / (SummSteps));
        if TracerY < 0 then
        begin
          TracerX := RazmerX - formula1;
          if TracerX < 0 then TracerX := 0;
          TracerY := 0;
        end else TracerX := 0;
                   if Not (count2 = 0) Then begin
                   marking2:
 
                            count3:=BremainderstepsFrequentCicles;//5
                            if Not (count3 = 0) Then begin
                            marking3:
 
                                     count4:=BstepsSetapInLine;//6
                                     if Not (count4 = 0) Then begin
                                     marking4:
                                     Bstep:=BstepFrequent;//7///7
                                             count5:=Balternation;//8
                                             if Not (count5 = 0) Then begin
                                             marking5:
                                                     count6:=BstepsFrequentCicles;//9
                                                     if Not (count6 = 0) Then
                                                     begin
                                                     marking6:
 
                                                             count7:=Bstep;//10
                                                             //count7
                                                             if Not (count7 = 0) Then begin
                                                             marking7:
            {%REGION 'Engine'}
            asm
                     JMP     p
            end;
            p1:
            StringGrid1.Cells[px^, py^] := IntToStr(pTracerX^) + ',' + IntToStr(pTracerY^) + ',' + '1';
            //запись правого столбца
            p := @p3;
            goto p4;
            p2:
            y1:=y+1;
            //автоматическое забивание координат в местах скоса трассы
            p := @p3;
            goto p5;
            p3:
              y1:=y;
              p5:
              x1:=x-xInc;
             StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0';
            //автоматическое забивание координат трассы на прямых участках
            p4:
              x:=x+xInc;
            {%ENDREGION}
                                                             dec(count7);
                                                             if Not (count7 = 0) then goto marking7;
                                                             end;///10
                                                             p := @p2; /////count7
 
                                                     dec(count6);
                                                     if Not (count6 = 0) then goto marking6;
                                                     end;//11
                                             Bstep:=stepRare;//12
                                             dec(count5);
                                             if Not (count5 = 0) then goto marking5;
                                             end;//13
                                     BstepFrequent:=stepFrequent;//14
                                     dec(count4);
                                     if Not (count4 = 0) then goto marking4;
                                     end;//15
                                     BremainderstepsFrequentCicles:=1;//16
                                     BstepsSetapInLine:=1;
                                     Balternation:=1;
                                     BstepsFrequentCicles:=remainderstepsFrequent;///16
                            dec(count3);
                            if Not (count3 = 0) then goto marking3;
                            end;//17
                            BstepFrequent:=remainder;//18
                            BremainderstepsFrequentCicles:=1;
                            BstepsFrequentCicles:=1;
                   dec(count2);
                   if Not (count2 = 0) then goto marking2;
                   end;//19
 
 
          dec(count1);
          if Not (count1 = 0) then goto marking1;
          end;  //20
Ссылка https://github.com/Andrei-Y/A-... 0_deg3.zip на циклы с ассемблером.
Эта часть в конце процедуры Vstavka
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
     remainder:=RazmerX;
      remainderCicles:=0;///////////////////////////////////////////////////////////////
      stepsSetapInLine:=0;
      remainderstepsFrequent:=0;
      remainderstepsFrequentCicles:=0;////////////////////////////////////////////////////////////////////
      if remainder>bigStep+stepRare then  begin
      stepsSetapInLine:=trunc(RazmerX / (bigStep+stepRare));
      remainder:=RazmerX - stepsSetapInLine*(bigStep+stepRare);
      end;
 
          if remainder>stepFrequent then begin
      remainderstepsFrequent:=round(remainder/stepFrequent);
      remainder:=remainder-remainderstepsFrequent*stepFrequent;
     end;
      remainderstepsFrequentCicles:=sign(remainderstepsFrequent)*2;//+sign(stepsSetapInLine);
      if remainderstepsFrequentCicles=0 then remainderstepsFrequentCicles:=remainderstepsFrequentCicles+sign(stepsSetapInLine);
      remainderCicles:=sign(remainder)+sign(remainderstepsFrequentCicles);
      alternation:=2*sign(stepsSetapInLine);
      if stepsSetapInLine = 0 then begin
      alternation:=1;
      end;
      steps1:=sign(remainder)+stepsSetapInLine*2+remainderstepsFrequent;
 
 
 
 
 
      ////////////////////////////////////////
      RUNstepsSetapInLine:=sign(stepsSetapInLine);
      summLine:=remainder+remainderstepsFrequent*stepFrequent+stepsSetapInLine*(bigStep+stepRare);
      steps2:= sign(remainder)+remainderstepsFrequent+stepsSetapInLine*(stepsBig+1);
      myVariable:=0;
    Label1.Caption := IntToStr(stepRare)+'Rare';
    Label2.Caption := IntToStr(stepFrequent)+'Frequent';
    Label6.Caption := IntToStr(stepsBig)+'Big';
    Label7.Caption := IntToStr(remainder)+'rm';
    Label8.Caption := IntToStr(remainderstepsFrequent)+'RSF';
    Label9.Caption := IntToStr(remainderstepsFrequentCicles)+'RSFC';
    Label10.Caption := IntToStr(summLine)+'';
    end;
Миниатюры
Цикл с параметром  
0
Заблокирован
18.11.2023, 21:20  [ТС]
В ближайшее время закончу.
0
Заблокирован
26.11.2023, 21:59  [ТС]
Ну вот и всё. Доделал генерацию последней строки.
Просто вставил почти все те-же циклы, в них встроил формулу и один счетчик шагов.
Всё очень естесственно, кроме одной проверки условий в строке 68, с языковыми ограничениями я за целый день не смог от неё избавиться, пытался извернуться и так и сяк, всё - не то, а как могло-бы быть естесственно.
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
  p := @p6;
 x := xRazmerX;
         TracerY := y - steps1;
formula1:= stepFrequent * y + znak *trunc(y / (SummSteps));
if TracerY < 0 then
begin
 TracerX := RazmerX - formula1;
 if TracerX < 0 then TracerX := 0;
 TracerY := 0;
end else TracerX := 0;
         BremainderstepsFrequentCicles:=remainderstepsFrequentCicles;//3
         BstepsSetapInLine:=stepsSetapInLine;
         Balternation:=alternation;
         BstepsFrequentCicles:=stepsBig;
         BstepFrequent:=stepFrequent;///3
         count2:=remainderCicles;//4
         steps := stepsBig;
          if Not (count2 = 0) Then begin
          marking8:
 
                   count3:=BremainderstepsFrequentCicles;//5
                   if Not (count3 = 0) Then begin
                   marking9:
 
                            count4:=BstepsSetapInLine;//6
                            if Not (count4 = 0) Then begin
                            marking10:
                            Bstep:=BstepFrequent;//7///7
                                    count5:=Balternation;//8
                                    if Not (count5 = 0) Then begin
                                    marking11:
                                            count6:=BstepsFrequentCicles;//9
                                            if Not (count6 = 0) Then
                                            begin
                                            marking12:
 
                                                    count7:=Bstep;//10
                                                    //count7
                                                    if Not (count7 = 0) Then begin
                                                    marking13:
   {%REGION 'Engine'}
   asm
            JMP     p
   end;
   p6:
   StringGrid1.Cells[px^, py^] := IntToStr(pTracerX^) + ',' + IntToStr(pTracerY^) + ',' + '1';
   //запись правого столбца
   p := @p8;
   goto p9;
   p7:
   y1:=y+1;
   //автоматическое забивание координат в местах скоса трассы
   p := @p8;
   goto p10;
   p8:
     y1:=y;
     p10:
     x1:=x-xInc;
    StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0';
   //автоматическое забивание координат трассы на прямых участках
   p9:
     x:=x+xInc;
   {%ENDREGION}
                                                    dec(count7);
                                                    if Not (count7 = 0) then goto marking13;
                                                    end;///10
            //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
                      if steps = 0 then  steps := SummSteps;
            if RazmerX > RazmerY then begin
                    Dec(steps1);
            TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(stepsBig+1))*(stepsBig+1)-steps)/2))) +  formula1)+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 := @p6;
            Dec(steps);////////
 
                                            dec(count6);
                                            if Not (count6 = 0) then goto marking12;
                                            end;//11
                                    Bstep:=stepRare;//12
                                    BstepsFrequentCicles:=1;
                                    dec(count5);
                                    if Not (count5 = 0) then goto marking11;
                                    end;//13
                            BstepFrequent:=stepFrequent;//14
                            BstepsFrequentCicles:=stepsBig;
                            dec(count4);
                            if Not (count4 = 0) then goto marking10;
                            end;//15
                            BremainderstepsFrequentCicles:=1;//16
                            BstepsSetapInLine:=1;
                            Balternation:=1;
                            BstepsFrequentCicles:=remainderstepsFrequent;///16
                   dec(count3);
                   if Not (count3 = 0) then goto marking9;
                   end;//17
                   if  BremainderstepsFrequentCicles = 0 then  begin
                            BstepsSetapInLine:=1;
                            Balternation:=1;
                   end;
                   BstepFrequent:=remainder;//18
                   BremainderstepsFrequentCicles:=1;
                   BstepsFrequentCicles:=1;
 
          dec(count2);
          if Not (count2 = 0) then goto marking8;
          end;//19
протестировал даже в самых казусных вариантах.
Самый казусный - угол 32, размер 100 на 10, при нём исправлял последнюю недоработку. При других углах и размерах она не появлялась.
Причём это сообщение было в кэще ещё с утра, счётчик шагов с строкой 68 я усиленно пытался убрать целый день, подключая все свои скилы алгоритмизации. Я смирился с этой строкой, в другом языке может всё и получилось-бы.
Сейчас передохну и в общем-то опубликую уже не черновик на хабре.

Добавлено через 2 часа 35 минут
https://github.com/Andrei-Y/A-... public.zip
https://habr.com/ru/articles/769972/
0
Заблокирован
10.12.2023, 19:54  [ТС]
при попытке разложить формулу TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(stepsBig+1))*(stepsBig+1)-steps)/2))) + formula1)+1;
в циклы с параметром всё это дело организовывается так, с учётом того, что параметр функции sign не может быть отрицательным

Pascal
1
2
3
4
5
6
7
TracerX:=y-trunc(y/(stepsBig+1))*(stepsBig+1)-steps);
if Not (TracerX = 0) then TracerX:=1;
TracerX:=1+ TracerX +  formula1;
TracerX:=trunc(1+TracerX /2);
if Not (TracerX = 0) then TracerX:=1;
TracerX:=TracerX*znak +  formula1;
TracerX :=x - TracerX +1;
Циклов с параметром при этом не создалось, но функцию sign можно заменить более простой, что-то типа Availability.

А вообще думаю свой процессор на FPGA заделать, среду разработки и язык. Поэтому всё сейчас анализирую.
Не паскальщик я, но разделу и всем помогающим - большое спасибо.
0
Эксперт .NET
 Аватар для Usaga
14768 / 9542 / 1365
Регистрация: 21.01.2016
Сообщений: 35,984
11.12.2023, 11:20
Цитата Сообщение от Hretgir Посмотреть сообщение
А вообще думаю свой процессор на FPGA заделать, среду разработки и язык.
А ты потянешь? Ну и сразу встаёт вопрос: какие задачи должен решать процессор новый, новая среда разработки и язык?
0
Заблокирован
11.12.2023, 22:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А ты потянешь?
а я и не тянул раньше только потому, что думал что у производителей как-то подемократичнее с политикой. Разочаровало.
Цели? Хорошие цели, правильные цели, добрые цели. Те самые, что нужны.
А у них процессоры с убеждениями, мне такие не нужны процессоры, процессор должен иметь архитектуру, а не убеждения. Убеждения - чисто человеческое.

Добавлено через 37 минут
Но самое главное не в этом, именно свой процессор начиная именно с генератора карт (именно на нём ощутились оковы политики производителей как никогда). Осуществление параллельных циклов, где прохождение метки одного является тактом для другого - то чего не хватило мне чтобы уйти от копирования циклов для генерации трассировки последней строки. В параллельных циклах указатели друг на друга необходимы, как минимум в одном из них. То-есть второй цикл - только обёртка, работает он на первый, второй - для формулы. Производители процессоров такого не допустят, ведь для этого нужно открыть доступ к кэшу, создать новые языки. А на FPGA - так запросто, да и много чего другого, но раз тема про циклы - то только по теме.

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

Архитектуру процессора назову sandbox, а ЯП
free systems. Это просто начало. Ничего пока законченного. Но процессор именно под ЯП и его методы. Это будет сочетание низкого и высокого уровня вне лишних деклараций и вполне естественными средствами процессора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2023, 22:02

Задача на цикл с параметром.Массивы
оч срочно,,,,, помогите , задача:6. Дана последовательность целых чисел a1, a2, ..., an. Упорядочить эту таблицу. Добавлено через 28...

Цикл с параметром: вычислить значение функции
F(k)=cos|2k|/1,12-cos⁡(3k-2)+6,15

Задание. Цикл с параметром. Нужна подсказка
Есть задание. А Я никак не пойму как его делать и что требуется. Если не лень подскажите. Я не прошу сделать его вместо меня, я прошу...

Цикл с параметром: определить, сколько чисел из последовательности принимает максимальное значение
Добрый день. Помогите пожалуйста с программой. Нужно составить программу используя цикл с параметром. Задана последовательность из n...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
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
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru