Trace task (costruire il grafico di una funzione)

 

Supponiamo di avere del codice (funzioni, classi, ecc.)

Il compito è quello di creare uno stack di chiamate. Ma non solo lineare - come un albero .

Dove il nodo dell'albero sarà l'entrata della funzione e i rami saranno le chiamate delle funzioni seguenti dal nodo della funzione corrente.

Per esempio, c'è una tale struttura di funzioni:

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

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

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

Il risultato sarà simile a questo


Condizione obbligatoria:

Potete aggiungere solo una funzione alle funzioni di codice esistenti per organizzare il tracciamento - subito dopo "{".
Non cambiate in alcun modo né i parametri di input delle funzioni sorgente né i loro risultati o il codice all'interno.

Questa condizione è necessaria per non fare grandi modifiche al codice, ma solo per inserire una stessa funzione di tracciamento (per esempio chiamiamola _TRACE_IN_) in tutte le funzioni di codice esistenti. Per ottenere tutti i passaggi del codice sorgente e costruire l'albero delle chiamate.


Sarei felice di sentire qualsiasi idea o variante.
Non importa come lo faccio girare, mi imbatto in un circolo vizioso, quando devo chiamare non una ma due funzioni per formare un tale albero. Ma potrei averne bisogno solo di uno. :)

 

Cioè, vuoi fare un programma per rilevare l'algoritmo della sorgente.

Facevo qualcosa di simile per me stesso quando rompevo i programmi degli altri in Asm, ma non capisco il tuo approccio...

perché sotto forma di albero?

o forse non lo capisco.

 
FLET:

Cioè vuoi fare un programma per rilevare l'algoritmo del sorgente.
Ho fatto qualcosa di simile per me stesso quando rompevo i programmi di altre persone in Asm, ma non capisco il tuo approccio...
Perché come un albero?
o qualcosa del genere non capisco.


Non stavo pensando alla "rottura". Ma hai capito bene. Questo è per costruire una struttura logica del codice.

Cioè, il mio compito - quando accendo un codice funzionante (mio o di qualcun altro o, per esempio, dalla consegna standard di MT5) - in una finestra separata ottengo l'intero stack di funzioni chiamate come un albero. Cioè, alla radice - funzione start() e da lì va su e oltre....

Ho implementato l'albero molto tempo fa. Ha l'analisi del tempo trascorso nelle funzioni (per l'analisi della qualità del codice), il numero di chiamate alle funzioni, il tracciamento dei valori delle variabili e così via. Ho anche implementato tre opzioni di visualizzazione di questo albero - come quello mostrato nello screenshot e come un grafico a cerchi e linee. Ma ho fatto tutto per piccole cose.

Il compito principale che ho affrontato è stato il riempimento della struttura ad albero.

Ho bisogno di un'idea su come usare una funzione (o forse diverse assegnazioni, ma la cosa principale è che siano in fila), aggiunta alla funzione del codice sorgente, per costruire una struttura come quella dello screenshot.

 
sergeev:

Ho bisogno di un'idea su come costruire una struttura come quella sullo schermocon una sola funzione, aggiunta all'inizio del codice delle funzioni.

La prova dell'impossibilità di un'idea va bene?
 
MetaDriver:
La prova dell'impossibilità di un'idea può bastare?

will.... Ma solo dopo 3 pagine di discussione delle opzioni :))

implementazioni complesse, variabili extra, uso di globali o altro. accettate tutti :)

 
sergeev:

will.... ma solo dopo 3 pagine di discussione delle opzioni :))
Lan. Aspettando la quarta pagina ;-)
 
sergeev:

ne vale la pena.... ma solo dopo 3 pagine di discussione sulle varianti :))


quindi il compito si è ridotto a riempire il topic con 3 pagine di testo? :), ok, facciamolo ;)

1. lavora con le stringhe: inserisci la funzione, aggiungi il nome della funzione, cancella l'uscita della funzione, log/traccia permanentemente le uscite della stringa completa come lista lineare:

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

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

...

questo approccio, imho, è una perdita di tempo

2. contare manualmente il numero di funzioni nel codice e questo numero sarà un sistema di numerazione, cioè in un codice di 10 funzioni = base 10, in un codice di 3 funzioni = base 3, usando l'algebra booleana, o forse più facilmente usando matrici, eseguire operazioni di esclusione o includere nell'input/output di una funzione

all'incirca così, ma poi di nuovo, imho - ne vale la pena? è un sacco di lavoro da fare.

 

IgorM:

Quindi il compito si è ridotto a riempire l'argomento con 3 pagine di testo? :), OK, ci siamo ;)

Ehi, non così caldo!!! stiamo contando ogni pagina qui :)

1. lavorare con le stringhe: inserire una funzione, aggiungere un nome di funzione, uscire dalla funzione, cancellarla,

non si adatta alla condizione. Avete bisogno di una sola chiamata - all'entrata. Non è realistico all'uscita. Ci possono essere diversi punti di uscita in una funzione. Ma c'è solo un ingresso. Pertanto, l'"aggiunta" deve essere solo all'ingresso.
 
sergeev:

ehi ehi, non così caldo!!! abbiamo ogni pagina contata qui :)

troppo tardi, il tuo desiderio è stato espresso da te ;)

sul punto - penso che tu abbia ancora bisogno di lavorare con matrici/array multidimensionali - poi avrai un modello matematico della tua traccia, e come gestirai gli eventi di input/output dalla funzione è un'altra questione

 
IgorM:

in ritardo, il tuo desiderio è stato espresso da te ;)

Si può sempre seppellire un ramo. E questo non è un desiderio.

per il punto - penso che tu abbia ancora bisogno di lavorare con matrici/array multidimensionali - poi ci sarà un modello matematico della tua traccia, e come gestirai gli eventi di input/output dalla funzione è un'altra questione

Non lo capisco molto bene. Puoi spiegare sulle tue dita come si inseriscono le matrici qui?

L'idea è di mettere le funzioni in un grafico (un albero in gergo). Ma in un chiaro ordine cronologico di chiamate e identificazione di ciò che è stato chiamato. Una stessa funzione può essere chiamata sia da start che da init. Questo è ciò che dobbiamo sistemare.

(lo sto sviluppando per/su MQL5, ecco perché uso le classi per il grafico)

 
sergeev:

grafico (albero in gergo).

Un albero è un caso speciale di un grafo.