プログラミングの勉強を手伝ってください。 - ページ 2

 
Alexey Viktorov:

その例には感謝します。

ちんたら書くより、そうやって並べる方が好きなのは自分だけかと思ってた。

hz - ロシア語に訳すと「知りたい」...悪く考えないでね...。

標準ライブラリの クラスを使った方が、長いPositionGet...を書かなくて済む。など

 
Dmitry Fedoseev:
ありがとうございます。消化する。
 
Alexey Viktorov:

その例には感謝します。

ダラダラ書くより、そうやって並べる方が好きなのは自分だけかと思っていました。

何が問題なのか?

コーダーナチと 言うわけではありませんが、私としては、このような構成は不愉快です。

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

目障りなんです。zaz how」ではなく、こういった形にした方がいいのでは?

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

あるいはこのような「シツコイ」。

for(int i=0;i<PositionsTotal();i++)

PositionsTotal()がループの反復ごとに呼び出さ れるとこ!

通常のコーダーは、ポジションのインデックス(幸いなことに、ここでは存在しない)で通過するループの本体を操作して、ポジションの番号を変更するようなことはしないでしょう。これはまさに無教養の極みであり、不具合の多いコードです。こんなことされたらループごと再起動するしかないじゃん。

また、このようなものが好きな人もいます。

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(Lot < MinLot) Lot = MinLot;

// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);

しかし、最適化のためにCPUの使用時間を増やしたくない初心者にとっては、学校で習ったBASICの「プログラミング」のような「if-then-other-all」の構文の方がわかりやすい。

そして、これらはすべてコピーペーストの原理によって、コードからコードへと複製 されるのです。

そこで...

 
Tio Nisla:

...

あるいはこのような「シツコイ」。

PositionsTotal()がループの繰り返しごとに呼び出さ れるとこ!

...

本当ですか?賢くなりたいのに、マンネリ化している...。

そのために登録したのですか?ちょうど、最初の投稿から、迷子になる......という感じです。

 
Dmitry Fedoseev:

本当ですか?賢いつもりでいたのに、暴走してしまったか...。

しかも、わざわざ登録したのか?ちょうど、最初の投稿から、トイレに...。

あら、そうなの。"数学を学べ" エルガーとクヌート私情を挟まないでください。

わかった、説明しよう。

    for  (            int i=0            ;          i<PositionsTotal()            ;    i++     )    { }
    ^^^               ^^^^^^^                       ^^^^^^^^^^^^^^^^^^                 ^^^          ^^^
объявление   |   объявление переменной   | проверка условия выполнения цикла:     | инкремент  | тело цикла
  цикла      | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for"   |       значением '0'       | которая вызывается на каждую итерацию  |

わかったかい?

そうでない場合は、[ctrl+f , look for "Cycle for"]のどこかから、https://learnc.info/c/loop.html を熟読してください。

こちらはリンクを探すのもダラダラしています。

そして、リテラシーのある、素敵で簡潔なコードを書くことを学んでください。アセンブラから始めるべきでしたね、1バイト単位が重要なマイコンでは。

追伸

ここで私は、専門家に彼のループ「for」の簡単な例を見せるのが惜しいくらいだった。

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

そして、これがサンプルランの結果です。

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!

繰り返しのたびに関数が呼び出されるだけでなく、最後には+1回まで呼び出されていることがわかる。

それでは、どうぞ。

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

えー、ダーリン。"数学を学べ" エルガーとクヌート私情を挟まないでください。

わかった、説明しよう。

わかったかい?

そうでない場合は、[ctrl+f , look for "Cycle for"]のどこかから、https://learnc.info/c/loop.html を熟読してください。

こちらはリンクを探すのもダラダラしています。

そして、リテラシーのある、素敵で簡潔なコードを書くことを学んでください。アセンブラから始めるべきでしたね、1バイト単位が重要なマイコンでは。

追伸

ここで私は、専門家に彼のループ「for」の簡単な例を見せるのが惜しいくらいだった。

そして、これがサンプルランの結果です。

繰り返しのたびに関数が呼び出されるだけでなく、最後には+1回まで呼び出されていることがわかる。

それでは、どうぞ。

拍手喝采です!続けて...


 
Dmitry Fedoseev:

拍手喝采です!続けて...


なぜ、こんなに散らかしてしまったのですか?そして、それをネットに載せる。お母さんに叱られるよ!
 
もし、あるコードがストレスで目が回るようなら、世の中には掃除屋、ローダー、清掃員、衛生工...といった職業がたくさんある。
 
Dmitry Fedoseev:

本当ですか?賢いつもりでいたのに、暴走してしまったか...。

しかも、わざわざ登録したのか?最初の投稿から水たまりの中へ......そんな感じです。

なんて面白い会話をしているのでしょう)))

諸君、個性は個性だが、真実を見極めよう。

この例を使うと、ループの反復 ごとにPositionsTotal() が呼び出されることがわかります。

でも、Dimitriさんは逆に、コンパイラが違う方法でやっていると言っているわけですが、私には理解できません。説明する。

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;
CSymbolInfo    m_symbol;
//-------------------------------------------------------------------+
void OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.RefreshRates();

   for(int i = 0; i < 10; i++)
     {
      m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
     }

//---закомментировать не нужное
   for(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
     {
      m_trade.PositionClose(_Symbol);
     }
//---закомментировать не нужное
   int index = PositionsTotal();
   for(int i = 5; i < index; i++) // так удаляются 5 сделок
     {
      m_trade.PositionClose(_Symbol);
     }

//вывод: PositionsTotal() вызывается на каждой итерации
  }
//+------------------------------------------------------------------+

PositionsTotal() 関数が毎回ポジションを再計算するのではなく、単にオープンポジションの数を含む変数の値を返すというなら、はい、その通りです。もう一つ変数を宣言する意味はありませんが、それではコンパイラーは何をしなければならないのでしょうか

そして、この関数が毎回オープンポジションを再計算するのであれば、コンパイラはこの関数の値がさらなる計算に影響するかどうかを理解し、関数か変数のどちらかを使用しなければならないことがわかりました。

何か腑に落ちないんですよね。

 
Aleksandr Slavskii:

面白い会話をしていますね)))

先ほど、somefunc()関数が金額を返す以外に何らかの操作を行う場合、例えば取引パラメータを計算する場合、そのような使い方は捕捉しにくいアーティファクトを引き起こし、コードの作者を「Ht?どうして4回なんだ?O_o F$#@!!!!3回あるはずなのでは?なぜ私のEAは私に嘘をつくのか」。それが、専門家が毛根まで激怒した「シットコド」である。当たり前のことなので、私は話題にしませんでしたが、あなたは私のためにそれをやってくれました。しかし、配列の再初期化を行わずに動的に計算されたインデックスによるアドレス指定は、別のものであることを考慮に入れていません。素の sys では通常 GPF になり、プラスでは例外とそのハンドラへのスマートポインタと配列になります。mqlでは、何につながるかは不明です。