Косвенная рекурсия.
Запись от Hrethgir размещена 26.02.2018 в 21:53
Показов 5548
Комментарии 26
|
Чтобы долго не умничать попробую вкратце. Пишу калькулятор, формулы вводятся обычным текстом, потом они переводятся в команды и прочее, в общем суть не в этом, суть в том, что работаю пока над частью открытия и сохранения проекта, и в общем у меня вообще всё будет делать одна процедура, так как я иду по пути написания самомодифицирующихся программ, потому что собираюсь позднее написать нейросеть работающую с обратным волновым алгоритмов в купе с прямым. Суть не в этом, ООП конечно это нечто - пришлось изобрести косвенную рекурсию, так как оператор Break , или команда или что-бы это не было - для меня её применение выглядит криво, однобоко, в общем как-то крабовато. Это как-бы запись - реплика на исключение оператора GOTO. Реплика такая, что кто-то не осилил, и думал что сделал то, что не осилит никто (убрал оператор GOTO) - он снова не осилил, не смог два раза. Я всё равно переизобрёл оператор GOTO, потому что прямая рекурсия - не сработала-бы, программа выдала-бы ошибку. Ладно - жуткая портянка, слабонервным - не читать. Втюхаю я сейчас конечно сюда портянку такую страшную, в общем в неё вникать не надо - главное обозресть процедуру [PASCAL]procedure ciclUpravlenija; begin while CounteR<Finish do begin ProcArr[0];//переходит в нужную позицию в списке строк while CounteR1<Etap do begin ProcArr[1];//вызов цикла до конца финала end; end; ProcArr[6]; end;[/PASCAL] Эта процедура будет управлять вообще любым процессом выполнения любой задачи поставленной пользователем, мне так надо - я делаю так. А вот реализация косвенной рекурсии в строке с условным оператором - когда вызывается из внешнего цикла эта процедура [PASCAL]Procedure EtapReadOpenProgect1;// begin inc(CounteR); CounteR1:=0; if CounteR = Finish then CounteR1:=13;//if CounteR = Finish then CounteR1:=Etap; end;[/PASCAL] Я убрал лишний код, потому как он сбивает с толку, надеюсь 18 строк кода осилить - не составит труда крутым программистам. Теперь возвращаю - слишком много возмущений по поводу кода - надо вернуть, вообще он на стадии реструктуризации открытия и сохранения проекта, потому как апгрейды проще будет делать если структуру файла и массива немного изменить, я размещаю как есть на стадии реструктуризации - боюсь что опция редактировать сообщение временна [SPOILER][PASCAL]procedure TForm1.OpenSaveProject; var stroka:string; CounteR, CounteR1,Finish,Etap, Elements:integer; LSinAr:TStringList; LSinAr1:TStringList; a,b:integer; procedure Zaglishka; begin end; {%REGION открытие проекта} procedure After; begin LSinAr.Free; //proectInform.Free; end; Procedure AddListInArr;//при открытиии проекта---------------------- begin // LSinAr.Add(stroka); if LSinAr.Count=Etap then begin SetLength(ListArr[a],b+1); ListArr[a,b]:=TStringList.Create; ListArr[a,b].Assign(LSinAr);//////////////////////////////////////////////////// Memo1.Lines.Add(IntToStr(LSinAr.Count)+'размер'); Memo1.Lines.AddStrings(LSinAr); //отладка/////////////////////////////////////////////////////////////////// inc(a); // b:=0;//...................................................................... LSinAr.Free; LSinAr:=TStringList.Create; end; inc(CounteR); inc(CounteR1); end; Procedure AddListArrFromIn; begin if a=Elements then begin a:=0; inc(b); // AddListArrFromIn;//вот эта строка до изменений почему-то не давала сбоев, а должна была давать//закоментил, чудеса end; ProcArr[5]; end; Procedure EtapReadOpenProgect;//при открытиии проекта----------------------------- begin Etap:=StrToInt(proectInform[CounteR]);/////////////////////////////////////////////////////////////////// inc(CounteR); CounteR1:=0; end; Procedure StrocaReadOpenProgect;//при открытиии проекта---------------------------- begin stroka:=proectInform[CounteR]; end; {%ENDREGION} {%REGION сохранение проекта} procedure After1; begin proectInform.SaveToFile(opendirectory+'/info.txt'); LSinAr.Free; proectInform.Free; end; Procedure AddListInArr1;//при сохранении проекта begin end; Procedure AddListArrFromIn1; begin // ProcArr[5]; end; Procedure StrocaReadOpenProgect1;// var LSinArcount:integer; begin LSinAr.Assign(ListArr[CounteR1,CounteR]); //отладка Memo1.Lines.Add('СОХРАНЕНИЕ');///////////////////////////////////////// Memo1.Lines.AddStrings(LSinAr); LSinArcount:=LSinAr.Count; stroka:=IntToStr(LSinArcount);//proectInform[CounteR]; proectInform.Add(stroka); proectInform.AddStrings(LSinAr); LSinAr.Free; LSinAr:=TStringList.Create; //отладка inc(CounteR1); end; Procedure EtapReadOpenProgect1;// begin inc(CounteR); CounteR1:=0; if CounteR = Finish then CounteR1:=13; end; {%ENDREGION} Procedure inCicle1;//внешний цикл begin ProcArr[2]; end; Procedure inCicle2;//внутренний цикл begin ProcArr[3];//чтение строки ProcArr[4];//запись строки end; procedure ciclUpravlenija; begin while CounteR<Finish do begin ProcArr[0]; while CounteR1<Etap do begin ProcArr[1]; end; end; ProcArr[6]; end; {%REGION открытия проекта} procedure preparationRead; begin SetLength(ProcArr,7); ProcArr[0]:=@inCicle1; ProcArr[1]:=@inCicle2; ProcArr[2]:=@EtapReadOpenProgect; ProcArr[3]:=@StrocaReadOpenProgect; ProcArr[4]:=@AddListArrFromIn; ProcArr[5]:=@AddListInArr; ProcArr[6]:=@After; Finish:=proectInform.count; Elements:=StrToInt(proectInform[0]); CounteR:=1; SetLength(ListArr,Elements); a:=0; b:=0; LSinAr:=TStringList.Create; LSinAr1:=TStringList.Create; end; {%ENDREGION} {%REGION сохранения проекта} procedure preparationSave; begin proectInform:= TStringList.Create; LSinAr:=TStringList.Create; SetLength(ProcArr,7); ProcArr[0]:=@inCicle1; ProcArr[1]:=@inCicle2; ProcArr[2]:=@EtapReadOpenProgect1; ProcArr[3]:=@StrocaReadOpenProgect1; ProcArr[4]:=@AddListArrFromIn1; ProcArr[5]:=@AddListInArr1; ProcArr[6]:=@After1; Finish:=Length(ListArr[1]); Etap:=13; CounteR:=-1; CountProc:=0; SetLength(ListArr,13); a:=0; b:=0; end; {%ENDREGION} begin if SelectDirectoryDialog1.Execute then begin with SelectDirectoryDialog1 do begin proectInform:=TStringList.Create; opendirectory:=FileName; proectInform.LoadFromFile(opendirectory+'/info.txt'); stroka:= proectInform[0]; end; SetLength(ProcArr,2); ProcArr[0]:=@preparationRead; ProcArr[1]:=@preparationSave; ProcArr[CountProc]; ciclUpravlenija; end; end; [/PASCAL][/SPOILER] а про гавнокод я ещё завтра поравлю, и про события давних лет напомню - про ЮТ ПБ. удалил в торопях. а я это обещал более не удалять... да даже сейчас напишу: в детстве предложил резистор в качестве ячейки памяти для ПЗУ - прислали на рацуху свидетельство, потом журнал пришёл с программатором ПЗУ на фото, прикольно чё... потом ещё, потом ещё...и всё стало гавном - любое изобретение моё в инетах - гавно. прошивайте дальше ПЗУ катушками, постройте себе заводы отдельные - для просветлённых личностей. государства отдельные. от вас только напряги и никакой пользы, вот например ошибку искал [url]https://www.cyberforum.ru/lazarus/thread2204371.html[/url]. от вас ждать хорошего не стоит - мне это понятно, и вас никто не боится, с вашими параллельными угрозами. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 26
Комментарии
-
Вчера не было ошибок - сегодня проблема, отладчик встал не с той ноги. Код выполняется, ошибка после выполнения всего кода. Комп перезагрузить попробовать.Запись от Hrethgir размещена 27.02.2018 в 10:14
-
Запись от Usaga размещена 27.02.2018 в 11:53
-
Рекурсия в том, что я вызвал строку с началом цикла не делая этого напрямую-в обход (в общем я сделал для программы подлог, но об ээтом знаю только я - постороннему читателю эти строки могут просто вынести мозг, точнее - одна строка.), почему не осилили - они с этим боролись : с переходами GOTO, якобы текст проги без этого лучше читается, а на самом деле мои проги например станут ещё труднее читабельными, я справлюсь - а вот они вряд-ли. Поэтому я и пишу -"они не смогли".
Вот этим
[PASCAL]if CounteR = Finish then CounteR1:=13;[/PASCAL]
я заменил оператор GOTO, кто это поймёт? я понимаю, поймут-ли это авторы искоренения GOTO- тот ещё вопрос. я уже начи наю понимать - этого никто не понял, машина поняла только что ей делать. Стало легче читать код без GOTO? А это только начало. Дальше будут трюки намного интереснее. И не потому что я так хочу - просто кто-то решил что должно быть так, хорошо - пусть будет так, и он увидит насколько это хорошо он придумал.Запись от Hrethgir размещена 27.02.2018 в 14:46
-
Запись от Avazart размещена 28.02.2018 в 10:06
-
GOTO нарушал структуру кода, делал его запутанным как клубок ниток. Поэтому данный оператор так невзлюбили. Если вы этот оператор заменили какой-то байдой неявной, то это ещё хуже. То, что ваши проги становятся ещё хуже при отказе от этого оператора - это проблема ваших навыков разработчика, а не клёвости оператора GOTO.
Чем замудрённее и запутанее ваш код, тем хуже. Если вы адЪ в коде устраиваете, чтобы обойтись без GOTO, то это того тупо не стоит.Запись от Usaga размещена 28.02.2018 в 10:10
-
Начинающие программисты они всегда более внимательные, сразу находят ошибки компиляторов и с какой ноги они начинают работать.
А таким как Avazart, уже практически не дано увидеть ошибку компилятора, он пессимист, и сразу начинает винить руки и голову программиста. (Про Usaga не знаю, к сожалению не видел/или не помню его сообщений на форуме)
Когда в 90 году переходил с Fortrana на С, тоже сначала оператора GOTO не хватало, а потом прошло, и даже в на Fortranе стал писать без GOTO. (Уже тогда была конструкция if-then-else-end)
GOTO-шная болезнь она проходит, инкубационный период от 3 до 9 месяцев. Если через год "инфекция" не уйдет, то может стоит задуматься об отказе себе в программировании. Профессий много, можно всегда себе найти ту, где у Вас больший талант.Запись от SSC размещена 28.02.2018 в 11:07
-
Запись от Avazart размещена 28.02.2018 в 13:19
-
[QUOTE=Avazart;bt17779]Такие как Avazart видят гавнокод и дальше не читают, и не важно что выдает компилятор.[/QUOTE]
этот гавнокод, как ты говоришь отталкивается от кибернетики (у него есть теория из кибернетики, ты её не знаешь, а всё что ты не знаешь - для тебя гавно, и кибернетика для тебя не наука), а то что ты почитаешь - только от твоей личной точки зрения и ещё некоторой ГРУППЫ людей. для меня отсутствие оператора GOTO - вообще не проблема, я нашёл ему замену отличную даже для циклов. можно было сделать процедурус прямой рекурсией, а смысл? в чём смысл? только в том, чтобы тебе это было приятнее читать? и там прямая рекурсия-выдала-бы ошибку, она не сработала-бы. поэтому сделано было так.Запись от Hrethgir размещена 28.02.2018 в 13:24
-
Запись от Usaga размещена 28.02.2018 в 13:25
-
[QUOTE=Usaga;bt17781]Какая разница от чего отталкивает говно, если оно говно? Оно же от "кибернетики" меньше пахнуть не станет.[/QUOTE]
гавно - это твое мнение, поскольку рождается в соответственном органе, и объяснений никаких не требует - конечный продукт не требующий никаких уточнений и объясниений - всё чётко и ясно: пожевал, переварил - не переварил, результат один.Запись от Hrethgir размещена 28.02.2018 в 13:30
-
Запись от Usaga размещена 28.02.2018 в 13:39
-
Запись от Usaga размещена 28.02.2018 в 13:41
-
[QUOTE=Usaga;bt17783]откуда выпал ваш код, тогда?)[/QUOTE]
а ты разве не думал об этом когда писал слово -"гавнокод"? нет? ну значит у тебя действительно что-то не так.Запись от Hrethgir размещена 28.02.2018 в 13:41
-
[QUOTE=Usaga;bt17784] всё проще: свой "код" не пахнет?)[/QUOTE]
выше моё сообщение, цитата как раз тебя больше касается.Запись от Hrethgir размещена 28.02.2018 в 13:42
-
Usaga, в своем блоге на личности переходите, раз не можете без этого. Я не написал об авторах модернизации "GOTO DELETE" - ДВАЖДЫ НЕ СУМЕВШИЕ я написал - "дважды не смогли":
Сообщение от Usaga
а) я не перешёл на личности;
б)-будет ещё третий, четвёртый, бесконечное множество раз, я смогу ещё много, на фоне адекватности сей коллегии, сия коллегия себя проявляет во всей красе-она даже в личные записи в инете гадить заходит, на 3DTooday - в личные дневники, отсюда у меня столько уверенности в себе. Там где не пост - можно зайти и задать вопрос, не более, я даже могу посмеяться над вашими кондидатами физикоматематических - но я этого не делаю в их дневниках, когда глупости их читаю - зашёл почитал, не хочу спорить - и ушёл. Я могу раскатать Фрейда в прах, но я этого не делаю - я не отбираю чужих аудиторий. Но если вот такие как вы будут просить настойчиво - я отберу у них всё, разом, и мне для этого ничего не надо делать, вы сами стремитесь своим хамством, чтобы потом просто отказаться от всего безвозвратно. Это не мои действия будут - а последствия ваших. Только ваша беда в том, что вы считаете что у вас кто-то хочет что-то отобрать, а не так: ваше ВСЁ будет потом выкинуто и раздавлено, оно никому не нужно, кроме вас, просто вы в своё всё записываете людей как ВЕЩИ, так что благодарных вам будет - большое множество оных, коих подобные вам уже записали в личное имущество.
Комментарий от Usaga:
Hretgir очень не красиво с вашей стороны редактировать чужие комментарии выдавая свою писанину за мою. Могли бы новый комментарий оставить.
Я не переходил на личности. Мне было очень интересно, почему вы такого высокого мнения о своих решениях и такого низкого об авторах языка.
Что вы отбирать собрались? Возможность созерцать ваш говнокод? Вы этим меня напугать хотите?
к предмету темы имеют несколько строк которые ты не осилил
Сообщение от Usaga
Pascal 1 2 3 4 5 6 7 8 9 10 11 12
procedure ciclUpravlenija; begin while CounteR<Finish do begin ProcArr[0];//переходит в нужную позицию в списке строк while CounteR1<Etap do begin ProcArr[1];//вызов цикла до конца финала end; end; ProcArr[6]; end;
вы скоро сами себя лишите возможности коментов, сначала вас будет "пучить", а потом вам разорвёт орган где рождаются ваши гениальные мысли. и я к этому отношения иметь не буду - это последствия ваших-же действий, сознательных причём. вспоминается Маслоу...Pascal 1 2 3 4 5 6
Procedure EtapReadOpenProgect1;// begin inc(CounteR); CounteR1:=0; if CounteR = Finish then CounteR1:=13; end;
.
Каждый видимо по своему к этому приходит...тут я ничего не могу поделать. 18 строк кода и сколько вони по случаю их появления в моём блоге..
Снова от Usaga:
Вы правы. Зачем вам про говнокод пишу. Что это изменит? Как обычны - ничего. Вы - молодец, двигаете прогресс! Продолжайте, пожалуйста, в том же духе.Запись от Usaga размещена 28.02.2018 в 14:02
-
[QUOTE=Usaga;bt17787]Бредовое высказывание) ваше поделие - произведение искусства, а авторы паскаля - имбецилы на вашем фоне [/QUOTE]
вовсе не кажется - моя задача была обойти отсутствие оператора GOTO, о чём я и писал
[QUOTE=Usaga;bt17787]Гордитесь собой. :good:[/QUOTE]
это больше у вас получается, вы даже прочтением текста не отягощаетесь, к вам ближе убеждение, утверждение и самовыражение. за последним вы собственно сюда и пожаловали, если нет - напишите у себя в блоге что-нибудь, а потом цитируйте, если будет что цитировать.Запись от Hrethgir размещена 28.02.2018 в 14:42
-
Запись от Avazart размещена 28.02.2018 в 20:56
-
[QUOTE=Avazart;bt17789]Форматировать код, давать вменяемые имена и оформлять код в теги, это как бы не точка зрения, а проявление уважения к читателю.[/QUOTE]
Я ничего не продавал и не рекламировал, поэтому сначала научитесь уважать окружающих, тогда и дойдёт до того, что я буду уважать читателя, а пока - не нравится не читайте. У вас уже претензий в строках больше чем строк того кода.
Для вас это много кода?
[PASCAL]Procedure EtapReadOpenProgect1;//
begin
inc(CounteR);
CounteR1:=0;
if CounteR = Finish then CounteR1:=13;
end;[/PASCAL]
[PASCAL]procedure ciclUpravlenija;
begin
while CounteR<Finish do
begin
ProcArr[0];//переходит в нужную позицию в списке строк
while CounteR1<Etap do
begin
ProcArr[1];//вызов цикла до конца финала
end;
end;
ProcArr[6];
end;
[/PASCAL]
символов в ваших коментах уже намного больше. вы уже давно рекорды бьёте с вашим единомышленником. 18 строк, я посчитал их для вас, это причина ваших претензий - 18 строк кода.Запись от Hrethgir размещена 01.03.2018 в 10:24
-
Тогда удалите глупую запись в блоге и закроем разговор.
Я один не улавливаю логики в Ваших предложениях?
Хорошо что считать умеете, осталось научится расставлять отступы.
Кликните здесь для просмотра всего текстаPascal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Procedure EtapReadOpenProgect1; begin inc(CounteR); CounteR1:=0; if CounteR = Finish then CounteR1:=13; end; procedure ciclUpravlenija; begin while CounteR<Finish do begin ProcArr[0];//переходит в нужную позицию в списке строк while CounteR1<Etap do begin ProcArr[1];//вызов цикла до конца финала end; end; ProcArr[6]; end;
Ну и именовать переменные, использовать перечисления итд.
Мне достаточно одной строчки:
Человек пишущий транслитом ...Pascal 1
procedure ciclUpravlenija;
Запись от Avazart размещена 01.03.2018 в 22:41
-
[QUOTE=Avazart;bt17791]Тогда удалите глупую запись в блоге и закроем разговор.
[/QUOTE]
Я его уже закрыл, на одном замечании - нужно было оставить использование оператора GOTO в рамках цикла, процедуры (локально), но я хныкать не стану - я уже придумал антидот от действий вершителей, потом ещё будут антидоты, вообще запись надо было назвать "Рецикл", это не рекурсия, почти рекурсия - но такое определение слишком абстрактное. Продолжайте бить рекорды в одиночку. Только я передумал - я возвращаю код на место, чтобы вам было не скучно быть рекорды.Запись от Hrethgir размещена 02.03.2018 в 16:07



