Array out of range - страница 3

 
Yedelkin:

Ждём, всё-таки,  ответа на мой вопрос:  "Что значит "замедлит выполнение программ"? При наличии такого сообщения программа не замедляется - она попросту перестаёт работать, наскольку я помню. О каком "замедлении работы" идёт речь?". Пояснения к этому вопросу, как видно из предыдущего сообщения, уже поняты :)

А что непонятно?  Любой дополнительный контроль со стороны исполняющей подсистемы потребует дополнительного времени.  Или по вашему контроль должен быть только в момент креша? :)   Легко требовать от Деда Мороза всяких волшебных (и главное бесплатных!) подарков, забывая что это всего лишь переодетый папа. 
 
Каждый индекс контролируется по отдельности, а вот сообщение об ошибке используется одно, мы это изменим. В сообщении об ошибке будет указываться положение открывающей "[" того индекса, в котором произошёл выход за пределы.
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции - Документация по MQL5
 
MetaDriver:
Или по вашему контроль должен быть только в момент креша? :)  

Вообще-то никто не говорил про дополнительный "контроль" при выполнении программы.

В данном конкретном случае (и об этом уже говорилось в пояснении, которые было понятно всем) выход индекса за пределы массива приводит к "крэшу". Правильно? Почему бы после того, как терминал обнаружил, что программа дальше уже выполняться не может, - почему именно после этого момента терминал не может определить размер проблемного одномерного массива и отослать на печать это значение? Грубо говоря,

if (выход за пределы массива) 
Print(ArraySize(problem_array));
return("Crash")
И не надо на каждом шаге выполнения программы определять размеры всех имеющихся массивов.
 
mql5:
Каждый индекс контролируется по отдельности, а вот сообщение об ошибке используется одно, мы это изменим. В сообщении об ошибке будет указываться положение открывающей "[" того индекса, в котором произошёл выход за пределы.
Математик, поздравляю :) Не всё понятно с "положением открывающей скобки", но это по ходу выяснится.
 
Yedelkin:

Вообще-то никто не говорил про дополнительный "контроль" при выполнении программы.

1.  В данном конкретном случае (и об этом уже говорилось в пояснении, которые было понятно всем) выход индекса за пределы массива приводит к "крэшу". Правильно? Почему бы после того, как терминал обнаружил, что программа дальше уже выполняться не может, - почему именно после этого момента терминал не может определить размер проблемного одномерного массива и отослать на печать это значение? Грубо говоря,

2.  И не надо на каждом шаге выполнения программы определять размеры всех имеющихся массивов.

И как по твоему возможно первое без второго?

Пример кода, плиз, раз такой вумный. :)  А конкретнее, впиши-ка реальное выражение вместо подчёркнутого "волшебного":

if (выход за пределы массива) 
Print(ArraySize(problem_array));
return("Crash")
 
На данный момент всё происходит так:

Имеем массив A[N0][N1][N2][N3]

в коде x=A[i][j][k][l]

if(i>=N0) goto Error;
offset=i*N1*N2*N3;
if(j>=N1) goto Error;
offset+=j*N2*N3;
if(k>=N2) goto Error;
offset+=k*N3;
if(l>=N2) goto Error;
offset+=l;
x=A[offset];

Error:
   halt("Array out of range " + <place of access>)

 
mql5:
На данный момент всё происходит так:
Вот именно.  И я бы предпочёл, чтоб данный сервис отключался директивами компилятора, когда программа уже отлажена и оттестирована.  Ибо на каждое обращение по индексу стопка проверок - это оченЪ дорого.
 
MetaDriver:

Пример кода, плиз, раз такой вумный. :) 

Почему сразу "вумный"? Меня просят ответить на один вопрос, ...второй. - Я по мере возможности стараюсь донести мысль. А не задаю непрерывно встречные вопросы, уходя от ответа.

Поэтому: если нет желания чётко ответить на ранее поставленные вопросы - то беседа "ни о чём".

Что касается "впиши-ка реальное выражение вместо подчёркнутого "волшебного"" - я не знаю, как там оно всё происходит внутри.  С помощью своего "грубого" кода я мысль донёс? - Донёс. Поэтому ожидаются либо объяснения, почему эта мысль не правильна, либо завершаем. Постоянно натыкаться на встречные вопросы - нет интереса.

 
Yedelkin:

Почему сразу "вумный"? Меня просят ответить на один вопрос, ...второй. - Я по мере возможности стараюсь донести мысль. А не задаю непрерывно встречные вопросы, уходя от ответа.

Поэтому: если нет желания чётко ответить на ранее поставленные вопросы - то беседа "ни о чём".

Что касается "впиши-ка реальное выражение вместо подчёркнутого "волшебного"" - я не знаю, как там оно всё происходит внутри.  С помощью своего "грубого" кода я мысль донёс? - Донёс. Поэтому ожидаются либо объяснения, почему эта мысль не правильна, либо завершаем. Постоянно натыкаться на встречные вопросы - нет интереса.

Ну посмотри на код который Ильяс прислал.  Нравится? (в смысле быстродействия?)

Всегда умиляет на наших mql45 форумах обилие противоречивых требований:

с одной стороны "почему мало скрытых проверок на проргамерские ошибки?" (ну конечно не в такой прямолинейной форме, а вполне по детски: "что за хрень в моей программе!!???  казнить метаквотов за неспособность внятно наставить меня на путь истинный!!!!"),

а с другой стороны: "почему так медленно, вот на С++ работает в ннннадцать раз быстрей, казнить метаквотов за неспособность написать быстрый компилятор!!!"

;)

--

На самом деле есть вариант удовлетворения и тех и других:  директивы компилятора управляющие включением/отключением проверок различных типов ошибок.   Но на это во первых

требуются большие и серьёзные "мета"усилия метаквотов, а во вторых

толпа "настоящих простых трейдеров" будет неустанно вопить:  "нахрена нам этот навороченный до полных непоняток язык???!!  лучче верните локи, хелп встроенный в редактор и уберите наконец эти ваши классы с глаз подальше - они нас, настоящих трейдеров, только пугают и запутывают!"

 
MetaDriver:
OK.
Причина обращения: