mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 18

 

この問題を解決するのを助けてください。マクロがあり、その中にコードを追加して結果を返したい。

#define  FOR3(a,b,c,loop) {for(int i=0; i<a; i++)\
for(int j=0; j<b; j++)\
for(int k=0; k<c; k++)\
{loop;}/*код хочу дописать в этом месте и вернуть результат но эта штука работает только как void*/}

与えられた場所にコードを追加して、マクロから結果を返せるようにすることは可能ですか?コードを追加することができます。試してみましたが、returnを書くと効果が期待できません。こんな例を見ました

  double Try_helper;
#define  Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return 4;                         \
   }

リターンが効くスレッドのこちらで。

 
Seric29:

この問題を解決するのを助けてください。マクロがあり、その中にコードを追加して結果を返したい。

与えられた場所にコードを追加して、マクロから結果を返せるようにすることは可能ですか?コードを追加することができます。試してみましたが、returnを書くと効果が期待できません。こんな例を見ました

このトピックでは、リターンワークスについて説明します。

他の関数(ループ本体など)へのポインタを渡した関数を呼び 出す。

int for3(int a, int b, int c, void(*loop)()) {
        for(int i=0; i<a; i++)
                for(int j=0; j<b; j++)
                        for(int k=0; k<c; k++) 
                                loop();
        return 4;
}
...
void fn() {}
...
if ( for3(1, 2, 3, fn) ) printf("hellow world");
 
Vict:

他の関数へのポインタを渡した関数を呼び 出す(例えばループの本体など)

こんなことができるなんて知らなかったのですが、私の目標は、多くのコマンドを実行する複雑な複数行のマクロを書くことです、おそらくマクロでは多くのコマンドを実行できず、関数にすることは不可能なのでしょうか?時々、関数から例えばループを抽出する必要があるのですが、可能でしょうか、もしかしたら私は無意味なことを書いているかもしれません。

 
Seric29:

こんなことができるなんて知らなかったのですが、私の課題は、多くのコマンドを実行する複雑な複数行のマクロを書くことです、マクロでは多くのコマンドを実行できないので関数にするのは無理なんでしょうか?関数からループを作る必要がある場合がありますが、可能なのでしょうか、もしかしたらナンセンスなことを書いているのかもしれません。

課題が何なのか、そこを掘っているのかどうかは分かりませんが、一目瞭然、別のアプローチです。

#define  CHECKCONT_INST(_NAME)                            \
bool _NAME(upindex_t start, upindex_t top)               \
   double lev_k[] = {CHECKCONT_INST_LEVELS};             \
   ...                                                   \
}                                                        \

#define  CHECKCONT_INST_LEVELS
CHECKCONT_INST(check_cont_withoutlev);
#undef  CHECKCONT_INST_LEVELS

#define  CHECKCONT_INST_LEVELS 1.618
CHECKCONT_INST(check_cont_1618);
#undef  CHECKCONT_INST_LEVELS

#define  CHECKCONT_INST_LEVELS 1.618, 2.618
CHECKCONT_INST(check_cont_2618);
#undef  CHECKCONT_INST_LEVELS

check_cont_withoutlev(0, 10);
check_cont_1618(0, 10);
check_cont_2618(0, 10);

こうすることで、関数の任意の部分(私の場合、必ずしも配列充填とは 限りません)を置き換え、必要に応じてインスタンス化することができます。

 
#define  FOR3(a,b,c,code)   \
for(int i=0; i<a; i++)     \
for(int j=0; j<b; j++)     \
for(int k=0; k<c; k++){    \
code;                      \
}

void OnStart(){

   string x="";
   FOR3(2,3,4,x=x+(string)i+","+(string)j+","+(string)k+";\n");   
   Alert(x);
   
}
 
Seric29:

こんなことができるなんて知らなかったのですが、私の課題は、多くのコマンドを実行する複雑な複数行のマクロを書くことです、マクロでは多くのコマンドを実行できないので関数にするのは無理なんでしょうか?関数からループを作る必要がある場合がありますが、可能なのでしょうか、もしかしたら無意味なことを書いているのかもしれません。

可能ですが、こうはいきません。

 
Dmitry Fedoseev:

できるけど、こうはいかない。

このマクロは無効で、結果を返すためには計算する式が必要で、言い換えれば、マクロの中で関数を呼び出す必要がある、この結論に達しました。

 
Vict:

他の関数(ループ本体など)へのポインタを渡した関数を呼び 出す。

私は関数ポインタを勉強しました、正直なところ、私はそれが何のためにあるのか理解できませんでした、実際には変数の代わりに関数を呼び出すことができますし、しっかりと私に来るかもしれません、関数ポインタは、オーバーロードまたはポリモーフィズムに似ています。

 
Seric29:

関数ポインタを勉強しているのですが、正直なところ何のために あるのか理解していません。基本的には変数の代わりに関数を呼び出すことができます。たぶん、私は難しいと思っています。関数ポインタはオーバーロードやポリモーフィズムのようなものだと考えています。

あるアルゴリズムの中に、特定の問題を解決するために、いわば「微調整」するためのサブアルゴリズムを入れることができるのです。要するに、仮想関数の アナログです。主なものは、あなた自身がそれを求めたのに、その理由がわからないということです)、あなたはフレームワークを持ち、その中にループを入れました。

 
Seric29:

このマクロは無効で、結果を返すには計算する式が必要、つまりマクロの中で関数を呼び出す必要がある、そう考えるようになりました。

はい、まずこの「magic-miracle」コードをコンパイルしてみてください。ここで現実から切り離されて荒唐無稽に妄想してる奴がいるんだよ。