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

 

Java는 또한 가상 머신 외부에서 실행되지 않으며 동일한 문제가 발생하며 C 프로그램에서 로드 및 호출할 수 있는 dll을 만들 수 없습니다.

C#을 좋아한다면 ObjectPascal도 좋아할 것입니다(유형 안전성, 엄격함, VM에 대한 것을 제외하고 그 뒤에 숨겨진 전체 철학). 결국 C#의 디자이너이자 수석 설계자는 Turbo-Pascal과 Delphi(ObjectPascal)를 만든 사람과 같은 사람이며 빛을 발합니다. 어떤 면에서 C#은 (추악하지만 요즘은 유행하는) C 구문을 사용하는 ObjectPascal과 비슷합니다.

기계 및 C-API(MetaTrader에 필요한 것처럼)와 직접 인터페이스하고 여전히 C#만큼 강력한 언어를 사용하는 경우 ObjectPascal에 대한 대안이 많지 않습니다. 어떤 사람들은 C++가 동등하게 강력하다고(물론 OP 대신 사용할 수도 있음) 말하지만 분명히 그렇게 우아하지 않고 불일치가 많으며 오류가 발생하기 쉬우므로 진정한 전문가만이 진정으로 마스터할 수 있습니다.

 
7bit :

.... 함수 내부에서 반환하면 함수가 호출된 곳으로 반환됩니다.

이것은 7bit의 결정적인 구별입니다. 저는 완전히 다른 기능, 서브루틴 또는 가져온 코드, 전체 서브루틴 및/또는 전체 현재 기능 외부의 기능을 호출하는 것에 대해 이야기하고 있습니다. 개념적 예:

저는 100행에서 20행까지 발생하는 함수에 있지만 이 범위를 벗어나는 것을 호출하고 싶습니다. 아마도 50-60행에 있는 완전히 다른 기능일 것입니다. <=-이것은 내가 묻는 매개변수와 위 의 예에 맞지 않습니다. 이전 gosub/return을 100% 대체하며 추가로 기능을 허용합니다. 값을 전달하고 값을 반환합니다.

동일한 함수 내에서 여러 개의 return 문을 가질 수 있으며 break ....를 사용하여 루프를 벗어날 수도 있습니다.

이해했다

그러나 나는 내가 이해 하는 특정 기능의 범위 내에서 어떻게 이동할 수 있는지에 대해 계속 듣고 있습니다. 그러나 이것은 내가 전혀 묻지 않고 이 모든 것의 시작 부분에서 언급한 것이 아닙니다 .

'예외'에 관해서는 원하는 경우 예외라고 부를 수 있습니다. 내가 말했듯이, MQL4 내에서 직접 함수로 존재하지 않는 GoTo, GoSub(CURRENT 함수 외부) 등과 같은 함수의 기능을 추가하고 활용하기 위해 '해결책'을 찾으려고 노력하고 있습니다. 귀하의 응답으로 대부분의 귀하는 이러한 프로그래밍 차이점을 알고 이해하지만 실제 질문에 대한 답변은 하지 않습니다.

 

FourX :

저는 100행에서 20행까지 발생하는 함수에 있지만 이 범위를 벗어나는 것을 호출하고 싶습니다. 아마도 50~60행에 있는 완전히 다른 기능일 것입니다.
50 - 60행의 코드를 포함하는 별도의 함수 를 만든 다음 언제든지 다른 함수에서 호출할 수 있습니다.
 

이걸 고려하세요:

 void foo(){
   int x;
   int y;
  y = 33 ;
  x = 42 ;
  .LABELFOO
  print(x);
   return ;
}

void bar(){
   int x;
  z = 5 ;
  GOTO .LABELFOO
}

void main(){ //<-- program starts here
  foo();
  bar();
}

이제 어떻게 될까요? main()부터 시작하겠습니다. 실행 중 모든 단계를 설명하겠습니다(주석은 녹색 , 지침은 검정색 ).

  • (우리는 main()의 첫 번째 줄에 있습니다)
  • 반환 주소를 스택에 푸시합니다(4바이트 필요). 이것은 foo()에 대한 호출이 끝나면 계속될 주소입니다(나중에 어디로 돌아갈지 알 수 있도록 이 주소를 기억해야 합니다)
  • foo()의 첫 번째 줄로 점프
  • 로컬 변수 x를 위한 공간을 만들기 위해 스택에 4바이트 푸시
  • 로컬 변수 y를 위한 공간을 만들기 위해 스택에 4바이트를 푸시합니다.
  • (우리 스택은 이제 12바이트 높이입니다)
  • 긴 값 33을 바이트 0,1,2,3에 씁니다(스택 맨 위에서 계산).
  • 긴 값 42를 바이트 4,5,6,7에 씁니다(스택 맨 위에서 계산).
  • 4,5,6,7 바이트에서 찾은 긴 값을 인쇄합니다(스택의 맨 위에서 계산됨).
  • 스택에서 4바이트를 꺼내고 잊어버리십시오(y는 범위를 벗어남).
  • 스택에서 4바이트를 꺼내서 잊어버립니다(x가 범위를 벗어남).
  • 스택에서 4바이트 팝, 이것은 이제 반환 주소인 foo()를 호출할 때 온 주소이며 이 주소로 점프
  • (이제 우리는 다음 줄, bar()가 있는 줄에서 main()으로 돌아갑니다)
  • 반환 주소(4바이트)를 스택에 푸시
  • bar()의 첫 번째 줄로 점프
  • 스택에 4바이트(로컬 변수 x) 푸시
  • (우리 스택은 이제 8바이트 높이입니다)
  • 긴 값 5를 바이트 0,1,2,3에 씁니다(스택 맨 위에서 계산).
  • 레이블 .LABELFOO로 이동
  • (이제 여기에서 모든 것이 어떻게 끔찍하게 잘못되는지 주의 깊게 관찰하십시오. 위에서 설명했기 때문에 다음 행이 모두 무엇을 할 것인지 이미 알고 있습니다. 그들은 이전에 했던 것과 똑같은 일을 하고, 모두 마치 맨 위에 있는 것처럼 행동합니다. 12바이트의 스택을 마음대로 사용할 수 있지만 이번에는 스택이 8바이트뿐입니다! 다음 줄은 스택 맨 위에서 4,5,6,7 위치에 있는 변수를 예상합니다. 이제 무슨 일이 일어나는지 봅시다. 인쇄가 있는 선)
  • 4,5,6,7 바이트에서 찾은 긴 값을 인쇄합니다(스택의 맨 위에서 계산됨).
  • (oops? 이것은 우리의 x가 아닙니다. 이것은 반환 값입니다. 이번에는 스택 높이가 8바이트에 불과하며, 총 무의미한 숫자를 인쇄합니다)
  • 스택에서 4바이트를 팝하고 잊어버리십시오(이것은 "y가 범위를 벗어남"이지만 y가 아니라 실제로 다른 함수의 x임).
  • 스택에서 4바이트를 팝하고 잊어버리십시오(이것은 "x가 범위를 벗어남"이지만 x가 아니라 반환 주소를 버린 것입니다!)
  • (스택은 이제 비어 있습니다!)
  • 반환 주소를 얻기 위해 스택에서 4바이트를 팝 -> 크래시!

당신은 그것을 볼 수 있습니까? foo 함수는 8바이트와 반환 주소의 로컬 스택 프레임이 필요하고 bar 함수 는 4바이트와 반환 주소만 필요합니다. 그들의 return 문은 컴파일 시간에 이미 컴파일러에 의해 내장되어 있으며 스택에서 다른 양의 바이트를 팝합니다. 하나의 return을 사용하여 다른 작업을 수행할 수 없으며 각각은 컴파일된 기능에 대해서만 작동합니다.

전체 프로그램에 걸쳐 GOTO가 있었던 이 오래된 언어에는 지역 변수 범위가 없었고 올바르게 처리해야 하는 유일한 것은 GOSUB 및 RETURN의 수를 동일하게 일치시키는 것뿐이었습니다. , 모든 반환은 정확히 동일하게 작동했습니다. 그러나 이제 우리는 서로 다른 크기의 "GOSUB"(각각 다른 금액을 스택에 밀어넣음)와 스택에서 다른 양을 터뜨리는 다양한 리턴을 갖게 되었습니다. 그리고 스택에 지역 변수가 있습니다. 이것은 컴파일러에 빌드하려고 시도하는 미친 짓에 상관없이 작동하지 않습니다.

*같은* 함수 내에서 이론적으로 GOTO로 이동할 수 있지만(일부 언어에서는 이를 허용함) 실제로 구조화된 적절한 프로그래밍보다 더 우아하고 이해하기 쉽고 유지 관리하기 쉬운 코드로 이어지는 코드 한 조각을 보여줄 수는 없습니다. 그것이 할 일은 끔찍한 혼란을 일으키는 것뿐입니다. 아무도 이것을 필요로 하지 않으므로 구현되지 않습니다.

 

우리 모두는 MQL4에 GoTo 또는 ' GoSub -=> ReturnFromGoSub '와 같은 기본 기능이 없다는 것을 이미 알고 있습니다. 이에 대해서는 이견이 없습니다. 이것은 이제 MQL4에 이러한 기본 기능이 없다는 사실에 대한 반복적인 설명과 예가 되었습니다. 거기에는 논쟁이 없습니다. 이것은 이 스레드에 관한 것이 아니며 결코 그렇지도 않습니다. 그러니 우리가 이미 알고 있고 동의하는 것에 대해 논쟁을 그만 둘 수 있습니까?

우리는 이것이 다른 프로그래밍 언어에서 유효한 함수이며 매우 유용할 수 있다는 것을 알고 있습니다.

이것의 요점은 MQL4에서 사용할 수 있는 것으로 시뮬레이션하고 활용할 수 있는지 알아보는 것입니다.

예를 들어, ' GoSub -=> ReturnFromGoSub ' 의 첫 번째 문장에서 두 번째 경우의 유효한 함수 완료는 다음과 같습니다. GoSub가 호출된 프로그램의 지점 으로 돌아가고 GoSub의 값을 프로그램.

 
FourX :

예를 들어, ' GoSub -=> ReturnFromGoSub ' 의 첫 번째 문장에서 두 번째 경우의 유효한 함수 완료는 다음과 같습니다. GoSub가 호출된 프로그램의 지점으로 돌아가고 GoSub의 값을 프로그램.


당신은 당신이 설명하는 것이 Custom Function 이라는 말을 반복해서 들었습니다. . . 그걸 왜 못 받아? 왜 Custom Function != Gosub + Return 인지에 대한 예를 의사 코드와 함께 제공하십시오.
 

FourX :

' GoSub -=> ReturnFromGoSub ' 는 GoSub가 호출된 프로그램 지점으로 돌아가고 GoSub에서 프로그램의 호출 지점으로 값을 반환합니다.

 double subtract_two_numbers( double a, double b){
  Print( "will now calculate " , a, " minus " , b);
   return (a - b);                                 // <---- THIS IS YOUR RETURN
}

int start(){                                     // <---- PROGRAM STARTS HERE
  double s;
   double d;

  s = subtract_two_numbers(Ask, Bid);            // <---- THIS IS YOUR GOSUB
  d = subtract_two_numbers(Close[ 0 ], Open[ 0 ]);   // <---- THIS IS YOUR GOSUB

  Print( "the spread is " , s);
  Print( "price moved " , d, " since the open" );
}                                                // <---- PROGRAM ENDS HERE
거기에는 Commodore-BASIC 또는 지속적으로 비교하려고 하는 다른 고대 및 장애 언어에서는 가능하지 않은 인수 및 반환 값을 전달하더라도 mql4 언어에 바로 내장된 GOSUB 및 RETURN 이 있습니다. 지난 30년 동안 당신은 어디에 있었습니까?
 

mql4를 배우고 있는 동안 아직 마음이 BBC Basic에 있다면 FourX는 defproc과 proc을 생각하고 GoTo와 GoSub는 잊어버리십시오.

나는 80년대 초에 BBC 마이크로를 가지고 있었다.

 
SDC :

mql4를 배우고 있는 동안 아직 마음이 BBC Basic에 있다면 FourX는 defproc과 proc을 생각하고 GoTo와 GoSub는 잊어버리십시오.

나는 80년대 초에 BBC 마이크로를 가지고 있었다.

ㅋㅋㅋ . . . 나는 Acorn Electron을 가지고 있었다. . . 더울 때는 추울 때 썼던 테이프의 내용을 읽지 못했고 그 반대도 마찬가지였습니다. . . 옛날이 좋았지. ;-)
 
RaptorUK :
ㅋㅋㅋ . . . 나는 Acorn Electron을 가지고 있었다. . . 더울 때는 추울 때 썼던 테이프의 내용을 읽지 못했고 그 반대도 마찬가지였습니다. . . 옛날이 좋았지. ;-)

네, 괜찮았던 날들이었어요 :) 옆면을 반복적으로 두드리며 테이프 헤드 옆에 있는 작은 나사에 구부러진 드라이버를 돌리세요 ㅋㅋㅋ