'Условное ветвление - "GoTo" Kluge ? - страница 2

 
RaptorUK:
Я использовал GOTOs еще во времена BBC Basic.... Я даже использовал BBC BASIC на своей постоянной работе в течение примерно 7 лет... Даже в BBC Basic были GOSUB и RETURN, чтобы можно было использовать подпрограммы (функции)... Почему вы хотите использовать что-то, напоминающее GOTO в MQL4? Возможно, вы можете объяснить, что вам нужно?

Привет, Раптор,

Как вы сами сказали, вы сами использовали такие вещи в течение многих лет и поэтому знаете о бесчисленных ситуациях, в которых это может быть использовано, что очень удобно. Функции 'GoSub' и 'Return' - это, по сути, та же идея, что и 'GoTO', о которой я говорю. Хотя при использовании функций GoSub/RETURN необходимо вернуться в ту же точку вызывающей программы. В отличие от 'GoTo', которая этого не делает, что может привести к очень запутанным кошмарам. Хотя я предполагаю, что возможности использования Include, Library и .dll файлов в MQL схожи с этим. Но это не позволяет получить тот контроль, который можно получить с помощью GoSub/RETURN и т.д.

Многие итерации программирования для компьютерной обработки также содержат пары GoSub/RETURN, и это очень полезно в этой среде. Позволяет в высокой степени модулировать и повторно использовать многочисленные стандартные "консервированные циклы", а также пользовательские и специализированные функции снова и снова в многочисленных программах. Не нужно постоянно "изобретать колесо" каждый раз, когда оно требуется. Когда я начал заниматься программированием компьютерной обработки по контракту, я столкнулся с более чем 2000 различных контроллеров ЧПУ: все они имели свои собственные вариации программирования )< 8) Это вынудило меня использовать очень дорогое программное обеспечение CAD-CAM, что очень плохо. Я часто мог сам написать значительно лучшие и более эффективные программы, которые давали лучшие результаты за меньшее время цикла с лучшим износом инструмента, чем те, которые генерировало программное обеспечение.

 

GOSUB/RETURN - то же самое, что использование функций в MQL4

Много лет назад я немного занимался программированием ЧПУ... В основном для аэрокосмических работ.

 
FourX:

Я не думаю, что у C есть такая книга, не так ли?

Да, это так. Он есть во втором издании K & R на странице 65. Они говорят, что не используют его в книге, а затем приводят примеры на следующей странице!

 

Я думаю, что мы пытаемся имитировать здесь следующее.

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

Что можно сделать вот так ...

while(true){
   
   // dog:
   if( GOTOstate == DOG ){
   }
   
   // cat:
   if( GOTOstate == DOG || GOTOstate== CAT ){
   }
   
   // mouse:
   //no test needed here, just do MOUSE stuff
   
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
   
   GOTOstate = DOG;
}
   

но не очень элегантно, особенно для большого количества меток. Лучший способ - это

while(true){
   
   switch(GOTOstate){
      case DOG:
         // do DOG stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case CAT:
         // do CAT stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case MOUSE:
         // do MOUSE stuff
         break;
      default:
         break;     
   }
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
}

но вам действительно нужно поместить вызовы функций в оператор switch, иначе, если переключатель проходит через несколько страниц кода, вы не сможете увидеть структуру кода.

 
FourX:

Привет SDC,

Как и в большинстве программирования, MQL4 - это практически все "Функции", в которых, кроме переходов через некоторые строки, нет настоящей функции "GoTo", которую я пытаюсь выяснить, как сделать в MQL4 EA, поэтому я не уверен, с чем вы "согласны" и что вы имеете в виду и на что ссылаетесь в контексте этого поиска? Пожалуйста, поясните и объясните. Я не спорю. Похоже, что у вас есть что-то на уме, и я хотел бы знать, что это и как это может быть полезно для нас.


Привет, FourX Я неправильно прочитал предыдущие сообщения, я думал, что кто-то уже сказал, что я имел в виду, что вызов функции превосходит идею GoTo и улучшает ее работоспособность не в последнюю очередь из-за того, что легче читать код после этого, когда он организован в функции, чем следовать GoTo, и, как показал dabbler на своем примере, многоходовое ветвление с помощью переключателя может достичь того же, что и несколько GoTo.

 
dabbler:

Я думаю, что мы пытаемся имитировать здесь следующее.

Что можно сделать вот так ...

но не очень элегантно, особенно для большого количества меток. Лучший способ - это

но вам действительно нужно поместить вызовы функций в оператор switch, иначе, если переключатель проходит через несколько страниц кода, вы не сможете увидеть структуру кода.


Привет, Dabbler,

Настоящий оператор/функция 'GoTo' позволяет перейти в любое место в программе, а не просто пропустить следующие (пару) выражений/выражений. Это позволяет, например, повторно использовать одни и те же функции, которые нужны в нескольких экземплярах программы.

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

Есть ли в MQL5 что-то вроде "GoSub/RETURN", "GoTo" и т.д.? А как насчет Visual Basic, Java, PHP и т.д.?

 
RaptorUK:

GOSUB/RETURN - то же самое, что использование функций в MQL4

Много лет назад я немного занимался программированием ЧПУ... В основном в аэрокосмической промышленности.

Насколько мне удалось выяснить, Raptor, в MQL4 нет ничего подобного командам GoSub / Return или возможности сделать такую функцию. Поэтому я пытаюсь найти в MQL4 ключ для выполнения этой функции.

 
dabbler:

Я думаю, что мы пытаемся имитировать здесь следующее.

Что можно сделать вот так ...

но не очень элегантно, особенно для большого количества меток. Лучший способ - это

но вам действительно нужно поместить вызовы функций в оператор switch, иначе, если переключатель проходит через несколько страниц кода, вы не сможете увидеть структуру кода.

Справочник по MQL4 - Основы - Синтаксис MQL4 во многом похож на синтаксис языка C, за исключением некоторых особенностей:

  • нет адресной арифметики;

  • нет оператора do ... while;

  • нет оператора goto ....;

  • нет операции [условие]?[выражение 1]:[выражение 2];

  • нет составных типов данных (структур);

  • невозможны сложные присваивания; например, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; и т.д.;

  • вычисление логического выражения всегда завершается, никогда не прерывается досрочно.

 

Привет, 1withZachy,

По сути это похоже на MQL4 SOP, который действительно просто использует стандартную или пользовательскую функцию, а затем "возвращает" результат в функцию, как это делает MQL4. Хотя, судя по диаграмме, возможно, есть тонкое различие, которое я упускаю, но я так не думаю. Увы, документация в предоставленном примере кода: 'CallFuntion.mq4' на русском языке, который я вообще не в состоянии понять.

 

Некоторые выдержки из интересной статьи о GoTo в Википедии:

Многие языки поддерживают оператор goto, а многие - нет. В Java goto - это зарезервированное слово, но оно непригодно для использования.[1][2] В PHP не было встроенной поддержки goto до версии 5.3 (были доступны библиотеки для эмуляции его функциональности).[3]

Теорема о структурированной программе доказала, что оператор goto не является необходимым для написания программ; для любого вычисления, которое может выполнить машина Тьюринга, достаточно некоторой комбинации трех конструкций программирования - последовательности, выбора/выбора и повторения/итерации.

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

Вероятно, самой известной критикой GOTO является письмо Эдсгера Дейкстры 1968 года под названием Go To Statement Considered Harmful.[5] В этом письме Дейкстра утверждал, что неограниченные операторы GOTO должны быть исключены из языков более высокого уровня, поскольку они усложняют задачу анализа и проверки правильности программ (особенно тех, которые включают циклы).

Альтернативная точка зрения представлена в книге Дональда Кнута" Структурированное программирование с переходами к утверждениям"[6], в которой анализируется множество распространенных задач программирования и выясняется, что в некоторых из них GOTO является оптимальной языковой конструкцией.

Причина обращения: