エラー、バグ、質問 - ページ 96

 

混乱しています、アドバイスお願いします。

構造体を作り、そこにデータを入れ、構造体の配列を作りました。

今、私はどのように関数に配列を渡すことができますが、構造の1つの要素に対してのみです?

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[].y)?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }
 

開発者への提案:可能であれば、構造体で標準的な操作を行えると良い

こんなもんじゃない

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
Str x;
Str y;
void OnStart()
  {
   x.a+=y.a;
   x.b+=y.b;   
  }

が、このように

void OnStart()
  {
   x+=y;     
  }
構造体のコピーは過去のものです。
 
Urain:

混乱しています、アドバイスお願いします。

構造体を作り、そこにデータを入れ、構造体の配列を作りました。

関数に配列を渡すとき、構造体の1つの要素だけ渡すには?


無理でしょう。そして、その必要はない。

なぜなら - 和算関数がその要素だけを和算することを誰が妨げるのでしょうか?

それで、コードを修正して「コーシャ」にしたのです。

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[])?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }

OnStr()関数内のforループで10ではなく、ArraySize()の ようなものだけを現実に使用する必要があります。また、「sum+=x[i].y」のyの代わりに、構造体で定義された実際のデータフィールド(例えば、aやb)を合計します。

 
Urain:

開発者への提案:可能であれば、構造体で標準的な操作を行えると良い

こんなもんじゃない

が、このように

構造物のコピーは過去のものです。

C++にはそんなものがあるんだ。これは「演算子のオーバーロード」と呼ばれるものです。対応する関数を使ってどのように動作させるかを定義するのはプログラマーである。

しかし、この機能レナートは「ノー」と言った。運が悪かったか?

 
simpleton:

無理です。そして、その必要はありません。

なぜなら、和算関数でまさにその要素を和算することを誰が妨げるのでしょうか?

そこで、コードを「コーシャ」に修正した。

OnStr()関数内のforループでは、10ではなく、ArraySize()のようなものだけを使用する必要があります。また、「sum+=x[i].y」のyの代わりに、構造体で定義された実際のデータフィールド(例えば、aやb)を合計します。

例えを出すといつものように指摘が飛んでしまうが、私の骨太な言葉遣いなのだろう、当然といえば当然だ。

そして、その要点は、算術平均の関数を書き、この関数に構造体の配列を渡すだけで、構造 体の各メンバーの 算術平均の構造を取得する、というものです。

わかりやすくするために例を挙げましたが、おそらく失敗するでしょう。しかし、原則的に明確な説明をしていただきありがとうございます。

本当は「演算子のオーバーロード」を許可するように開発者を叩くべきなんだろうけど。

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

そう、2つの構造体の足し算、掛け算、割り算をするために、たくさんのメソッドを書かなければならなかったのです。

一番困るのは、他の構造でもう一度書き直さなければならないことです。

PSそれに、メソッドは操作するのと同じ構造体を与えるので、ネストした呼び出しはうまくいかない?

その結果をまず一時的な構造体に保存して、その後の処理に渡す必要があるのか? なぜそうするのかは不明である。

PPSすべてのパラメータは一定ですが、存在しない変数を変更 することはできません。


PPPS あと、すみません、構造体は参照渡しです、存在しない構造体をどうやって参照するのでしょうか(どうやら、お休みのようです)。

 
int sl_pips = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
誤記 型変換でデータ消失の可能性」?(構築:305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain:

混乱しています、アドバイスお願いします。

構造体を作り、そこにデータを入れ、構造体の配列を作りました。

関数に配列を渡すとき、構造体の1つの要素だけ渡すには?

struct Str
  {
   int               a;
   int               b;
                     Str(){a=2;b=3;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[10];
void OnStart()
  {
   Print("sum a=",OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr(const Str &x[].y)?????????????????????
  {
   int sum=0;
   for(int i=0;i<10;i++)
     {
      sum+=x[i].y;
     }
   return(sum);
  }

単純な

無理でしょう。そして、その必要はない。

なぜなら - 和算関数がその要素だけを和算することを誰が妨げるのでしょうか?

そこで、コードを「コーシャ」に調整します。

OnStr()内のforループで10ではなく、ArraySize()のようなものだけが実際に使用されるべきです。また、「sum+=x[i].y」のyの代わりに、構造体で定義された実際のデータフィールド(例えば、aやb)を合計します。

2つの方法があります(私が理解している範囲では)。

1.配列そのものを渡します。追加パラメータとして、これから扱うレコードのインデックスを指定します。

この場合,配列の次元を 制御する必要があり,関数宣言は次のようになります.

OnStr(const Str &x[], int Index=-1)

2.1レコードの次元を持つ副配列を渡すと、それぞれ制御と関数結果の処理に関するすべての作業が関数呼び出しポイントで保持されます。

関数宣言は次のようになります。

OnStr(const Str &x[1])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi:
誤記 型変換でデータ消失の可能性」?(構築:305)

結果を明示的にint型に変換する必要があります。

int sl_pips = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);

追記

動作するサンプルはこちら -OrderSend()

しかし、私の理解では、この警告は原則的に無視できるのですが...。

 

returnに括弧がたくさんあると、混乱し始めますね。

例えば、"klsfd Step 2 "のような文字列から数値を返す関数を以下に示します。

int GetStep(string text){
   string Right;
   int U = StringFind(text, "Step ");
   int End, result;
   if(U>=0){
      U=U+5;
      Right = StringSubstr(text, U);
      End = StringFind(Right, ".");
      result=int(MathRound(StringToDouble(StringSubstr(text, U, End-U))));
      return(result);
   }
   return(0);
}

これとどう違うのですか?

int GetStep(string text){
   string Right;
   int U = StringFind(text, "Step ");
   int End;
   if(U>=0){
      U=U+5;
      Right = StringSubstr(text, U);
      End = StringFind(Right, ".");
      return(int(MathRound(StringToDouble(StringSubstr(text, U, End-U)))));
   }
   return(0);
}

2番目のものはコンパイル時の問題を引き起こしますが、1番目のものはそうではありません。