トレースタスク(関数グラフの作成) - ページ 2

 
sergeev:
1つの同じ関数が、startと initの 両方から呼び出されることがあります。これは修正されるべきです。

指先ではできるけど、よく考えないといけない))

このように

関数の数を数え、4とした場合、コードヘッダに#define X 4と記述する

1ティックでの最大呼び出し回数を100とする #define Y 100

サイズ 4 x 100 の行列があるので、matrix = -1 で初期化する。

と今、関数のエントリポイントで関数を呼び出すと、自由行に私たちの行列へのエントリで所望の位置Xにコード(1、2、3または4)を追加する必要がありますカウンター(グラフシェーパー)の呼び出しを追加 - 誰と呼ばれる。

この問題はネットワークグラフに 近いと思うのですが、ネットワークグラフの行列はとっくに開発されているのではないでしょうか。

SZY: さて、すでにこのトピックの2ページ目です ;)

 

IgorM さんが提案されているグラフの保存方法は、「隣接行列」と呼ばれていますね。疎なグラフには非常に不経済です(「完全連結グラフ」アーキテクチャなど、プログラマは叩かれるべきです)。

エッジリスト(すなわち,呼び出した関数の IDと呼び出された関数のIDの2つの要素からなる構造体の1次元配列を格納する.構造体は,コールカウンタなどの追加のフィールドで補完できる)を使用する方がはるかに良い.

p.s. マタッパラータは本当にずいぶん前に開発されたものですね :)

 
lea:

IgorM さんが提案されているグラフの保存方法は、「隣接行列」と呼ばれていますね。

ありがとう、少なくとも何か思い出し始めたよ、実生活で使われることのなかったこれらの事柄を勉強してから15年も経つんだ ))))- しかし、「データのパッキング」(メモリの節約)は、行列の複雑さが増すため、性能の低下につながることを忘れないでください、私は間違っているかもしれませんが
 
MetaDriver:
アイデアの 不可能性の証明?
C++では関数からの入出力のログを取るのは簡単です。
デストラクタがあり、スタックの巻き戻しというものがあります。
とはいえ...同じC++でも、コード中の任意の
ポイントの関数呼び出しの 順序をスタックで構築できるライブラリがあります。
.
つまり......1回戻るごとに、さらに電話がかかってくるということです :-)。
 
lea:
木は、グラフの特殊なケースです。

はい、そういうことです。MQLコードの線形性に基づいて - それは純粋な形でツリーになります。ノードは互いに指し示すことはないので

イゴールM
4 x 100 次元の行列を持ち,行列を初期化 = -1 とする。
そして,関数のエントリポイントで関数を呼び出すときに,行列のエントリで空いている行に必要な位置 X にコード (1,2,3 または 4) を追加するカウンター(グラフシェーパ)の呼び出しを追加します - 誰がそれを呼び出したのでしょうか。

はい、今わかりました。しかし、この方法は、コードというより、解析のためのリソースや準備に本当に労力がかかるように思います。分岐のためには、3次元のマトリックスを作る必要があります。
一般に、このオプションは受け入れられます。でも、とりあえずまとめの4ページ目までにしておきましょうか :)

この問題はネットワークグラフに 近いと思うのですが、ネットワークグラフの数学的装置はとっくに開発されていると思います。

この課題は、ノウハウでもなければ、目新しさでもない。関数の簡単なグラフでいい。それ以上はない。
新しい数学があるわけではなく、なるべく簡略化したものが必要なのです。

 
lea:

エッジリスト(呼び出した関数のIDと呼び出された関数のIDの2つの要素からなる構造体の1次元配列を格納する。構造体はコールカウンタなどの追加フィールドで補完できる)を使う方がずっと良い。

ユージン これはまさに、すでに行われていることなんです。

しかし、このコードは失速してしまった。3日目にして眠れなくなり、酒も飲めなくなった.:)

エッジ(正確には子孫ノード)から親ノードへの戻りを、新しいエッジ(新しい子孫ノード)へ行くようにする方法がわかりません。しかし、 ルールを守るために、ソース関数の先頭で1つだけトレース関数を使用します。

 
sergeev:

リブからノードに戻るときに、新しいブランチに行くようにするにはどうしたらいいのかわかりません。


しかも、すでに前方にパスを出している機能だけで?それで十分です。何もしなくてもリターンが得られるのですから))大丈夫です、もう2ページ目です、ウラジミールは もう耐えられません)))
 
alsu:
しかも、すでにフォワードパスをしている1つの機能だけで?もういいよー、何もしないでカムバックしてくれー))いやいや、もう2ページ目が終わってしまったので、そろそろウラジミールが 我慢できなくなりそうです))))

神様が彼らと、このページと共にありますように。課題は面白い。

ほら、こうやって...。親ノードへのロールバックは、新しく呼び出された子孫ノードで既に行うことができます。つまり、子孫に行くとき、システムはまずツリーを下の階層に行き、それから新しく呼ばれた子孫に上がっていきます。

しかし、このバージョンでは、2つ以上の深さを持つ枝を作ることはできません。なぜなら、システムは前進する前に必ず後戻りするからです。つまり、すべての機能が同じレベルで描画されることになります。

そのため、変数の配列をいくつか使って、現在位置を特定する必要があると考えられます。 戻りではなく、先に進むためにそれこそ、この返しの複雑さといったら...。

 

予告編の「コンセプトワーク」、より正確には実装例です。

In()、out()関数がコールリストで動作するように書き換える必要があります。今は標準スレッドに入出力を出力するだけです。

悪い知らせ:トピックスターターの夢であるトレース機能を1つも保存していない。セルゲイエフさんごめんなさい。:)

良い知らせ:すべてがうまくいく。

ユーザーマニュアルです。

1.各関数の先頭には、マクロ"_in "が挿入される。

2.すべてのリターンコールは"_return "に置き換えられる

3.プログラムの冒頭に2つのdefineが書かれています。

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


以上です。

ファイル:
rettest.mq5  2 kb
 
sergeev:

なんだこのページは。面白い仕事ですね。

ほら、こうやって...。親ノードへのロールバックは、新しく呼び出された子孫ノードで既に行うことができます。つまり、子孫に行くとき、システムはまずツリーを下の階層に行き、それから新しく呼ばれた子孫に上がっていきます。

しかし、このバリエーションでは、2つ以上の深さのある枝を作ることはできません。なぜなら、システムは前進する前に必ず後戻りするからです。つまり、すべての機能が同じレベルで描画されることになります。

そのため、変数の配列をいくつか使って、現在位置を特定する必要があると考えられます。 戻りではなく、先に進むためにそれこそが、このリターンの難しさなのです...。

そして、そのような奇妙な仕事はどこから来るのでしょうか?入力と出力の2つの機能を作ればいいだけなのに、わざわざ怪しげな研究に労力を費やす価値があるのだろうか。