Вопросы от "чайника" - страница 127

 
Renat:

Уважаемый, следите за контекстом.

1) Когда Вы из одной контролируемой и безопасной среды прыгаете в абсолютно неконтролируемый сырой буфер, то именно Вы отвечаете за совместимость с той бинарной средой.

2) Когда Вы пишите код, то именно Вы отвечаете за архитектуру этого кода. И не надо плакаться, что "трудно впрячь коня и трепетную лань в одну телегу" при использовании разных структур.

3) Рекомендую прочитать описание CLBufferRead и CLBufferWrite - за счет универсальной void* ссылки есть возможность передачи в OpenCL ссылки любого типа. Причем есть и смещения и размеры.

1.  Я готов к этой ответственности. // поправляя воображаемый галстук и с трудом сдерживая смех.

2.  Я не плачусь. Просто глупо писать собственные двух-трёх-мерные массивы, которые вроде в языке уже есть. А приходится.

3.  Я проверю. В старой редакции передача двумерного массива НЕ РАБОТАЛА. В новой не пробовал по старой памяти.

// А в ArrrayCopy() ваш void тоже вроде бы есть, но плюшевый и распространяется только на тип массива, но не на размерность.

Пошёл проверять третий пункт.

 

Вы именно плачетесь, попутно обвиняя нас в недостатках. Поэтому не нужно клоунады.

О многомерных массивах:

  • многомерные массивы работают
  • используйте ООП, держите/скрывайте массивы внутри классов
  • поменьше занимайтесь неразумной передачей многомерных массивов в виде параметров
  • активно используйте структуры - они кратно облегчают жизнь и контроль, уменьшая сложность
Сразу станет легче и правильнее.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Renat:

Вы именно плачетесь, попутно обвиняя нас в недостатках. Поэтому не нужно клоунады.

О многомерных массивах:

  • многомерные массивы работают
  • используйте ООП, держите/скрывайте массивы внутри классов
  • поменьше занимайтесь неразумной передачей многомерных массивов в виде параметров
  • активно используйте структуры - они кратно облегчают жизнь и контроль, уменьшая сложность
Сразу станет легче и правильнее.

Я усё перечисленное делаю.  А недовольство было обоснованным, поскольку (например) в предыдущей версии не работал вот этот код:

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

И приходилось переписывать массив лишних два раза в каждом цикле обработки (см. закомментированный код)

В другой версии у меня сделан виртуальный свой объектный массив (примерно как у Николая), но им пользоваться тоже коряво (особенно при прописывании генетики) - синтаксис функциональный выматывает местами.

Сейчас код работает, двумерный массив в буфер действительно пишется. Это прогресс. :)

Ладно, Мир, Дружба, Жвачка... :)  Если сделаете перегрузку операторов, синтаксис я сам поправлю.

 
Перегрузку операторов уже сделали, будет доступно в следующем билде.
 
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]; };

Второй вариант гораздо чище, мощнее и с более контролируем. Придумывать при существующем способе другую более слабую сущность нет никакого резона.

Второй вариант описания это не проблема. Проблема, что при использовании синтаксис меняется не в лучшую сторону.

Предлагаю мощный и абсолютно безопасный компромисс : поля "по умолчанию".  Ключевое слово default полностью решает синтаксические разногласия. :)

В данном случае.

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

(В С++ есть, в C# есть, в Делфи есть и т.д.)

Т.е. при обращении к к такому полю, достаточно вместо Int8Var.arr[i] написать Int8Var[i] - компилятор поймёт правильно.

// И главное не забыть это сделать не только для классов, но и для структур. :)