'조건부 분기 - '고투' 클루게? - 페이지 2

 
RaptorUK :
나는 BBC Basic 시절에 GOTO를 사용했습니다. . . 나는 심지어 약 7년 동안 정규직으로 BBC BASIC을 사용했습니다. . . BBC Basic에도 GOSUB 및 RETURN이 있으므로 서브루틴(함수)을 사용할 수 있습니다. . . 왜 MQL4에서 GOTo와 유사한 것을 사용하고 싶습니까? 아마도 당신은 당신의 필요를 설명할 수 있습니까?

안녕하세요 랩터님

당신이 스스로 말했듯이 당신은 그러한 것들을 몇 년 동안 스스로 사용했기 때문에 매우 편리하게 활용할 수있는 무수한 상황을 알고 있습니다. 'GoSub' 기능과 'Return' 기능 은 기본적으로 제가 말하는 'GoTO'와 같은 개념입니다. GoSub/RETURN 함수를 사용하더라도 호출 프로그램의 동일한 지점으로 돌아가야 합니다. 매우 엉망인 악몽을 만들 수 있는 'GoTo'와 달리. MQL의 Include, Library 및 .dll 파일 활용도는 이와 비슷하다고 생각합니다. 그러나 이것은 GoSub/RETURN 등으로 얻을 수 있는 종류의 제어를 허용하지 않습니다.

컴퓨터 가공을 위한 프로그래밍의 많은 반복에는 GoSub/RETURN 쌍도 포함되어 있으며 해당 환경에서 상당히 유용합니다. 높은 수준의 모듈화 및 수많은 표준 '고정 사이클'과 사용자 정의 및 특수 기능을 수많은 프로그램에서 반복해서 재사용할 수 있습니다. 바퀴가 필요할 때마다 계속해서 바퀴를 '재발명'할 필요가 없습니다. 내가 계약 컴퓨터 가공 프로그래밍을 시작했을 때 나는 2,000개 이상의 서로 다른 CNC 컨트롤러에 직면했습니다. 모두 프로그래밍에서 고유한 변형이 있습니다. )< 8) 이로 인해 매우 비싼 CAD-CAM 소프트웨어를 사용해야 했습니다. 나는 종종 소프트웨어가 생성하는 것보다 더 나은 도구 마모와 더 적은 주기 시간으로 더 나은 결과를 생성하는 훨씬 더 좋고 더 효율적인 것을 스스로 작성할 수 있었습니다.

 

GOSUB/RETURN은 MQL4에서 함수 를 사용하는 것과 동일합니다.

나는 몇 년 전에 약간의 CNC 프로그래밍을 했습니다. . . AeroSpace는 주로 일합니다.

 
FourX :

나는 C가 그것을 할 수 있다고 생각하지 않습니까?

네, 그렇습니다. K&R 2판 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' 기능이 없는 거의 모든 '기능'입니다. 귀하가 '동의하는' 것은 무엇이며 이 검색의 맥락에서 무엇을 의미하고 언급하고 있습니까? 확장하고 설명하십시오. 논쟁적이지 않습니다. 뭔가 염두에 두신 것 같으며 그것이 무엇인지, 그리고 그것이 우리에게 어떻게 도움이 될 수 있는지 알고 싶습니다.


안녕하세요 FourX 저는 이전 게시물을 잘못 읽었습니다. 누군가가 이미 내 말의 의미는 함수 호출이 GoTo의 아이디어를 대체하고 작업성을 향상시키는 것이라고 생각했습니다. 그것은 GoTo를 따르기 위한 것이며, dabbler가 그의 예에서 보여주듯이 스위치를 사용하는 multiway branching은 다중 GoTo와 동일한 것을 달성할 수 있습니다.

 
dabbler :

우리가 여기에서 에뮬레이션하려고 하는 것은

이렇게 할 수 있는 것은 ...

그러나 특히 많은 레이블의 경우 매우 우아하지는 않습니다. 더 나은 방법은

그러나 실제로 switch 문에 함수 호출을 넣어야 합니다. 그렇지 않으면 스위치 가 코드의 여러 페이지를 넘어가면 코드의 구조를 볼 수 없습니다.


안녕하세요 Dabbler님

진정한 'GoTo' 문/함수를 사용하면 다음(몇 개의) 식/문을 건너뛸 뿐만 아니라 프로그램 내의 모든 위치로 이동할 수 있습니다. 이를 통해 프로그램에서 둘 이상의 인스턴스에 필요한 동일한 기능 을 다시 사용하는 등의 작업을 수행할 수 있습니다.

따라서 유연성과 편의성이 모두 있습니다. 내가 언급했듯이 이것은 문제에 빠지기 쉽고 악몽 같은 프로그램을 만들 수 있기 때문에 양날의 검입니다.

MQL5에는 'GoSub/RETURN', 'GoTo' 등과 같은 것이 있습니까? Visual Basic, Java, PHP 등은 어떻습니까?

 
RaptorUK :

GOSUB/RETURN은 MQL4에서 함수를 사용하는 것과 동일합니다.

나는 몇 년 전에 약간의 CNC 프로그래밍을 했습니다. . . AeroSpace는 주로 일합니다.

내가 지금까지 Raptor를 알아낼 수 있었던 한, 그것들은 GoSub / Return 명령이나 MQL4에서 그러한 기능 을 만드는 능력과 같은 것이 아닙니다. 따라서 이 용량을 수행하기 위해 MQL4에서 klug를 알아내려고 합니다.

 
dabbler :

우리가 여기에서 에뮬레이션하려고 하는 것은

이렇게 할 수 있는 것은 ...

그러나 특히 많은 레이블의 경우 매우 우아하지는 않습니다. 더 나은 방법은

그러나 실제로 switch 문에 함수 호출을 넣어야 합니다. 그렇지 않으면 스위치 가 코드의 여러 페이지를 넘어가면 코드의 구조를 볼 수 없습니다.

MQL4 참조 - 기본 - MQL4의 구문 은 일부 기능을 제외하고는 C와 유사한 구문입니다.

  • 주소 산술 없음;

  • 연산자가 없습니다 ... 동안;

  • 연산자 없음 goto ...;

  • [조건]의 연산이 없습니까?[식 1]:[식 2];

  • 복합 데이터 유형(구조)이 없습니다.

  • 복잡한 할당은 불가능합니다. 예를 들어, val1=val2=0; arr[i++]=발; cond=(cnt=주문 총계)>0; 등.;

  • 논리 표현식의 계산은 항상 완료되며 조기 종료되지 않습니다.

 

안녕하세요 1withZachy입니다.

본질적으로 이것은 실제로 표준 또는 사용자 정의 기능을 사용한 다음 MQL4가 수행하는 것처럼 결과를 기능에 '반환'하는 것이 MQL4 SOP인 것 같습니다. 흐름도에서는 내가 놓치고 있는 미묘한 차이일 수 있지만 그렇게 생각하지 않습니다. 아아, 제공된 샘플 코드 내의 문서: 'CallFuntion.mq4'는 내가 전혀 이해할 수 없는 러시아어로 되어 있습니다.

 

Wikipedia의 GoTo 에 대한 흥미로운 기사에서 일부 발췌:

많은 언어가 goto 문을 지원하지만 많은 언어는 지원하지 않습니다. Java 에서 goto는 예약어 이지만 사용할 수 없습니다. [ 1 ] [ 2 ] PHP 에서는 버전 5.3까지 goto에 대한 기본 지원이 없었습니다(라이브러리는 기능을 에뮬레이트할 수 있음). [ 3 ]

구조화된 프로그램 정리 는 goto 문이 프로그램을 작성하는 데 필요하지 않다는 것을 증명했습니다. 순서, 선택/선택, 반복/반복의 세 가지 프로그래밍 구성의 일부 조합은 튜링 기계 가 수행할 수 있는 모든 계산에 충분합니다.

1960년대와 1970년대에는 컴퓨터 과학자들이 " 구조화된 프로그래밍 " 패러다임 에 찬성하여 GOTO 문에서 멀어지는 것을 보았습니다. 일부 [ 어? ] 프로그래밍 스타일 코딩 표준은 특히 앞서 언급한 구조화된 프로그램 정리의 관점에서 GOTO 문 사용을 금지합니다. Böhm-Jacopini 증명 은 소프트웨어 개발을 위해 구조화된 프로그래밍을 채택할지 여부에 대한 질문을 해결하지 못했습니다. 부분적으로는 구성이 프로그램을 개선하기보다 모호하게 만들 가능성이 더 높기 때문이었습니다.

아마도 GOTO에 대한 가장 유명한 비판은 1968년에 Edsger Dijkstra 가 작성한 Go To Statement 간주된 유해한 편지일 것입니다. [ 5 ] 그 편지에서 Dijkstra는 제한 없는 GOTO 문은 프로그램(특히 루프와 관련된 것)의 정확성을 분석하고 확인하는 작업을 복잡하게 만들기 때문에 고급 언어에서 폐지되어야 한다고 주장했습니다.

여러 가지 일반적인 프로그래밍 작업을 분석하고 그 중 일부에서 GOTO가 사용하기에 최적의 언어 구성 임을 발견하는 Donald Knuth구조적 프로그래밍에서 go to Statements [ 6 ] 에 대안적인 관점이 제시되어 있습니다.