错误、漏洞、问题 - 页 96

 

我很困惑,请给我建议。

我创建了一个结构,用数据填充它,创建了一个结构数组。

我现在如何将一个数组传递给一个函数,但只针对结构中的一个元素 ??????????????

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:

我很困惑,请给我建议。

我创建了一个结构,用数据填充它,创建了一个结构数组。

如何将一个数组传递给一个函数,但只针对结构中的一个元素 ??????????????


你不能。而且你也不需要这样做。

因为--谁能阻止求和函数只对该元素求和?

于是对代码进行了修正,使之成为 "合格的"。

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);
  }

只有像ArraySize() 这样的东西应该在现实中使用,而不是在OnStr()函数内部的for循环中使用10。而不是 "sum+=x[i].y "中的y,而是结构中定义的真实数据字段(例如a或b)。

[删除]  
Urain:

给开发者的建议,如果可能的话,最好能对结构进行标准操作

不是这样的。

但像这样。

抄袭结构是过去的事了。

在C++中,有这样一个东西。这就是所谓的 "运算符重载"。是程序员使用相应的函数定义了它应该如何工作。

但这个功能雷纳特说 "不"。运气不好,嗯?

 
simpleton:

我不能。也没有必要这样做。

因为谁能阻止你在求和函数中准确地求出那个元素?

所以代码被改成了 "kosher"。

在OnStr()函数内部的for循环中,只应使用类似ArraySize()的东西而不是10。而不是 "sum+=x[i].y "中的y,而是结构中定义的真实数据字段(例如a或b)。

像往常一样,当我举出例子时,观点就飞走了,但我并不惊讶,这可能是我的骨感语言。

而要点是这样的:写一个算术平均数的函数,然后只需向这个函数传递一个结构数组,就可以得到结构中每个成员 的算术平均数的结构。

举这个例子是为了简单起见,但可能不成功。但感谢你在原则上的澄清。

我想我们真的应该敲打一下开发者,让他们允许 "操作者重载"。

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

是的,我不得不写了一堆方法,只是为了加、乘、除这两个结构。

最令人讨厌的是,我们将不得不在其他结构上重新写一遍。

PS此外,方法给我们操作的结构类型是相同的,所以嵌套调用不起作用?

结果首先需要保存在一个临时结构中,然后传递给后续处理。

PPS虽然所有的参数都是恒定的,但没有可能改变不存在的变量


PPPS 还有,对不起,结构是通过引用传递的,你怎么能引用一个不存在的结构(显然,该休息了)。

 
int sl_pips = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
错误的评论" 由于类型转换可能导致数据丢失"?(建设:305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
[删除]  
Urain:

我很困惑,请给我建议。

我创建了一个结构,用数据填充它,创建了一个结构数组。

如何将一个数组传递给一个函数,但只针对结构中的一个元素 ??????????????

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);
  }

简单的人

你不能。而且你也不需要这样做。

因为--谁能阻止求和函数只对该元素求和?

因此,代码被调整为 "kosher"。

只有像ArraySize()这样的东西才应该被实际使用,而不是在OnStr()里面的for循环中使用10。而不是 "sum+=x[i].y "中的y,而是结构中定义的真正的数据字段(例如,a或b)。

有两种方法(据我所知)。

1.传递数组本身,指定我们要处理的记录的索引作为附加参数。

在这种情况下,我们需要控制数组的维度,函数的声明会是这样的

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

2.传递二级数组的维度为一条记录,分别对函数结果的控制和处理的所有工作都在函数调用点举行。

然后,该函数声明将看起来像这样

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);

PS

你可以在这里看到一个工作实例 -OrderSend()

但据我所知,这个警告原则上可以忽略......

 

如果返回有很多括号 - 它开始变得混乱!?

例如,这里是一个从 "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);
}

第二种情况会引起编译时的问题,但第一种情况不会。