Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
1

Единождое выполнение оператора в теле цикла, или виртуальный конвейер

16.07.2022, 23:14. Показов 5254. Ответов 61
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Такое возможно?
Тело цикла. Допустим что это тут, для примера. На самом деле единожде выполнение требуется в другом цикле - в внешнем, но пусть как-бы тут
Pascal
1
2
3
4
5
6
repeat
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');
            dec(x);
            TtracerRec.ix:=x;
            //выполнить единожды TtracerRec.bool:=false;
            until FcountPix > x;
единожды требуется выполнить всего один оператор в конце тела цикла, такой
TtracerRec.bool:=false;
за пределами цикла выполнится
TtracerRec.bool:=true;
.

Просто ставить проверки условия - не совсем разумно, проще иметь виртуальный конвейер, что-то типа того...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2022, 23:14
Ответы с готовыми решениями:

Можно ли в теле оператора цикла использовать условный оператор? Если да, назовите примеры таких программ
Можно ли в теле оператора цикла использовать условный оператор? Если да, назовите примеры таких...

Использование оператора поиска seek в теле цикла
Добрый день, прошу помочь. Среда FoxPro 2.6 dos. Задание: Найти сведения обо всех поставщиках с...

Использование условного оператора в теле операторов цикла с условием
Дано натуральное число, в котором все цифры различны. Определить порядковые номера его максимальной...

Использование условного оператора в теле операторов цикла с условием
Всем привет! помогите с программой... Составить программу, определяющую общее число удалений и...

61
Заблокирован
16.07.2022, 23:18 2
Delphi
1
2
3
4
5
6
7
8
9
10
TtracerRec.bool:= true;
repeat
  StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');
  dec(x);
  TtracerRec.ix:= x;
  
  //выполнить единожды TtracerRec.bool:=false;
  if TtracerRec.bool
    then TtracerRec.bool:= false; 
until FcountPix > x;
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
16.07.2022, 23:19  [ТС] 3
Цитата Сообщение от Verevkin Посмотреть сообщение
if TtracerRec.bool
    then TtracerRec.bool:= false;
дорого по ресурсам
Цитата Сообщение от Hretgir Посмотреть сообщение
Просто ставить проверки условия - не совсем разумно, проще иметь виртуальный конвейер, что-то типа того...
подождём volvo.
0
Заблокирован
16.07.2022, 23:36 4
Цитата Сообщение от Hretgir Посмотреть сообщение
дорого по ресурсам
На фоне остального кода между repeat и until - ваще почти бесплатно.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.07.2022, 00:42  [ТС] 5
Цитата Сообщение от Verevkin Посмотреть сообщение
На фоне остального кода между repeat и until - ваще почти бесплатно.
Если это не нужно сейчас, то это может быть нужно потом.
И это проблема. Так как очевидно что удалив после выполнения код - получаем выигрыш.
Вопрос как это может быть реализуемо - то ли на ассемблере одним переходом. Но переход на ассемблере - тоже операция, и будет выполняться каждый раз на итерации цикла последующей...в общем проблема.
0
Заблокирован
17.07.2022, 00:49 6
Цитата Сообщение от Hretgir Посмотреть сообщение
И это проблема.
За всё в этой жизни приходится платить. Это законы физики, которые отменить нельзя.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.07.2022, 01:24  [ТС] 7
Цитата Сообщение от Verevkin Посмотреть сообщение
За всё в этой жизни приходится платить. Это законы физики, которые отменить нельзя.
Данный закон отменяется параллельным конвеером, который просто остановится после однократного выполнения.
Просто использовать массив процедур не целесообразно наверное. Можно так-же обойтись прыжком в ассемблере, где выполнение ассемблерного кода изменит точку следующих прыжков.
В общем тут физикой и не пахнет. Вы ошиблись разделом, а возможно и вообще физикой.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
17.07.2022, 01:28 8
Цитата Сообщение от Hretgir Посмотреть сообщение
Просто ставить проверки условия - не совсем разумно, проще иметь виртуальный конвейер, что-то типа того...
А этот "виртуальный конвейер" всё сделает без всякой проверки? Типа "по волшебству"?
0
Заблокирован
17.07.2022, 01:30 9
Цитата Сообщение от Hretgir Посмотреть сообщение
В общем тут физикой и не пахнет. Вы ошиблись разделом, а возможно и вообще физикой.
А, ну тебе виднее. Тыжпрограммист.
Куда уж мне, быдлу необразованному...
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.07.2022, 01:44  [ТС] 10
правка

Добавлено через 4 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
Куда уж мне, быдлу необразованному...
не имею привычки судить других - пусть они сами с собой разберутся, правильнее заниматься своим делом

Минимум что можно предпринять

Код
начало цикла
....прочие операторы
прыжок в точку 1------------------------------
точка 1
    выполнение одноразового оператора
    изменение адреса прыжка на точку 2 и переход в точку 2
точка 2
конец цикла
Цитата Сообщение от northener Посмотреть сообщение
А этот "виртуальный конвейер" всё сделает без всякой проверки? Типа "по волшебству"?
нет, у него типа end есть, а выполняется он паралелльно, с вызовом цикла, просто итерация всего одна в данном случае.

Добавлено через 8 минут
Типа вот так
основной цикл
Pascal
1
2
3
4
5
repeat
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');
            dec(x);
            TtracerRec.ix:=x;
            until FcountPix > x;
пераллельный
Pascal
1
2
3
4
repeat
холостой ход во время которого в основном выполняется первая строка основного цикла
 TtracerRec.bool:=false;
            until после однократного выполнения;
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
17.07.2022, 02:36 11
Цитата Сообщение от Hretgir Посмотреть сообщение
Минимум что можно предпринять
Код
начало цикла
....прочие операторы
прыжок в точку 1------------------------------
точка 1
 выполнение одноразового оператора
 изменение адреса прыжка на точку 2 и переход в точку 2
точка 2
конец цикла
Изменение адреса прыжка не возможно даже с помощью "волшебного" ассемблера.

Добавлено через 2 минуты
Цитата Сообщение от Hretgir Посмотреть сообщение
Типа вот так
основной цикл
...
Это что-то бредовое, имхо. Или опять мечта о волшебной палочке.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
17.07.2022, 09:07  [ТС] 12
Цитата Сообщение от northener Посмотреть сообщение
Это что-то бредовое, имхо.
ну раз изменение адреса прыжка невозможно, то значит не бредовое, так как остаётся единственной возможной альтернативой.

Добавлено через 12 минут
Или прыжок весит столько-же сколько и проверка значения на ноль?
Если вес одинаковый - то конечно нечего выдумывать, так как любая альтернатива прыжку едва-ли станет легче.
Но тут нужен ответ эксперта. Домыслам грош цена.
0
600 / 548 / 210
Регистрация: 24.01.2012
Сообщений: 1,349
17.07.2022, 23:35 13
Лучший ответ Сообщение было отмечено Hretgir как решение

Решение

как вариант
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
var p:pointer;
  a:integer;
label l1,l2;
begin
  p:=@l1;
  for a:=1 to 10 do begin
    asm
      jmp p
    end;
    l1:
    showmessage('test');
    p:=@l2;
    l2:
  end;
  end;
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
18.07.2022, 00:17  [ТС] 14
Цитата Сообщение от edukra Посмотреть сообщение
как вариант
секунду
я думаю что это должно сработать.
Заранее спасибо.
Завтра после работы проверю.
0
Модератор
3635 / 2153 / 762
Регистрация: 15.11.2015
Сообщений: 8,640
18.07.2022, 12:49 15
Лучший ответ Сообщение было отмечено Hretgir как решение

Решение

Если что-то нужно выполнить 1 раз, я бы вынес эту команду перед циклом, включая повтор команд, которые должны выполниться перед выполнением этой одной команды и тогда в теле цикла не нужно ничего придумывать и не нужно никуда прыгать.

Добавлено через 38 секунд
То есть, продублировать тело цикла вместе с нужной командой, а уже в цикле писать без этой командой.

Добавлено через 1 минуту
Хотя, если идёт обращение к StringGrid, как в примере, то тут уже одна проверка условия совершенно не замедлит программу. Замедление будет меньше погрешности измерения.
1
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
19.07.2022, 00:14  [ТС] 16
Да, должно вынестись за предел. Возможно так и было, просто алгоритм до последних изменений подвергся сильным до малой узнаваемости, а отладку я вёл без планирования поэтапного, чего больше никогда не сделаю для вещей такой сложности.
Тут понятно, что с сложными вещами запросто не получается, нужно делать поэтапно и иметь план действий.
В этот раз получилось, но в следующий раз планирую.
Да, всё получилось с выносом за пределы цикла, по крайней мере для ввода единицы в TEdit1, но выглядит поправленное намного сложнее, чем хотелось-бы: приходится откатывать назад две переменные. И видимо надо сосредоточиться и поменьше отвлекаться.

Добавлено через 16 минут
Вот такое получилось в конце вложений циклов
Pascal
1
2
3
4
5
6
7
            TtracerRec.bool:=true;
            inc(TtracerRec.ix);//добавил
            inc(x);//добавил
            inc(y);///добавил, следующую строку раскомментировал
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//раскомментировал
            inc(BasiY);
            until BasiY=fi1;
осталось изменить строки сохранения координат в поля записи и можно будет двигаться дальше в отладке этих циклов, потому что положительный эффект пока только при одном угле, дальше даже не пробовал.
Работы ещё много.

Добавлено через 36 минут
Хотя лучше вынести за цикл первую запись, чем последнюю, видимо то когда-то планировалось. Всё таки тайм Прайма не хватает.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
19.07.2022, 23:55  [ТС] 17
Кто хочет попробовать вынести это за пределы цикла - может попробовать сам, я обойдусь прыжком в ассемблерной вставке.
Проблема в том, что при выносе в строки после цикла - приходится откатывать значения переменных если катангенс близок к нулю, если катангенс близится к катангенсу угла 45 градусов - скорее всего это будет по частоте делаться чаще.
Если-же я вынесу в строки перед циклом - то не получится диагональных линий типа: vertex: 1,1;2,2, а будет так vertex: 1,1;1,2;2,2, а это совсем не надо.
В общем это целая история - если кто-то хочет ломать голову - может заняться, я объясню что должен делать алгоритм и какую механику он осуществляет.

Сам-же я на данном этапе обойдусь прыжком в ассемблерной вставке.

К тому-же это просто генератор карт трассировок, над ним я работал чтобы не писать карт вручную - по образу и подобию дебила(думаю что дебил не только-бы писал карты сам, но потом ещё и штат картографов нанял, цель... - обманывать в зарплате подчинённых и руководство в декларации о доходах), изменять размер обрабатываемых изображений, дать функционал. К самому способу замены свёрточных нейросетей это не имеет прямого отношения, а только через карты, которые будут применять нейросети, а писать генератор, да и то в исключительных случаях.
0
356 / 124 / 3
Регистрация: 25.01.2012
Сообщений: 5,464
Записей в блоге: 118
20.07.2022, 23:03  [ТС] 18
Чёт раздел затих . Сначала прочти то, что за спойлером.
Кликните здесь для просмотра всего текста
В общем это мой прайм тайм 22-0, бывает меньше.
И я не программист, если что.
Изображения надо готовить, поэтому я сначала опишу суть "на пальцах".
Алгоритм записывает карты трассировок, таблицу я вырвал из проекта и открыл новый, так как генератор карт оказался не прост.
Чтобы понять суть - надо смотреть вот от этой части, хоть там и так всё не доделано.Комментарии можете не читать - я их делал для себя, а выходной не могу посвятить кому-то, потому как надо заготовить обеды на работу.
Pascal
1
2
3
4
5
6
7
            inc(MyCount);
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');
            dec(x);
 //           Tracersloi[s,px^,pi1^]:=TtracerRec;
 //           StringGrid1.Cells[1+px^,1+pi1^]:= IntToStr(pi^)+','+IntToStr(pi1^);
            TtracerRec.ix:=x;
            until FcountPix > x;
Эта часть исследует и записывает шаги, правда пока она не сохраняет прошлые, у меня не было времени и я просто пишу текущие корды пока что. Суть вот этого цикла заключается в том, что любая линия до 45 представляет собой набор коротких ризонтальных линий, где их минимальная длина будет равна одному пикселу, после каждой прорисовки короткой линии происходит смещение по оси Y в сторону меньшего значения. Если после деления не целочисленный катангенс остаётся остаток FcountPix1, то его добежит вот этот цикл
Pascal
1
2
3
4
5
6
7
 while countPix < FcountPix1 do begin
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');
            dec(x);
            inc(countPix);
   //         Tracersloi[pi^,pi1^,sl]:=TtracerRec;
            TtracerRec.ix:=x;
            end;
Далее, у кого с логикой проблематично и с терпением - может бросить всё и не читать, дело в том, что тут ещё логика есть
BasiY - базовый координат Y, который увеличивается после каждой пробежки длинной линии, так как при прорисовке коротких фрагментов (линий) длинных линий, ранее уже говорилось происходит смещение в меньшую сторону.
Ряд проверки условий:
на указатели - пока можно вообще не обращать внимания,
на случай когда линия уходит вниз в несуществующую часть изображения,
на случай когда линия приходит сверху - с несуществующей часть изображения.
Поле болеан в карте трассировки должно содержать единицу, когда происходит обрыв линии в рамках размеров текущего изображения.

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


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

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

Алгоритм пока работает полуисправно исправно при вводе единицы в поле ввода (у меня она по умолчанию была выставлена).
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
21.07.2022, 02:35 19
Цитата Сообщение от Hretgir Посмотреть сообщение
Чёт раздел затих
И не удивительно. Вы решаете какую-то свою задачу, но какую точно, никому кроме вас не известно.
На отдельные конкретные ваши вопросы ответы были даны.
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,815
Записей в блоге: 3
21.07.2022, 04:58 20
Цитата Сообщение от Hretgir Посмотреть сообщение
выкладываю отладочную процедуру.
 Комментарий модератора 
Эти обрывки кода выше - и есть Ваша "отладочная процедура"? Мне, если что, это абсолютно не интересно и спрашиваю я, единственно, с целью опровергнуть в будущем Ваши обвинения в том, что администрацией форума производится редактирование Ваших сообщений и удаление в них какого-либо контента, ибо прецедент уже был.
1
21.07.2022, 04:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2022, 04:58
Помогаю со студенческими работами здесь

Задача на цикл, ошибка в теле цикла
Всем привет! Тут такое задание, необходимо просчитать прибыль к выходу на пенсию.Изначально...

Может ли завершиться выполнение оператора цикла?
Может ли завершиться выполнение оператора цикла, начало которого выглядит так: while...

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. ...

Как проверять, нажата ли клавиша Esc, в каждой итерации цикла, и если нажата, то прервать выполнение цикла?
OwenGlendower, это обращение прежде всего к вам. Вызов функции, в которой происходит проверка...

Составить блок-схему, программу на языке С++. В качестве оператора цикла использовать цикл с постусловием
Ребят, кто может помочь, затрудняюсь с уравнениями, кто может написать код на с++. Зарание...

С любого из операторов цикла вычислить y. Оператор if в теле цикла не использовать
С помощью любого из операторов цикла вычислить y. Оператор if в теле цикла не использовать....

C++ с использованием оператора цикла с предусловием и оператора цикла с постусловием
Составить схему программы и программу на языке C++ с использованием оператора цикла с предусловием...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru