i1 после окончания цикла равен 7, хотя максимальный индекс третьей размерности - 6. По идее, должен быть out of range, но если нет, то вполне возможно, что строчка
out[i3][i2][i1] = f(sum + WT[i3][i2]);
может перезаписать значение например, i2. Но в таком случае это ошибка в mql-компиляторе.
Можно вынести, например, определение массива в глобальные переменные - тогда поведение вышеприведённого кода должно измениться.
IgorM: приатачил, в таком виде скрипт уходит в бесконечный цикл
у меня Zero Devide хоть с принтом, хоть без него, на
double f(double x){return(1/(1+MathExp(-1*x)));}
А вообще i1 принимает неправильное значение. Хотя на обращение out[][][7] - должен быть out of range. Видимо компилятор считает ограничения исходя из перемножения всех размерностей (3 * 7 * 7 = 147), а не по каждой. Ибо, если i1 присвоить 8 - всё-равно Print выводит какие-то значения. Однозначно, ошибка компилятора при проверке границ массива.
notused: Видимо компилятор считает ограничения исходя из перемножения всех размерностей (3 * 7 * 7 = 147), а не по каждой. Ибо, если i1 присвоить 8 - всё-равно Print выводит какие-то значения. Однозначно, ошибка компилятора при проверке границ массива.
Исполнительная система тупо вычислила смещение и если в вычислении участвовали неправильные индексы, но при этом вы не вышли за пределы массива, то ничего и не произойдёт. Если же индексы проверять по-умному, каждый в отдельности, тогда получим конкретные тормоза при исполнении
да не выводится
да не выводится
повторю вопрос - у вас для 2/3/8 расчитывается экспонента?
и еще странно выглядит
1071644672оно откуда ?сделал так:
в журнале:
если закоментировать: // if(i3==2 && i2==3 && i1==8) Print("неправильный вызов exp!!!!");
опять будет бесконечный цикл :)
если закоментировать: // if(i3==2 && i2==3 && i1==8) Print("неправильный вызов exp!!!!");
опять будет бесконечный цикл :)
i1 после окончания цикла равен 7, хотя максимальный индекс третьей размерности - 6. По идее, должен быть out of range, но если нет, то вполне возможно, что строчка
может перезаписать значение например, i2. Но в таком случае это ошибка в mql-компиляторе.
Можно вынести, например, определение массива в глобальные переменные - тогда поведение вышеприведённого кода должно измениться.
опять будет бесконечный цикл :)
думаю что ошибка все таки е в принте как таковом.
выясняйте что имеется на строчках перед ним. так как последняя экспонента выполнятся не должна. индекс превышает
думаю чтоб проблема таки у вас в коде.
и еще странно выглядит
1071644672оно откуда ?приатачил, в таком виде скрипт уходит в бесконечный цикл
у меня Zero Devide хоть с принтом, хоть без него, на
А вообще i1 принимает неправильное значение. Хотя на обращение out[][][7] - должен быть out of range. Видимо компилятор считает ограничения исходя из перемножения всех размерностей (3 * 7 * 7 = 147), а не по каждой. Ибо, если i1 присвоить 8 - всё-равно Print выводит какие-то значения. Однозначно, ошибка компилятора при проверке границ массива.Видимо компилятор считает ограничения исходя из перемножения всех размерностей (3 * 7 * 7 = 147), а не по каждой. Ибо, если i1 присвоить 8 - всё-равно Print выводит какие-то значения. Однозначно, ошибка компилятора при проверке границ массива.
Out of range выдаёт не компилятор. Это Runtime ошибка.
Исполнительная система тупо вычислила смещение и если в вычислении участвовали неправильные индексы, но при этом вы не вышли за пределы массива, то ничего и не произойдёт. Если же индексы проверять по-умному, каждый в отдельности, тогда получим конкретные тормоза при исполнении
Этот код компилится без единого warning. Хотя, наверное, даже компилиться не должен
Такая операция разрешена в MQL5 как альтернатива uinon.
Решено - добавим предупреждение. И явное приведение к структуре, для устранения предупреждения.