错误、漏洞、问题 - 页 710

 

需要确定一个 可变数组的大小,但错误出来了。

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

它可以直接与常量(#define)和一个数值一起工作,但不是这样的。为什么?

 
tol64:

需要确定一个可变数组的大小,但错误出来了。

//---

//---

它可以直接与常量(#define)和一个数值一起工作,但不是这样的。为什么?

对于常量,它是一个静态数组,而对于变量,它是动态的。而一个动态的大小是由ArrayResize决定的
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

为什么?

第二和后续的维度有一个固定的尺寸。它只能由一个常数来设定。
 
tol64:

对于常量(#define)和数字值,它可以直接工作,但不是这样的。为什么?

因为当用#define 定义时,编译器只是在编译前 将遇到的宏替换为正确的条目。因此,它看到

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

这与MQL5语言不相矛盾。

 
Yedelkin:

好的。那我就壮壮胆子吧。因此,Print() 函数的描述说" 双倍类型的 数据以点后16 位小数的精度打印"事实上,事实证明,Print()函数输出的数据有些圆滑

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.999999999999999716

重点是,一个实数 在内存中存储的有效数字不超过17位。

试试这个例子,感受一下差异。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
帮助中的描述将被纠正。
 
notused:
对于常量,它是一个静态数组,而对于变量,它是动态的。而一个动态的大小是用ArrayResize来确定的。
TheXpert
第二和后续的维度有一个固定的尺寸。它只能由一个常数来设定。
罗什

因为当用#define 定义时,编译器只是在编译前 将遇到的宏替换为正确的条目。因此,它看到

这与MQL5语言不相矛盾。

谢谢你。你能告诉我,如果一个数组的一维和二维的大小是在计算中定义的,并且不能是一个常数,那么可以怎么做?使用ArrayResize(),你毕竟只能调整第一维的大小。还有,为什么我可以通过应用一个变量值来调整一个数组的大小,而最初却不能设置?
 
tol64:
谢谢你。你能告诉我,如果一个数组的一维和二维的大小都是由计算决定的,不能是一个常数,该怎么做?使用ArrayResize(),你只能改变第一个维度的大小。还有,为什么你可以用变量调整数组的大小,而最初却不能设置?
请使用类。
 
tol64:
谢谢你。你能告诉我,如果一个数组的一维和二维的大小都是由计算决定的,不能是一个常数,该怎么做?使用ArrayResize(),你只能改变第一个维度的大小。还有,为什么我可以通过应用一个变量值来调整一个数组的大小,而最初却不能设置?
看一下重载操作 部分,看看CMatrix类的例子,也许这对你有用。
 
你好。

我找不到如何使2个班级交换信息。

我想让A类与B类有一个链接,B类与A类有一个链接。
我得到一个编译错误,也许MQL5不允许这样做。但如果没有它,对象编程的使用率为30%。

解决办法可能是写一个大的GOD类,它知道并知道一切。但在我看来,这并不十分优雅。
谁可以帮助解决这个问题?

提前感谢!