Tarea de trazado (construcción de un gráfico de funciones) - página 2

 
sergeev:
Una misma función puede ser llamada tanto desde start como desde init. Esto debería arreglarse.

Puedo hacerlo con los dedos, pero hay que pensarlo bien))

así:

cuente el número de funciones, que sea 4, escriba #define X 4 en la cabecera del código

suponer que el número máximo de llamadas en un tick es #define Y 100

tenemos una matriz de tamaño 4 x 100, inicializamos la matriz = -1

y ahora, cuando se llama a una función en el punto de entrada de la función, añadir una llamada del contador (formador de gráficos), que debe añadir código (1,2,3 o 4) a la posición deseada X en la entrada en nuestra matriz en la línea libre - que llamó a

Creo que tu problema se parece más a los gra fos de red, sospecho que la matriz para los grafos de red se ha desarrollado hace tiempo - tienes que buscar en Google

SZY: bueno, aquí ya está la 2ª página del tema ;)

 

IgorM, la forma que propones para almacenar el grafo se llama "matriz de adyacencia". Es muy poco económico para los grafos dispersos (y los programadores deberían recibir una paliza por la arquitectura de "grafo completo conectado", etc.).

Es mucho mejor utilizar la lista de bordes (es decir, almacenamos una matriz unidimensional de estructuras que consisten en 2 elementos - id de la función que llama e id de la función llamada; la estructura se puede complementar con campos adicionales - contadores de llamadas, etc.)

p.d. El matapartes se ha desarrollado realmente hace mucho tiempo :)

 
lea:

IgorM, la forma que propones para almacenar el grafo se llama "matriz de adyacencia".

Gracias, al menos he empezado a recordar algo, hace 15 años que estudié todo esto, que nunca se utilizó en la vida real )))) - Pero no hay que olvidar que "empaquetar datos" (ahorro de memoria) - conducirá a una pérdida de rendimiento debido a la mayor complejidad de la matriz, aunque puedo estar equivocado
 
MetaDriver:
¿Prueba de la imposibilidad de una idea ?
El registro de las entradas y salidas de las funciones es fácil de hacer en C++,
hay destructores y algo así como el desenrollado de la pila.
Aunque... para el mismo C++ existen librerías que permiten construir el orden de las llamadas a funciones para cualquier punto del código
por pila.
.
Así que... cada vuelta significa llamadas adicionales :-).
 
lea:
Un árbol es un caso especial de un gráfico.

Sí, eso es lo que quería decir. Basado en la linealidad del código MQL - será un árbol en su forma pura. Ya que los nodos no se señalan entre sí.

IgorM:
tener una matriz de dimensión 4 x 100, inicializar la matriz = -1
y ahora al llamar a la función en el punto de entrada de la función añadimos una llamada del contador (graficador) que debe añadir un código (1,2,3 o 4) en la posición X requerida a la fila libre en la entrada en nuestra matriz - que la llamó

Sí, ahora lo veo. Pero me parece que este enfoque requiere mucho trabajo, no tanto en código como en recursos y preparación para el análisis. Para la ramificación habría que hacer una matriz tridimensional.
En general, se acepta la opción. Pero lo dejaremos en la página 4 del resumen por ahora :)

Creo que tu problema se parece más a los gra fos de red, sospecho que el aparato matemático para los grafos de red se ha desarrollado hace tiempo - tienes que buscar en Google

La tarea no es un saber hacer, ni una novedad. Un simple gráfico de funciones. Nada más.
No hay matemáticas nuevas, sólo necesitamos una versión simplificada en la medida de lo posible.

 
lea:

Es mucho mejor utilizar la lista de bordes (es decir, almacenar una matriz unidimensional de estructuras que constan de 2 elementos - id de la función que llama e id de la función llamada; la estructura se puede complementar con campos adicionales - contadores de llamadas, etc.)

Eugene, esto es exactamente lo que ya se ha hecho.

Pero el código se ha estancado. Por tercer día no puedo dormir ni beber.... . :)

No consigo averiguar cómo hacer que el retorno de la arista (más concretamente del nodo descendiente) al nodo padre vaya a la nueva arista (nuevo nodo descendiente). Pero para mantener la regla - usamos sólo una función de rastreo al principio de la función fuente.

 
sergeev:

No consigo averiguar cómo hacer un retorno de una costilla a un nodo para ir a una nueva rama.


¿Y todo con una función que ya ha hecho un pase hacia adelante? Eso es suficiente - para hacer un retorno sin hacer nada)) No pasa nada, ya es la segunda página, Vladimir no aguantará más)))
 
alsu:
¿Y todo con una sola función que ya ha hecho un pase hacia adelante? Ya está bien, vuelve sin hacer nada)) Pues nada, ya ha terminado la segunda página, pronto Vladimir no podrá soportarlo))))

Que Dios esté con ellos, con estas páginas. La tarea es interesante.

Verás, así es como puedes.... El retroceso al nodo padre puede hacerse ya en el nuevo descendiente llamado. Es decir, al ir al descendiente, el sistema bajará primero el árbol a un nivel inferior, y luego subirá al nuevo descendiente llamado.

Pero en esta versión no se pueden hacer ramas con una profundidad de más de dos. Porque el sistema siempre retrocederá antes de avanzar. Es decir, todas las funciones se dibujarán al mismo nivel.

Así que se piensa que tendremos que utilizar algunas matrices de variables, para identificar la posición actual. para seguir adelante, en lugar de volver. Esa es exactamente la complejidad de este retorno...

 

En el tráiler "pieza conceptual", más concretamente un ejemplo de aplicación. en MT 5

Hay que reescribir las funciones In() y out() para que funcionen con la lista de llamadas. Ahora sólo imprimen las entradas y salidas en el hilo estándar.

Malas noticias: no he guardado el sueño del tópico de una función de rastreo. Lo siento Sergeyev. :)

Buenas noticias: todo funciona.

Manual de usuario.

1. La macro "_in" se inserta al principio de cada función.

2. Todas las llamadas de retorno se sustituyen por "_return".

3. Al principio del programa se escriben dos definiciones

#define _in in(__FUNCTION__);
#define _return out(__FUNCTION__); return


Eso es todo.

Archivos adjuntos:
rettest.mq5  2 kb
 
sergeev:

Qué demonios con estas páginas. Es una tarea interesante.

Verás, así es como puedes.... El retroceso al nodo padre puede hacerse ya en el nuevo descendiente llamado. Es decir, al ir al descendiente, el sistema bajará primero el árbol a un nivel inferior, y luego subirá al nuevo descendiente llamado.

Pero en esta variante no se pueden hacer ramas con más de dos profundidades. Porque el sistema siempre retrocederá antes de avanzar. Es decir, todas las funciones se dibujarán al mismo nivel.

Así que se piensa que tendremos que utilizar algunas matrices de variables, para identificar la posición actual. para seguir adelante, en lugar de volver. Esa es exactamente la dificultad de esta vuelta...

¿Y de dónde viene una tarea tan extraña? ¿Merece la pena gastar esfuerzos en una investigación dudosa, cuando se pueden hacer simplemente dos funciones -de entrada y de salida- y no molestarse?