İzleme görevi (fonksiyon grafiği oluşturma)

 

Diyelim ki bazı kodlarımız (fonksiyonlar, sınıflar, vb.)

Bir görev var - bir çağrı yığını oluşturmak . Ama sadece lineer değil , ağaç şeklinde.

Ağaç düğümü, işleve giriş olacak ve dallar, düğümün mevcut işlevinden sonraki işlev çağrıları olacak.

Örneğin, şöyle bir fonksiyon yapısı var:

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

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

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

sonuç olarak şöyle görünecek


Gerekli koşul:

Mevcut kodun işlevlerinde, "{" işaretinden hemen sonra, izlemeyi düzenlemek için yalnızca bir işlev ekleyebilirsiniz.
Aynı zamanda, orijinal işlevlerin giriş parametrelerini, bunların sonuçlarını veya içindeki kodu hiçbir şekilde değiştirmeyin.

Bu koşul, kodda büyük bir değişiklik yapmamak için gereklidir, ancak yalnızca aynı izleme işlevini (örneğin, buna _TRACE_IN_ diyelim) - mevcut tüm kod işlevlerine eklemekle sınırlı olacaktır. Kaynak kodun tüm geçişlerini almak ve bir çağrı ağacı oluşturmak için.


Herhangi bir fikir veya seçenek duymayı çok isterim.
Ne kadar dönersem döneyim, böyle bir ağacı oluşturmak için bir değil iki fonksiyon çağırmanın gerekli olduğu bir kısır döngü ile karşılaşıyorum. Ve yine de sadece birine ihtiyacın var. :)

 

Onlar. kaynak kodu algoritmasını tanımlamak için bir program yapmak istiyorsunuz.

Esma'da başkalarının programlarını bozduğumda ben de kendime benzer bir şey yapmıştım ama yaklaşımınız net değil...

neden bir ağaç şeklinde?

Ya da ben anlamadım.

 
FLET :

Onlar. kaynak kodu algoritmasını tanımlamak için bir program yapmak istiyorsunuz.
Esma'da başkalarının programlarını bozduğumda ben de kendime benzer bir şey yapmıştım ama yaklaşımınız net değil...
neden bir ağaç şeklinde?
Ya da ben anlamadım.


"Kırmak" aklıma bile gelmedi. Ama doğru anladım. Bu, kodun mantıksal yapısını oluşturmak içindir.

Yani, benim görevim - bir çalışma kodunu (benim veya başka birinin veya örneğin MT5'in standart teslimatından) ekleyerek - ayrı bir pencerede çağrılan işlevler yığınının tamamını bir ağaç biçiminde alıyorum. Bir döngü sırasında (kene) Yani, kökte - start () işlevi ve ardından daha da yükseldi ve genişledi ....

Ağacın çalışmasını uzun zaman önce uyguladım. Fonksiyonlarda harcanan zamanın (kodun kalitesini analiz etmek için), fonksiyon çağrılarının sayısının, değişkenlerin değerinin izlenmesinin vb. bir analizine sahiptir. Ayrıca bu ağacı görüntülemek için üç seçenek uyguladım - ekranda ne olduğu şeklinde, dairesel ve doğrusal bir diyagram şeklinde. Ama hepsi önemsiz.

Karşılaştığım en önemli görev ağaç yapısının kendisini doldurmaktı.

Bir işlevin (veya muhtemelen birkaç atamanın, ancak ana şey arka arkaya) yardımıyla, kaynak kod işlevine nasıl eklendiği, ekran görüntüsündeki gibi bir yapı oluşturmak için bir fikre ihtiyacım var .

 
sergeev :

Kod işlevlerinin başına yalnızca bir işlev eklenmiş, ekran görüntüsündeki gibi bir yapının nasıl oluşturulacağı hakkında bir fikre ihtiyacım var .

İmkansızlığın ispatı bir fikir için başarısız olur mu?
 
MetaDriver :
Bir fikrin imkansızlığının kanıtı başarısız olur mu?

başarısız olacak .... ancak yalnızca 3 sayfa seçeneklerin tartışılmasından sonra :))

karmaşık uygulamalar, ek değişkenler, globallerin kullanımı veya her neyse. her şeyi kabul ediyorum :)

 
sergeev :

başarısız olacak .... ancak yalnızca 3 sayfa seçeneklerin tartışılmasından sonra :))
Lan. 4. sayfayı sabırsızlıkla bekliyorum ;-)
 
sergeev :

başarısız olacak .... ancak yalnızca 3 sayfa seçeneklerin tartışılmasından sonra :))


görevin konuyu 3 sayfa metinle doldurmaya indirgendiği anlamına mı geliyor? :), tamam hadi başlayalım;)

1. Dizelerle çalışma: fonksiyona girme, fonksiyonun adını ekleme, fonksiyondan çıkışı silme, log/trace'de sürekli olarak lineer bir liste olarak tam satırı görüntüleme:

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

start(gir)-func1(gir)-func2(çıkış)

...

IMHO bu yaklaşım bir rezalet

2. Koddaki fonksiyonların sayısını "eller" olarak kabul ediyoruz ve bu sayı sayı sistemi olacak, yani. kod 10 işlevlerinde = taban 10, kod 3 işlevlerde = taban 3, Boole cebirini kullanarak veya belki daha kolay matrisleri kullanarak, işlevden giriş / çıkış kümesinde dışlama veya dahil etme işlemleri yaparız

bunun gibi bir şey, ama yine, IMHO - oyun muma değer mi? yapılacak çok fazla iş

 

IgorM :

görevin konuyu 3 sayfa metinle doldurmaya indirgendiği anlamına mı geliyor? :), tamam hadi başlayalım;)

Egegey. çok sıcak değil!!! Burada her sayfa önemlidir :)

1. dizelerle çalışın: fonksiyona giriş, fonksiyonun adını ekleyin, fonksiyondan çıkışı silin,

gereksinime uymuyor. Girişte sadece bir çağrı gereklidir. Dışarı çıktığında, gerçekçi değil. Bir fonksiyonun birden fazla çıkış noktası olabilir. Ve tek giriş var. Bu nedenle "katkı" sadece girişte olmalıdır.
 
sergeev :

Egegey. çok sıcak değil!!! Burada her sayfa önemlidir :)

çok geç oldu dileğin dile geldi ;)

konuya göre - IMHO hala matrisler / çok boyutlu diziler ile çalışmanız gerekiyor - o zaman izinizin matematiksel bir modeli görünecek ve fonksiyondan giriş / çıkış olaylarını nasıl işleyeceğiniz başka bir soru

 
IgorM :

geç dileğin dile geldi ;)

Her zaman bir dalı gömebilirsin. zamanı geldiğinde boğulacak. Ve bu bir dilek değil.

konuya göre - IMHO hala matrisler / çok boyutlu diziler ile çalışmanız gerekiyor - o zaman izinizin matematiksel bir modeli görünecek ve fonksiyondan giriş / çıkış olaylarını nasıl işleyeceğiniz başka bir soru

biraz anlamayın. Matrislerin buraya nasıl oturduğunu parmaklarınızla açıklayabilir misiniz?

Buradaki fikir, fonksiyonların bir grafiğe (popüler bir şekilde bir ağaç) düşmesidir. Ancak, çağrıların açıkça kronolojik bir sıralamasında ve neyin nerede çağrıldığının tanımlanmasında. Sonuçta, aynı işlev hem start'tan hem de init'ten çağrılabilir. Düzeltilmesi gereken bu.

(MQL5 için / içinde yapıyorum, bu yüzden grafik için sınıfları kullanıyorum)

 
sergeev :

saymak (bir halk yolunda ağaç).

Ağaç, grafiğin özel bir durumudur.