来自一个 "傻瓜 "的问题 - 页 125

 
MetaDriver:

哦,现在我明白了。

雷纳特,我有一个建议,而且正是这个主题。 请为数组做一个命名的类型,至少对静态数组(所有其他类型已经有)。

例如,可以这样声明:typedef Int8 = int[8];。

它可以通过结构轻松完成。我们根本不会把它复杂化。

struct Int8 { int arr[8]; };
 
Renat:

这很容易通过结构来实现。我们不要把它搞得太复杂。

哦,太好了,容易,这就是我们要做的!但我需要什么?一个简单的 事情吗?

你不觉得你的 奥卡姆剃刀和我们(用户) 的奥卡姆剃刀是两把截然不同的剃刀吗? 你 极简主义倾向于在用户中 制造这样的过剩,是时候把奥卡姆挂在最近的栅栏上了。

如果你如此关心简单性,那么就使其能够将通常的子数传递到函数中!每个人都会高兴,极简主义者也会高兴。

// 顺便说一下,在F4中工作正常--对动态的也是如此。:)

 
Renat:
当然,是静态的。
好了,你去吧。太晚了,无法检查 :/
 
MetaDriver:

哦,太好了,这很容易,我们就是这样做的!但我需要什么?在水平上

我所提出的结构是创建新实体的标准方式。

没有必要为任何事情感到兴奋。

 
MetaDriver:

目前,在mql5中,由于不可能将子数 传入函数,我们不得不做很多额外的步骤,写很多歪曲的代码。

你说的是指向不受控制的内存块的指针,这在MQL5中是完全禁止的。

在MQL5中,每个对象/类型都必须是可控的 - 这是语言安全的直接要求。

如果你需要传递一个数组的一部分,你应该使用传递数组本身的引用和它的位置。这将使你完全控制阵列本身。

 
Renat:

你说的是指向不可控制的内存块的指针,这在MQL5中是完全禁止的。

在MQL5中,每个对象/类型都必须是可控的 - 这是语言安全的直接要求。

2.如果你想传递一个数组的一部分,使用传递数组本身的引用和数组中的位置。这将对阵列本身的完全控制起作用。

此外,它是唯一没有实施命名的地方,所以它很符合语言实体普遍化的意识形态。

2.都一样:首先,它是歪的,其次,它根本不具有普遍性。建议一种方法(1)将二维的mql-array复制到OpenCL缓冲区,而不需要不必要的重写和包装成结构,或者(2)使用(为了速度)你自己的函数ArrayCopy(...)来处理非均匀数组。

// 对上一篇文章的突然性感到抱歉。真的没有必要。我听到 "不要把事情复杂化 "就很兴奋。因为这只会导致复杂化。

2a.我认为你对ArrayCopy()等函数的 "一维约束 "在许多情况下可以通过注释中的一个基本条款无痛苦地软化。"该函数也适用于多维 数组,只要多维数组被完整地复制。"

很多问题都会消失。// 但不是全部,当然。

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

1.这是我的建议,即引入命名,从而引入严格的类型化,特别是因为这是唯一没有被命名覆盖的地方,因此很符合语言实体普遍化的思想。

恐怕你不想注意到这一描述的巧合。

typedef Int8 = int[8];
struct   Int8 { int arr[8]; };

第二种方式更清洁、更有力、更可控。完全没有理由用现有的方法再发明一个更弱的方法。

2.做同样的事情。都一样:首先,它是歪的,其次,它根本不具有普遍性。建议一种方法(1)将二维的mql-array复制到OpenCL缓冲区,而不需要不必要的重写和包装成结构,或者(2)使用(为了速度)你自己的函数ArrayCopy(...)来处理非二维数组。

首先,它不是歪的。其次,在直接不受控制的内存访问风格中,安全性高于任何优化方法。也就是说,对于所有的语言来说,"我怎样才能把一个二进制块直接倒入一个被监督的实体 "是一个普遍的、基本的(可解决性差)的问题。

如果你必须处理不同系统之间的数组传输(在OpenCL中),就必须考虑一个 简单而直接兼容的数据结构

看看最简单的CLBufferWrite多类型函数绑定类,方便数据传输。

附加的文件:
 
Renat:

你说的是指向不受控制的内存块的指针,这在MQL5中是完全禁止的。

顺便说一句,你在浓缩。编译器在传递参数 的时候就知道被传递的数组的大小。

当试图这样做时,它甚至会产生一个错误。:)另一件事是,你必须在每次函数调用时引入额外的隐式参数化(大致如你建议我显式地做)。但你这边的解决方案会更加普遍--例如,通过使用你自己的标准函数和对象库。同样的ArrayCopy()和FileWriteArray()会顺利工作。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
papaklass:
你可以用简单的例子来配合你的陈述,对于像我这样的人。MetaDriver理解你,但像我这样的人没有任何例子就不明白我们在说什么?而且你想知道发生了什么事。

我担心这将是对文件的一种替代。在搜索中查找它--那里有大量的信息。

安全访问一些阵列成员。

void MyFunc(double& array[],uint pos,uint size)
  {
   while(size>0)
     {
      Print("[",pos,"] = ",array[pos]);
      pos++;
      size--;
     }
  }

考虑到编译器对内联函数非常敏锐,事实上,函数可能完全内置于调用处,所有的开销都将降为零。

这意味着,在MQL5中,你可以不用害怕写小的 "正确 "的函数--它们有一个标准的全内联的命运,有适当的优化。

这意味着参数传输 和索引的成本降低了。

 
MetaDriver:

顺便说一句,你是在浓缩。编译器在参数传递 时知道被传递的数组的大小。

从什么时候开始,所有的数组都变成了静态的,还有所有的索引和大小?

由于数组几乎总是动态的,而索引是变量,所以我们不能在调用的时候进行任何严肃的静态检查。你只需要做meta/rtti检查,这就是为什么对整个对象/描述的访问如此重要,而不是随意在一块内存上工作。


同样的ArrayCopy()和FileWriteArray()会毫无问题地工作。

别担心,一切都在很久以前就已经想好了。

破坏我们非常熟悉的安全原则的后果是 "在4月份我们又修复了12个关键的错误,以突破虚拟机并获得对系统的控制 "的方式。