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

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

11.10.2023, 21:06. Показов 8662. Ответов 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
Модератор
10478 / 5772 / 3413
Регистрация: 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
Модератор
10478 / 5772 / 3413
Регистрация: 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,498
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
Модератор
10478 / 5772 / 3413
Регистрация: 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
Модератор
10478 / 5772 / 3413
Регистрация: 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
Модератор
10478 / 5772 / 3413
Регистрация: 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
14792 / 9566 / 1367
Регистрация: 21.01.2016
Сообщений: 36,069
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
Закрытая тема Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru