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

 
FourX:

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

Функция делает то же самое, что и GOSUB/RETURN ....

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

Функция делает то же самое, что и GOSUB/RETURN....

Я понимаю, что бесчисленные стандартные и пользовательские функции могут быть "вызваны" и использованы в любом (соответствующем) месте Raptor, но в MQL4 нет ничего подобного GoSub и/или GoTo в любом конкретном месте программы, например, GoTo строка 185 или конкретная метка/функция и т.д., как вы сами описали. Затем запустить ее и вернуться к тому месту в программе, из которого она была вызвана; или, возможно, продолжить работу из вызванной подпрограммы и/или раздела программы/функции в зависимости от условного результата этой подпрограммы. Как вы заявили, вы сами использовали GoSub в течение многих лет, и сделать условный переход через пару последовательных строк кода - совсем не одно и то же. Я не хочу продолжать обсуждать это различие, которое, как мы уже знаем, совсем не выполняет ту же функцию. Таким образом, это сообщение. Мы все еще не выяснили, как использовать настоящий "GoSub", который, как пример, может переходить к более раннему месту в программе и повторно использовать ту же самую необходимую функцию, уже установленную в программе, вместо того, чтобы вводить ее в код каждый раз, когда она нужна.

К вашему сведению: MetaEditor падает примерно в 85% случаев, когда я копирую в нем текст. Это происходит на МНОГИХ различных экземплярах MT4, на множестве различных компьютеров и на 3 различных версиях windows. Не включая 32 и 64 битные системы, на которых я использовал MQL4. MT4 в порядке, а редактор MQL4 - нет. Поэтому копирование и вставка для меня не совсем рабочий вариант. Даже если это и так, это все равно не дает тех же возможностей, что и 'GoSub' или GoTo'.

 

Есть ли в этом смысл? Это факт, что mql4 - это mql4, поэтому, когда вы кодите на mql4, вы должны думать на mql4. Нет смысла пытаться кодить на одном языке, думая о том, как бы вы решили эту проблему на другом, который поддерживает другие конструкции. Если у вас есть проблема кодирования в mql4, которая, по вашему мнению, может быть решена только с помощью GoSub/Return и GoTo, я хотел бы увидеть ее, потому что я думаю, что вы обнаружите, что всегда есть более чем один способ снять шкуру с кота.

 

FourX:

Даже если это так, это все равно не дает тех же возможностей, что и 'GoSub' или GoTo'.

Извините, но мне очень трудно понять вашу точку зрения, что функция MQL4 и GOSUB чем-то отличаются. (Goto - это совсем другая рыба.)

Давайте просто придерживаться этого Gosub. Функция MQL4 - это подпрограмма. Она может возвращать или не возвращать значение. Все вызовы подпрограмм возвращаются на следующую строку основного кода, откуда они были вызваны. В этом я на 100% согласен с Raptor.

(Я также согласен с точкой зрения SDC выше).

 

Смысл темы в том, чтобы узнать, можно ли сделать условное ветвление в ЛЮБОЕ место внутри программы или даже из других программ, чтобы повторно использовать программные модули/функции, такие как предусмотрены в других средах, например, в тех, которые были указаны ранее: fGoTo, fGoSub. Я уже знаю, что в MQL4 это напрямую не предусмотрено. В этом и заключается смысл данной темы: возможно ли сделать "обходной путь (подпрограмму?)" и т.д. для реализации этой функциональности? Концептуально это также имеет сходство с файлами 'include' в MQL4.

Аналогично обходному пути, который мы все используем для компенсации ограниченных возможностей отладчика MQL4 путем "оповещения" или "печати" значений функции GetLastError().

Это совсем не похоже на обычные функции MQL4, которые содержат ряд условных булевых функций, таких как if, while, loop, continue, return и т.д., которые могут пропускать вперед или возвращаться назад внутри функции, в том обходном пути, который я пытаюсь предоставить для возможностей, подобных примерам из других сред, где можно повторно использовать любой программный модуль / функцию многократно, часто из (гораздо) более ранней части программы. Объявите его один раз: используйте его многократно, по большей части в любом другом месте программы, где нужна функциональность, уже предусмотрена. fGoSub в некоторых средах позволяет пользователям импортировать и использовать такие другие fSubRoutines, часто из отдельных небольших программ, которые являются модулями, выполняющими определенную функцию. Возможно, это несколько похоже на файлы 'Include' в MQL4.

Если сейчас этого нет, значит ли это, что мы не должны использовать эту мощную функциональность программирования, если мы можем создать "обходной путь" для нее?

Как мы все знаем, существует множество способов запрограммировать что-то, чтобы получить один и тот же результат. Это не случай "Покажи мне свою проблему, и я скажу тебе, как ее решить без fGoTo и fGoSub". Это случай: ЕСЛИ мы можем создать функциональность, то у нас появляется дополнительная гибкость и возможности программирования, которые мы можем использовать по-разному в разных ситуациях.

 

Я не думаю, что вы понимаете, что такое пользовательская функция в mql4 ... возможно, вы можете привести пример того, почему пользовательская функция mql4 не делает именно то, что вы описываете? Я думаю, что делает... У меня есть множество функций, которые я повторно использую во многих других советниках, индикаторах и скриптах.

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

 

FourX:

Суть темы в том, чтобы выяснить, возможно ли сделать условное ветвление в ЛЮБОЕ место внутри программы или даже из других программ, чтобы повторно использовать программные модули/функции многократно, как это предусмотрено в других средах, таких как указанные ранее: fGoTo, fGoSub.

Я стремлюсь обеспечить возможности, подобные приведенным примерам из других сред, где можно повторно использовать любой программный модуль / функцию многократно, часто из (гораздо) более ранней части программы.

Mql4 - язык старого стиля, его уровень - примерно 1990 год. Но ваши goto и gosub - еще более старые конструкции, примерно 1970 года. Какой смысл делать свой стиль программирования более старым, чем mql4? Гораздо лучше использовать настоящий язык программирования, например C#, через dll-s. Большинство изобретений 1990-х и 2000-х годов (такие как класс, интерфейс, объект, паттерны проектирования, такие как событие и слушатель, методы программирования, такие как программирование на основе тестов и т.д.) предназначены для предотвращения повторения кода и помогают вам быстро писать многократно используемые, надежные и читаемые коды. Я думаю, что вам следует забыть обо всем этом проекте goto.
 
FourX:

Я понимаю, что бесчисленные стандартные и пользовательские функции могут быть "вызваны" и использованы в любом (подходящем) месте Raptor, но в MQL4 нет ничего похожего на GoSub и/или GoTo любого конкретного места в программе, например, GoTo строки 185 или конкретной метки/функции и т.д., как вы сами описали. Затем запустите ее и вернитесь в то место в программе, из которого она была вызвана;

Возврат внутри функции заставит ее вернуться в то место, откуда она была вызвана. Это 100% замена старого gosub/return. Кроме того, функция позволяет передавать значения и возвращать значения, у них даже есть собственное пространство имен и стековая рамка, так что больше не нужно возиться с глобальными переменными. Я действительно не понимаю вашей проблемы. Пожалуйста, приведите конкретный пример (возможно, в псевдокоде или BASIC) того, что вы хотите сделать, и мы могли бы показать вам, как тот же пример был бы сделан гораздо более ясным и более многократно используемым и удобным для обслуживания способом с помощью if/else, switch/case и вызовов функций.

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

Вы можете иметь несколько операторов возврата в одной и той же функции, и вы также можете выходить из циклов с помощью break, это самое близкое, что вы можете получить от GOTO в структурированном языке, и эти вещи (множественные выходы) уже не одобряются некоторыми строгими пуристами.

 
erzo:
Гораздо лучше использовать настоящий язык программирования, такой как C#, через dll-ки.

C# не рекомендуется для создания DLL, которые взаимодействуют с этим плоским низкоуровневым API соглашений вызова C. C# идеально подходит, если вы хотите взаимодействовать с другими C# и различными материалами microsoft, но он не настолько универсален, как другие среды. Он очень специализированный.

Если вы хотите создавать DLL, которые легко взаимодействуют с соглашениями C-вызовов в современном языке программирования, то я предлагаю ObjectPascal (Free Pascal) или Delphi.

 
7bit:

C# не рекомендуется для создания DLL, которые взаимодействуют с этим плоским низкоуровневым API конвенции вызова C.

Я знаю java лучше, и думал использовать, но трудно сделать мост. Но если вы не рекомендуете C#, что я думал, что это будет проще, я попробую java, однако. (Паскаль - не мой стиль.) Спасибо за совет!