추적 작업(함수 그래프 작성) - 페이지 2

 
sergeev :
결국 동일한 함수를 startinit 에서 모두 호출할 수 있습니다. 이것은 수정해야 할 사항입니다.

나는 내 손가락에 할 수 있고, 특히 Nuno를 생각할 수 있습니다))

다음과 같이 다소:

함수의 수를 세고 4로 하고 코드 헤더에 #define X 4를 작성합니다.

틱당 최대 호출 수는 #define Y 100이라고 가정합니다.

차원이 4 x 100인 행렬이 있고 행렬 = -1을 초기화합니다.

이제 진입점에서 함수를 호출할 때 함수에 대한 카운터(그래프 셰이퍼) 호출을 추가합니다. 이 호출은 입구에서 원하는 위치에 코드(1,2,3 또는 4)를 추가해야 합니다. 자유 회선 X의 행렬 - 전화를 건 사람

나는 당신의 작업이 네트워크 그래프 와 더 비슷하다고 생각합니다. 네트워크 그래프에 대한 수학적 장치가 오랫동안 개발된 것으로 의심됩니다. Google에 검색해야 합니다.

추신: 글쎄, 그것은 이미 주제의 두 번째 페이지입니다.)

 

IgorM , 그래프 저장을 제안하는 방식을 "인접 행렬"이라고 합니다. 희소 그래프의 경우 매우 비경제적입니다(프로그래머는 "완전히 연결된 그래프" 아키텍처 등을 위해 두들겨 맞아야 함).

에지 목록을 사용하는 것이 훨씬 낫습니다(즉 , 호출 함수 의 id와 호출된 함수의 id라는 2개의 요소로 구성된 구조의 1차원 배열을 저장합니다. 구조는 추가 필드로 보완될 수 있습니다. 카운터 등)

ps. 마타파랏은 정말 오래전에 개발되었어요 :)

 
lea :

IgorM , 그래프 저장을 제안하는 방식을 "인접 행렬"이라고 합니다.

ATP, 적어도 나는 무언가를 기억하기 시작했습니다. 결국이 모든 찌꺼기를 연구 한 후 이미 15 년이 지났습니다. 실제 생활에서는 결코 유용하지 않았습니다)))) -하지만 "데이터 패킹"(메모리 절약)을 잊지 마십시오. 내가 틀릴 수 있지만 수학적 장치의 복잡성을 증가시키기 위해 성능 손실로 이어질 것입니다.
 
MetaDriver :
아이디어 가 불가능하다는 증거는 실패할까요?
함수의 입력 및 출력 로깅은 C++에서 쉽게 수행되며,
소멸자와 스택 해제와 같은 것이 있습니다.
... 동일한 C ++에 대해 임의의 라이브러리가 있지만
스택에 있는 코드의 포인트를 사용하면 함수 호출 순서를 작성할 수 있습니다.
.
그래서 ... 각 반환은 추가 호출을 의미합니다 :-).
 
lea :
트리는 그래프의 특수한 경우입니다.

네. 이것이 그가 의미한 것입니다. MQL 코드의 선형성을 기반으로 순수 트리가 있습니다. 정점이 서로를 가리키지 않기 때문입니다.

이고르M :
차원이 4 x 100인 행렬이 있고 행렬 = -1을 초기화합니다.
이제 진입점에서 함수를 호출할 때 함수에 대한 카운터(그래프 셰이퍼) 호출을 추가합니다. 이 호출은 입구에서 원하는 위치에 코드(1,2,3 또는 4)를 추가해야 합니다. 자유 회선 X의 행렬 - 전화를 건 사람

네. 이제 이해했습니다. 그러나 이 접근 방식은 실제로 노동 집약적이며 코드가 아니라 리소스 및 분석 준비에 필요한 것 같습니다. 분기를 위해서는 3차원 행렬을 만들어야 합니다.
일반적으로 옵션이 허용됩니다. 하지만 지금은 요약에 최대 4페이지로 남겨두도록 할게요 :)

나는 당신의 작업이 네트워크 그래프 와 더 비슷하다고 생각합니다. 네트워크 그래프에 대한 수학적 장치가 오랫동안 개발된 것으로 의심됩니다. Google에 검색해야 합니다.

과제는 노하우도 혁신도 아닙니다. 함수 그래프의 일반적인 구성입니다. 더 이상은 없어.
새로운 matapparat은 없으며 최소한의 단순화된 버전만 있으면 됩니다.

 
lea :

에지 목록을 사용하는 것이 훨씬 낫습니다(즉, 호출 함수의 id와 호출된 함수의 id라는 2개의 요소로 구성된 구조의 1차원 배열을 저장합니다. 구조는 추가 필드로 보완될 수 있습니다. 카운터 등)

유진, 이것이 바로 이미 한 일입니다.

그러나 스토퍼가 발생했습니다. 삼일째는 잠도 안자고 술도 마시지 않고....:)

새 에지(새 자식 노드)로 이동하기 위해 에지(더 정확하게는 자식 노드)에서 부모 노드로 돌아가는 방법을 알 수 없습니다. 그러나 규칙을 준수하기 위해 소스 코드 기능의 시작 부분에 하나의 추적 기능만 사용합니다.

 
sergeev :

새 분기로 전환하기 위해 에지에서 노드로 돌아가는 방법을 알 수 없습니다.


그리고 이미 전달된 단 하나의 기능으로 모든 것이 가능합니까? 그것으로 충분합니다-아무것도하지 않고 돌아 가기)) 글쎄, 아무것도, 두 번째 페이지가 끝났습니다. 곧 블라디미르 가 그것을 참지 않을 것입니다)))
 
alsu :
그리고 이미 전달된 단 하나의 기능으로 모든 것이 가능합니까? 그것으로 충분합니다-아무것도하지 않고 돌아 가기)) 글쎄, 아무것도, 두 번째 페이지가 끝났습니다. 곧 블라디미르 가 그것을 참지 않을 것입니다)))

신이 이 페이지들과 함께 그들과 함께 하길. 과제는 흥미롭다.

알다시피, 여기 당신이 할 수 있는 방법이 있습니다. 부모 노드로의 롤백은 자식에 대한 새로운 호출에서 이미 수행될 수 있습니다. 즉, 하위 항목으로 전환할 때 시스템은 먼저 트리를 더 낮은 수준으로 내려간 다음 새로 호출되는 하위 항목으로 올라갑니다.

그러나 이 옵션에서는 깊이가 2 이상인 가지를 만들 수 없습니다. 시스템은 항상 앞으로 가기 전에 뒤로 돌아가기 때문입니다. 즉, 모든 기능이 같은 수준으로 그려집니다.

따라서 현재 위치를 식별하기 위해 일부 변수 배열을 사용해야 할 것 같습니다. 돌아오지 않고 나아가는 것. 복잡성이 ...

 

예고편에는 "개념적 공백" 또는 오히려 구현 예가 있습니다. MT5에서

이를 염두에 두려면 호출 목록과 함께 작동하도록 in() 및 out() 함수를 다시 작성해야 합니다. 이제 그들은 어리석게도 표준 스트림에 입력과 출력을 인쇄합니다.

나쁜 소식: 단일 추적 기능에 대한 topicstarter의 꿈을 저장하지 않았습니다. 죄송합니다 세르게예프. :)

좋은 소식: 모든 것이 작동합니다.

사용자 설명서.

1. 각 기능의 시작 부분에 매크로 "_in"이 삽입됩니다.

2. 모든 반환 호출은 "_return"으로 대체됩니다.

3. 프로그램 시작 시 두 개의 정의가 작성됩니다.

#define _in( __FUNCTION__ );
#define _return out(__FUNCTION__);반환


섭스노의 모든 것.

파일:
rettest.mq5  2 kb
 
sergeev :

신이 이 페이지들과 함께 그들과 함께 하길. 과제는 흥미롭다.

알다시피, 여기 당신이 할 수 있는 방법이 있습니다. 부모 노드로의 롤백은 자식에 대한 새로운 호출에서 이미 수행될 수 있습니다. 즉, 하위 항목으로 전환할 때 시스템은 먼저 트리를 더 낮은 수준으로 내려간 다음 새로 호출되는 하위 항목으로 올라갑니다.

그러나 이 옵션에서는 깊이가 2 이상인 가지를 만들 수 없습니다. 시스템은 항상 앞으로 가기 전에 뒤로 돌아가기 때문입니다. 즉, 모든 기능이 같은 수준으로 그려집니다.

따라서 현재 위치를 식별하기 위해 일부 변수 배열을 사용해야 할 것 같습니다. 돌아오지 않고 나아가는 것. 복잡성이 ...

그리고 그러한 이상한 작업은 어디에서 오는 것입니까? 증기 목욕을하지 않고 입장 및 퇴장을위한 두 가지 기능을 단순히 만들 수 있다면 모호한 연구에 노력을 기울일 가치가 있습니까?