Tarefa de rastreamento (construção de um gráfico de função) - página 2

 
sergeev:
Uma e a mesma função pode ser chamada tanto do início quanto do início. Isto deve ser corrigido.

Eu posso fazer isso com meus dedos, mas você tem que pensar bem ))

assim:

conte o número de funções, deixe ser 4, escreva #define X 4 no cabeçalho do código

assumir que o número máximo de chamadas em um tick é #define Y 100

temos uma matriz de tamanho 4 x 100, inicializar matriz = -1

e agora, ao chamar uma função no ponto de entrada da função, adicione uma chamada do contador (modelador gráfico), que deve adicionar o código (1,2,3 ou 4) à posição X desejada na entrada de nossa matriz na linha livre - quem chamou

Acho que seu problema é mais como gráficos de rede, suspeito que a matriz para gráficos de rede foi desenvolvida há muito tempo - você precisa ir ao Google

SZY: bem, aqui já está a 2ª página do tópico ;)

 

IgorM, a forma como você propõe armazenar gráficos é chamada de "matriz de adjacência". É muito antieconômico para gráficos esparsos (e os programadores devem ser espancados para uma arquitetura "gráfica totalmente conectada", etc.).

É muito melhor usar a lista de bordas (ou seja, armazenamos um conjunto unidimensional de estruturas que consiste em 2 elementos - id de função de chamada e id de função chamada; a estrutura pode ser complementada com campos adicionais - contadores de chamadas, etc.)

p.s. O matapparatus foi realmente desenvolvido há muito tempo :)

 
lea:

IgorM, a forma como você se propõe a armazenar o gráfico é chamada de "matriz adjacente".

Obrigado, pelo menos comecei a me lembrar de algo, já se passaram 15 anos desde que estudei todas essas coisas, que nunca foram usadas na vida real )))) - Mas não esqueça que a "embalagem de dados" (economia de memória) - levará a uma perda de desempenho devido ao aumento da complexidade da matriz, embora eu possa estar errado
 
MetaDriver:
Comprovação de impossibilidade para uma idéia ?
O registro de entradas e saídas de funções é feito facilmente em C++,
há destruidores e algo como desenrolar a pilha.
Embora... para o mesmo C++ há bibliotecas que permitem construir a ordem das chamadas de função para qualquer
ponto em código por pilha.
.
Portanto... cada retorno significa chamadas adicionais :-).
 
lea:
Uma árvore é um caso especial de um gráfico.

Sim, era isso que eu queria dizer. Com base na linearidade do código MQL - será uma árvore em sua forma pura. Uma vez que os nós não apontam um para o outro.

IgorM:
ter uma matriz de dimensão 4 x 100, inicializar a matriz = -1
e agora quando chamamos a função no ponto de entrada da função adicionamos uma chamada do contador (modelador gráfico) que deve adicionar um código (1,2,3 ou 4) na posição X requerida na linha livre na entrada de nossa matriz - quem a chamou

Sim, vejo isso agora. Mas me parece que esta abordagem é realmente trabalhosa, não tanto em código, mas em recursos e preparação para análise. Para a ramificação, você teria que fazer uma matriz tridimensional.
Em geral, a opção é aceita. Mas vamos deixar isso para a página 4 no resumo, por enquanto :)

Eu acho que seu problema é mais como gráficos de rede, eu suspeito que o aparelho matemático para gráficos de rede foi desenvolvido há muito tempo - você precisa ir ao Google

A tarefa não é nem um know-how, nem uma novidade. Apenas um simples gráfico de funções. Nada mais.
Não há nova matemática, apenas precisamos de uma versão simplificada, tanto quanto possível.

 
lea:

É muito melhor usar a lista de borda (ou seja, armazenamos um conjunto unidimensional de estruturas composto por 2 elementos - id de função de chamada e id de função chamada; a estrutura pode ser complementada com campos adicionais - contadores de chamadas, etc.)

Eugene, isto é exatamente o que já foi feito.

Mas o código estagnou. Pelo terceiro dia eu não consigo dormir ou beber.... . :)

Não consigo descobrir como fazer o retorno da borda (mais precisamente o nó descendente) para o nó pai para ir para a nova borda (novo nó descendente). Mas para manter a regra - usamos apenas uma função de rastreamento no início da função do código fonte.

 
sergeev:

Não consigo descobrir como fazer um retorno de uma costela a um nó para ir a um novo ramo.


E todos com apenas uma função que já fez um passe adiante? Isso é suficiente - para fazer um retorno sem fazer nada)) Bem, nada, é a segunda página acabou, logo Vladimir não será capaz de suportar))))
 
alsu:
E todos com apenas uma função que já fez um passe para a frente? Já é suficiente - voltar sem fazer nada)) Bem, nada, é a segunda página já terminou, logo Vladimir não será capaz de suportar))))

Deus esteja com eles, com estas páginas. A tarefa é interessante.

Veja, é assim que você pode.... O recuo para o nó pai já pode ser feito no novo chamado descendente. Ou seja, quando você vai ao descendente, o sistema primeiro descerá a árvore para um nível inferior, e depois subirá para o novo descendente chamado descendente.

Mas nesta versão você não pode fazer ramos com mais de dois de profundidade. Porque o sistema sempre voltará antes de seguir adiante. Ou seja, todas as funções serão desenhadas no mesmo nível.

Portanto, pensa-se que teremos que usar algumas matrizes de variáveis, para identificar a posição atual. para seguir em frente, em vez de retornar. Essa é exatamente a complexidade desse retorno...

 

Na "peça conceitual" do trailer, mais precisamente um exemplo de implementação. no MT 5

As funções In() e Out() precisam ser reescritas para fazê-las funcionar com a lista de chamadas. Agora eles apenas imprimem entradas e saídas na rosca padrão.

Más notícias: Não salvei o sonho do iniciante do tópico de uma função de rastreamento. Desculpe, Sergeyev. :)

Boas notícias: Tudo funciona.

Manual do usuário.

1. A macro "_in" é inserida no início de cada função.

2. Todas as chamadas de retorno são substituídas por "_retorno".

3. Duas definições estão escritas no início do programa

#define _in in(__FUNCTION__);
#define _return out(__FUNÇÃO__); retornar


Isso é tudo.

Arquivos anexados:
rettest.mq5  2 kb
 
sergeev:

Que se lixe estas páginas. É uma tarefa interessante.

Veja, é assim que você pode.... O recuo para o nó pai já pode ser feito no novo chamado descendente. Ou seja, quando você vai ao descendente, o sistema primeiro descerá a árvore para um nível inferior, e depois subirá para o novo descendente chamado descendente.

Mas nesta variante não se pode fazer galhos com mais de duas profundidades. Porque o sistema sempre voltará antes de seguir adiante. Ou seja, todas as funções serão desenhadas no mesmo nível.

Portanto, parece que teremos que usar alguns conjuntos de variáveis, para identificar a posição atual. para ir mais longe e não para retornar. Essa é exatamente a dificuldade desse retorno...

E de onde vem uma tarefa tão estranha? Vale a pena gastar esforços em pesquisas duvidosas, quando você pode simplesmente fazer duas funções - entrada e saída - e não se incomodar?