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

 
Renat:

亲爱的先生,请注意上下文。

1)当你从一个受控的安全环境跳到一个完全不受控的原始缓冲区时,你是负责与该二进制环境兼容的人。

2)当你写代码时,你要对该代码的架构负责。当你使用不同的结构时,不要抱怨说 "很难把一匹马和一只母鹿放在同一辆车上"。

3) 我建议你阅读CLBufferRead和CLBufferWrite的描述--由于通用的void*引用,你可以向OpenCL传递任何类型的引用。而且还有偏移和大小之分。

1.我已准备好承担这一责任。//调整想象中的领带,努力忍住笑声。

2.我没有哭。自己编写似乎已经存在于语言中的二维或三维数组,这实在是太傻了。而且你必须这样做。

3.我将检查它。在旧版本中,传递一个二维数组不工作。根据以前的记忆,没有在新车中试过。

// ArrrayCopy()似乎也有你的无效,但它是毛绒的,只适用于数组类型,而不是尺寸。

去检查了第三项。

 

你正是在哭,在这个过程中指责我们的缺点。因此,没有必要在这里打闹。

关于多维 数组。

  • 多维数组的工作。
  • 使用OOP,在类中保留/隐藏数组
  • 减少多维数组作为参数的不合理传递。
  • 积极使用结构--它们使生活和控制变得更加容易,减少了复杂性。
马上就会变得更容易、更正确。
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Renat:

你正是在哭,在这个过程中指责我们的缺点。所以不需要再打闹了。

关于多维 数组。

  • 多维数组的工作。
  • 使用OOP,在类中保留/隐藏数组
  • 减少多维数组作为参数传递的不合理性
  • 积极使用结构--它们使生活和控制变得更加容易,减少了复杂性。
它将立即变得更容易、更正确。

而我的不满是有根据的,因为(例如)这段代码在以前的版本中并不工作。

void gpuCalculate()
  {
//   for(int i=0; i<CountPass; i++) {for(int j=0; j<CountInd; j++) {nets[i*CountInd+j]=NETs[i][j];}}
//   CLBufferWrite(cl_Mem_NET,nets);
   CLBufferWrite(cl_Mem_NET,NETs);
   CLExecute(cl_Krn,1,Offs,Works);
   CLBufferRead(cl_Mem_Result,Result);
//   CLBufferRead(cl_Mem_NET,nets);
   CLBufferRead(cl_Mem_NET,NETs);
//   for(int i=0; i<CountPass; i++) {for(int j=0; j<CountInd; j++) {NETs[i][j]=nets[i*CountInd+j];}}
  }

而且我不得不在每个处理循环中重复写了两次数组(见注释代码)。

在另一个版本中,我做了一个虚拟的自己的对象数组(像Nikolai的那样),但使用起来很笨拙(尤其是在写基因的时候)--函数式语法在某些地方很累人。

现在代码工作了,二维数组实际上被写入了缓冲区。这就是进步。:)

好的,和平,友谊,口香糖...:) 如果你做了运算符重载,我会自己修改语法的。

 
操作员重载已经完成,将在下一个版本中提供。
 
Renat:
操作员重载已经完成,将在下一个版本中提供。

哇!!!这是很好的触摸。

非常感谢整个开发团队的努力!

现在将有可能写出真正漂亮的代码。

 
Renat:
操作员重载已经完成,将在下一个版本中提供。

为什么要写这么小的字? 这是个反问句。

最好像这样。



Перегрузку операторов уже сделали, будет доступно в следующем билде.



 

操作员超载对我来说是一个新概念。我在这里发现了一个详细的描述:http://programmersclub.ru/24/

就是这个吗?

Уроки по С++, Урок 24. Перегрузка операторов
  • www.programmersclub.ru
Как вы уже знаете, тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int ваша программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора плюс для сложения двух строк...
 
tol64:

操作员超载对我来说是一个新概念。我在这里发现了一个详细的描述:http://programmersclub.ru/24/

就是这个吗?

是的,它是。
 
Urain:

为什么字母这么小? 这是个反问句。我更喜欢这样。



Перегрузку операторов уже сделали, будет доступно в следующем билде.




是的,这将是一个非常庄重的建设。

:)

 
Renat:

恐怕你不想注意到描述上的重叠。

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

第二种选择更干净,更强大,控制力更强。以现有的方式发明另一个较弱的实体是没有共鸣的。

第二个版本的描述不是问题所在。问题是,当你使用,语法并没有更好的变化。

我为你提供一个强大且绝对安全 的折中方案:"默认 "字段。 默认这个关键词完全解决了语法上的分歧。:)

在这种情况下。

struct   Int8 
  { 
    int arr[8]; default;
  };

(C++有,C#有,Delphi有,等等)。

也就是说,当访问这样的字段时,只要写Int8Var[i]而不是Int8Var.arr[i] - 编译器会正确理解。

// 而最主要的是不要忘记不仅对类,而且对结构也要这样做。:)