Tarea de trazado (construcción de un gráfico de funciones)

 

Supongamos que tenemos un código (funciones, clases, etc.)

La tarea consiste en crear una pila de llamadas. Pero no sólo de forma lineal, sino como un árbol .

Donde el nodo del árbol será la entrada de la función y las ramas serán las llamadas de las siguientes funciones desde el nodo de la función actual.

Por ejemplo, existe una estructura de funciones de este tipo:

void Main() {  A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

El resultado será el siguiente


Condición obligatoria:

Puede añadir una sola función a las funciones de código existentes para organizar el rastreo, justo después de "{".
No cambie de ninguna manera ni los parámetros de entrada de las funciones fuente ni sus resultados ni el código que contienen.

Esta condición es necesaria para no hacer grandes modificaciones en el código, sino sólo para insertar una misma función de rastreo (por ejemplo, llamémosla _TRACE_IN_) en todas las funciones de código existentes. Para obtener todos los pases del código fuente y construir el árbol de llamadas.


Me gustaría escuchar cualquier idea o variante.
Por más vueltas que le dé, me encuentro con un círculo vicioso, cuando tengo que llamar no a una sino a dos funciones para formar dicho árbol. Pero puede que sólo necesite uno. :)

 

Por lo tanto, usted quiere hacer un programa para detectar el algoritmo de la fuente.

Yo solía hacer algo similar para mí cuando rompía los programas de otras personas en Asm, pero no entiendo su enfoque...

¿por qué en forma de árbol?

o tal vez no lo entiendo.

 
FLET:

Es decir, quieres hacer un programa para detectar el algoritmo de la fuente.
Yo mismo hice algo parecido cuando rompía programas ajenos en Asm, pero no entiendo tu planteamiento...
¿por qué como un árbol?
o algo así no lo entiendo.


No estaba pensando en "romper". Pero tienes razón. Esto es para construir una estructura lógica de código.

Es decir, mi tarea - cuando conecto un código de trabajo (propio o de otra persona o, por ejemplo, de la entrega estándar de MT5) - en una ventana separada obtengo toda la pila de funciones llamadas como un árbol. Es decir, en la raíz - función start() y a partir de ahí sube y sobre....

He implementado el árbol hace mucho tiempo. Dispone de análisis del tiempo empleado en las funciones (para el análisis de la calidad del código), número de llamadas a las funciones, rastreo de los valores de las variables, etc. También he implementado tres opciones de visualización de este árbol - como lo que se muestra en la captura de pantalla y como un círculo y un gráfico de líneas. Pero lo hice todo por cosas pequeñas.

La principal tarea a la que me enfrenté fue la de rellenar la propia estructura del árbol.

Necesito una idea de cómo utilizar una función (o tal vez varias asignaciones, pero lo principal es que están en una fila), añadido a la función de código fuente, para construir una estructura como en la captura de pantalla.

 
sergeev:

Necesito una idea de cómo construir una estructura como la de la pantallacon una sola función, añadida al principio de las funciones del código.

¿Servirá la prueba de la imposibilidad de una idea ?
 
MetaDriver:
¿La prueba de la imposibilidad de una idea será suficiente?

.... Pero sólo después de 3 páginas de discusión de opciones :))

implementaciones complejas, variables extra, uso de global, o lo que sea. acepta todo :)

 
sergeev:

.... pero sólo después de 3 páginas de discusión de opciones :))
Lan. A la espera de la cuarta página ;-)
 
sergeev:

vale la pena.... pero sólo después de 3 páginas de discusión de variantes :))


¿Así que la tarea se redujo a llenar el tema con 3 páginas de texto? :), vale, hagámoslo ;)

1. trabajar con cadenas: introducir la función, añadir el nombre de la función, eliminar la salida de la función, registrar/trazar permanentemente las salidas de la cadena completa como una lista lineal:

start(enter)-func1(enter)-func2(enter)

start(enter)-func1(enter)-func2(exit)

...

este enfoque, en mi opinión, es una pérdida de tiempo

2. contar manualmente el número de funciones en el código y este número será un sistema de numeración, es decir, en un código de 10 funciones = base 10, en un código de 3 funciones = base 3, utilizando el álgebra booleana, o quizás más fácil utilizando matrices, realizar operaciones de exclusión o incluir en la entrada/salida de una función

más o menos, pero entonces, en mi opinión, ¿merece la pena? hay que hacer mucho trabajo.

 

IgorM:

¿Así que la tarea se redujo a llenar el tema con 3 páginas de texto? :), OK, aquí vamos ;)

hey, no tan caliente!!! estamos contando cada página aquí :)

1. trabajar con cadenas: introducir una función, añadir un nombre de función, salir de la función, borrarla,

no se ajusta a la condición. Sólo se necesita una llamada: a la entrada. Es poco realista en la salida. Puede haber varios puntos de salida en una función. Pero sólo hay una entrada. Por lo tanto, la "adición" debe ser sólo en la entrada.
 
sergeev:

hey hey, no tan caliente!!! tenemos todas las páginas contadas aquí :)

demasiado tarde, tu deseo fue expresado por ti ;)

sobre el punto - todavía tienen que trabajar con matrices / matrices multidimensionales - entonces habrá un modelo matemático de su rastro, y cómo va a manejar los eventos de entrada / salida de la función es otra cuestión

 
IgorM:

tarde, tu deseo fue expresado por ti ;)

Siempre puedes enterrar una rama. Y esto no es un deseo.

para el punto - creo que todavía tiene que trabajar con matrices / matrices multidimensionales - entonces habrá un modelo matemático de su rastro, y cómo va a manejar los eventos de entrada / salida de la función es otra cuestión

No lo entiendo muy bien. ¿Puedes explicar con los dedos cómo encajan aquí las matrices?

La idea es poner las funciones en un gráfico (un árbol en la jerga). Pero en un claro orden cronológico de llamadas e identificación de lo que se llamó. Una misma función puede ser llamada tanto desde start como desde init. Esto es lo que tenemos que arreglar.

(Lo estoy desarrollando para/sobre MQL5, por lo tanto uso clases para el gráfico)

 
sergeev:

gráfico (árbol en la lengua vernácula).

Un árbol es un caso especial de un gráfico.
Razón de la queja: